// // OpGrad.hpp // MNN // // Created by MNN on 2019/05/05. // Copyright © 2018, Alibaba Group Holding Limited // #ifndef OpGrad_hpp #define OpGrad_hpp #include #include #include #include #include #include "MNN_generated.h" namespace MNN { class MNN_PUBLIC OpGrad { public: enum Type { LINEAR, SEMI_LINEAR, NO_LINEAR }; OpGrad() = default; virtual ~OpGrad() = default; Type type() const { return mType; } static void init(); static Express::VARP divideAvoidZero(MNN::Express::VARP y, MNN::Express::VARP x); virtual std::vector onGrad(Express::EXPRP expr, const std::vector& backwardOutput) = 0; static OpGrad* get(int type); static void insert(int type, OpGrad* creator); static std::pair, std::vector> gradCommon(std::vector outputs, std::vector outputDiff, std::vector parameters); static std::vector gradLinear(Express::VARP loss, const std::vector& parameters, const std::vector& outputDiff, const std::vector blockExpr = {}); static std::map gradCommon(std::vector outputs, const std::set& parameters, std::map>& backwardMap, const std::vector blockExpr = {}); static std::map grad(Express::VARP loss, const std::set& parameters, const std::vector blockExpr = {}); protected: Type mType = LINEAR; }; #define REGISTER_GRAD(f, c) \ extern void ___##f##__##c##__() { \ c(); \ } } // namespace MNN #endif