Files
2026-07-13 13:33:03 +08:00

70 lines
2.3 KiB
C++

//
// TFConcatMerge.cpp
// MNNConverter
//
// Created by MNN on 2019/09/16.
// Copyright © 2018, Alibaba Group Holding Limited
//
#include "MNN_generated.h"
#include "TFExtraManager.hpp"
namespace MNN {
namespace Express {
class ConcatTransform : public TFExtraManager::Transform {
public:
virtual EXPRP onExecute(EXPRP expr) const override {
auto op = expr->get();
MNN_ASSERT(op->type() == OpType_Extra);
auto type = op->main_as_Extra()->type()->str();
auto inputs = expr->inputs();
MNN_ASSERT(inputs.size() > 1);
auto axisNode = inputs[0];
std::vector<VARP> subInputs;
if (type == "ConcatV2") {
axisNode = inputs[inputs.size() - 1];
for (int i = 0; i < inputs.size() - 1; ++i) {
subInputs.emplace_back(inputs[i]);
}
} else if (type == "Concat") {
for (int i = 0; i < inputs.size() - 1; ++i) {
subInputs.emplace_back(inputs[i]);
}
} else {
for (int i = 0; i < inputs.size(); ++i) {
subInputs.emplace_back(inputs[i]);
}
}
const int* axisPtr = nullptr;
if (type != "ParallelConcat") {
axisPtr = axisNode->readMap<int32_t>();
if (nullptr == axisPtr) {
MNN_ERROR("Don't Support Axis not const for concat\n");
return nullptr;
}
}
std::unique_ptr<OpT> newOp(new OpT);
newOp->name = op->name()->str();
newOp->type = OpType_Concat;
newOp->main.type = OpParameter_Axis;
newOp->main.value = new AxisT;
if (type == "ParallelConcat") {
newOp->main.AsAxis()->axis = 0;
} else {
newOp->main.AsAxis()->axis = axisPtr[0];
}
auto newExpr = Expr::create(newOp.get(), subInputs, 1);
return newExpr;
}
};
static auto gRegister = []() {
TFExtraManager::get()->insert("ConcatV2", std::shared_ptr<TFExtraManager::Transform>(new ConcatTransform));
TFExtraManager::get()->insert("Concat", std::shared_ptr<TFExtraManager::Transform>(new ConcatTransform));
TFExtraManager::get()->insert("ParallelConcat", std::shared_ptr<TFExtraManager::Transform>(new ConcatTransform));
return true;
}();
} // namespace Express
} // namespace MNN