Files
alibaba--mnn/tools/converter/source/optimizer/tfextra/TFIsFinite.cpp
T
2026-07-13 13:33:03 +08:00

53 lines
1.7 KiB
C++

//
// TFIsFinite.cpp
// MNNConverter
//
// Created by MNN on 2020/05/13.
// Copyright © 2018, Alibaba Group Holding Limited
//
#include "MNN_generated.h"
#include "TFExtraManager.hpp"
namespace MNN {
namespace Express {
class IsFiniteTransform : public TFExtraManager::Transform {
public:
virtual EXPRP onExecute(EXPRP expr) const override {
MNN_THROW_CHECK(expr->inputs().size() == 1, "Tf IsFinite needs one inputs.");
auto attrs = expr->get()->main_as_Extra()->attr();
auto it =
std::find_if(attrs->begin(), attrs->end(), [](const Attribute* attr) { return attr->key()->str() == "T"; });
MNN_ASSERT(it != attrs->end());
// IsFinit only support float data type, such as float16, bfloat16,
// float32 and float64.
MNN_ASSERT(it->type() == DataType_DT_FLOAT);
auto input = expr->inputs()[0];
auto op = expr->get();
std::unique_ptr<MNN::OpT> lessOp(new OpT);
lessOp->type = OpType_BinaryOp;
lessOp->name = op->name()->str();
lessOp->main.type = OpParameter_BinaryOp;
lessOp->main.value = new BinaryOpT;
auto* param = lessOp->main.AsBinaryOp();
param->opType = MNN::BinaryOpOperation_LESS;
param->T = DataType_DT_FLOAT;
auto finite = _Scalar(std::numeric_limits<float>::max() - 0.1f);
finite->setName(lessOp->name + "_const_finite");
return Expr::create(lessOp.get(), {input, finite}, 1);
}
};
static auto gRegister = []() {
TFExtraManager::get()->insert("IsFinite", std::shared_ptr<TFExtraManager::Transform>(new IsFiniteTransform));
return true;
}();
} // namespace Express
} // namespace MNN