#ifndef ConvertTflite_hpp #define ConvertTflite_hpp #include #include #include #include "MNN_generated.h" #include "../../../tools/converter/source/tflite/schema/schema_generated.h" namespace MNN { class NeuropilotBackend; class ConvertTflite { public: ConvertTflite(); ~ ConvertTflite(); struct Command { std::vector inputs; std::vector outputs; std::unique_ptr op; }; struct CommandBuffer { std::vector commands; const Op* op; std::vector> extraConst; }; CommandBuffer convert(const Op* op, const std::vector& inputs, const std::vector& outputs); class Convert { public: Convert() = default; virtual ~Convert() = default; virtual CommandBuffer onExecute(const Op* op, const std::vector& inputs, const std::vector& outputs, ConvertTflite* root) = 0; }; static tflite::TensorType getType(const Tensor* tensor); static std::vector getShapeOfTensor(const Tensor* tensor); Tensor* makeReshape(CommandBuffer& res, Tensor* tensor, std::vector shape, Tensor* outputUser = nullptr); Tensor* makeTranspose(CommandBuffer& res, Tensor* tensor, std::vector dims); Tensor* makeTile(CommandBuffer& res, Tensor* tensor, std::vector dims); Tensor* makeBinary(CommandBuffer& res, Tensor* A, Tensor* B, tflite::BuiltinOperator operation); Tensor* makeSoftmax(CommandBuffer& res, Tensor* tensor); Tensor* makeConcat(CommandBuffer& res, std::vector inputs, int axis); void makeMatMul(CommandBuffer& res, Tensor* A, Tensor* B, bool adjA, bool adB, Tensor* dst); Tensor* makeSlice(CommandBuffer& res, Tensor* input, int sta, int size, int axis); std::vector> releaseCodes() { mOperatorCodeIndexMap.clear(); return std::move(mOperatorCodes); } int getOpIndex(tflite::BuiltinOperator op); int getCustomOpIndex(std::string name); static std::shared_ptr getIntArrayTensor(std::vector shapes); NeuropilotBackend* pBackend = nullptr; private: std::map mOperatorCodeIndexMap; std::map mCustomOpIndex; std::vector> mOperatorCodes; std::map> mConverters; }; } #endif