megenginelite-sys 1.8.2

A safe megenginelite wrapper in Rust
Documentation
/**
 * \file dnn/src/common/algo_base.cpp
 * MegEngine is Licensed under the Apache License, Version 2.0 (the "License")
 *
 * Copyright (c) 2014-2021 Megvii Inc. All rights reserved.
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or
 * implied.
 */

#include "src/common/algo_base.h"
#include "src/common/utils.h"

using namespace megdnn;

#define FOREACH_ALGO_ATTRIBUTE(cb)                                    \
    cb(DEFAULT) cb(REPRODUCIBLE) cb(NAIVE) cb(USABLE_DEPEND_ON_SHAPE) \
            cb(ACCURACY_DEPEND_ON_BATCH)

namespace {
inline const char* attr_str(const AlgoAttribute& attr) {
#define cb(attr)              \
    case AlgoAttribute::attr: \
        return #attr;
    switch (attr) { FOREACH_ALGO_ATTRIBUTE(cb) }
#undef cb
    return "UNKNOWN";
}
}  // namespace

std::string Algorithm::attribute_str(const Attribute& attr) {
    std::string ret;
    uint32_t attr_val = static_cast<uint32_t>(attr);
    while (attr_val) {
        uint32_t mask = ~(attr_val & (attr_val - 1));
        Attribute sub_attr = static_cast<Attribute>(mask & attr_val);
        if (!ret.empty()) {
            ret.append(" | ");
        }
        ret.append(attr_str(sub_attr));
        attr_val = attr_val & (attr_val - 1);
    }
    if (ret.empty()) {
        ret = "DEFAULT";
    }
    return ret;
}

bool Algorithm::contain_attribute_all(const Attribute& attr) const {
    return attr == static_cast<Attribute>(attribute() & attr);
}

bool Algorithm::contain_attribute_any(const Attribute& attr) const {
    return static_cast<bool>(attribute() & attr);
}

void Algorithm::check_attribute(
        const Attribute& positive_attr, const Attribute& negative_attr) const {
    megdnn_assert(
            contain_attribute_all(positive_attr) &&
                    !contain_attribute_any(negative_attr),
            "require algorithm with attribute(%s) and without "
            "attribute(%s), but get"
            "algorithm(%s) with attribute(%s) ",
            Algorithm::attribute_str(positive_attr).c_str(),
            Algorithm::attribute_str(negative_attr).c_str(), name(),
            Algorithm::attribute_str(attribute()).c_str());
}

// vim: syntax=cpp.doxygen