// // PipelineModule.hpp // MNN // // Created by MNN on 2020/01/09. // Copyright © 2018, Alibaba Group Holding Limited // #ifndef PipelineModule_hpp #define PipelineModule_hpp #include #include #include "core/AutoStorage.h" #include "utils/InitNet.hpp" namespace MNN { struct Net; } namespace MNN { namespace Express { #define PIPELINE_MODULE "_pipeline_module__" class ExprModule : public Module { public: ExprModule(EXPRP expr); virtual std::vector onForward(const std::vector& inputs) override; const std::vector& inputIndexes() const { return mInputIndexes; } const EXPRP getExpr() { return mExpr; } private: Module* clone(CloneContext* ctx) const override; EXPRP mExpr; std::vector mInputs; std::vector mInputIndexes; }; class PipelineModule : public Module { public: typedef std::function, std::shared_ptr>(Express::EXPRP)> Transformer; MNN_PUBLIC static Module* load(const std::vector& inputs, const std::vector& outputs, const uint8_t* buffer, size_t length, std::shared_ptr rtMgr, const Module::Config* config = nullptr); virtual std::vector onForward(const std::vector& inputs) override; virtual void onClearCache() override; MNN_PUBLIC std::vector countOutputReference(std::vector outputIndices); MNN_PUBLIC PipelineModule(std::vector inputs, std::vector outputs, const Transformer& transformFunction = {}); int onOptimize(Interpreter::SessionMode stage) override; private: static Module* load(const std::vector& inputs, const std::vector& outputs, std::shared_ptr bufferStorage, const std::shared_ptr rtMgr, const Module::Config* config, std::map& subGraphMap); static void _createSubGraph(const MNN::Net* net, std::shared_ptr rtMgr, const Module::Config* config, std::map& subGraphMap); PipelineModule(){} Module* clone(CloneContext* ctx) const override; std::vector, std::vector, std::vector>> mSubModules; int mStackSize = 0; int mInputSize = 0; std::vector mOutputIndex; friend class NN; std::vector mInitVars; std::shared_ptr mSharedConst; bool mSeperate = false; }; } // namespace Express } // namespace MNN #endif