1 //
2 //  TFClip.cpp
3 //  MNNConverter
4 //
5 //  Created by MNN on 2020/07/09.
6 //  Copyright © 2018, Alibaba Group Holding Limited
7 //
8 
9 #include "MNN_generated.h"
10 #include "TFExtraManager.hpp"
11 
12 namespace MNN {
13 namespace Express {
14 class ClipTransform : public TFExtraManager::Transform {
15 public:
onExecute(EXPRP expr) const16     virtual EXPRP onExecute(EXPRP expr) const override {
17         auto inputs = expr->inputs();
18         if (inputs.size() != 3) {
19             MNN_ERROR("ClipByValue should has 3 inputs\n");
20             return nullptr;
21         }
22         float minValue = 0.0f;
23         float maxValue = 0.0f;
24         {
25             auto minInfo = inputs[1]->getInfo();
26             auto maxInfo = inputs[2]->getInfo();
27             auto minP    = inputs[1]->readMap<float>();
28             auto maxP    = inputs[2]->readMap<float>();
29             if (nullptr == minP || nullptr == maxP || 1 != minInfo->size || 1 != maxInfo->size) {
30                 // Not const clip op, use max(min) instead
31                 auto sameVar = _Minimum(_Maximum(inputs[0], inputs[1]), inputs[2]);
32                 sameVar->setName(expr->name());
33                 return sameVar->expr().first;
34             }
35             minValue = *minP;
36             maxValue = *maxP;
37         }
38         std::vector<VARP> subInputs = {inputs[0]};
39         std::unique_ptr<MNN::OpT> clipOp(new OpT);
40         clipOp->type       = OpType_ReLU6;
41         clipOp->main.type  = OpParameter_Relu6;
42         clipOp->main.value = new Relu6T;
43         auto param         = clipOp->main.AsRelu6();
44         {
45             param->maxValue = maxValue;
46             param->minValue = minValue;
47         }
48         auto newExpr = Expr::create(clipOp.get(), subInputs, 1);
49         newExpr->setName(expr->name());
50         return newExpr;
51     }
52 };
__anonc63f682a0102() 53 static auto gRegister = []() {
54     TFExtraManager::get()->insert("ClipByValue", std::shared_ptr<TFExtraManager::Transform>(new ClipTransform));
55     return true;
56 }();
57 } // namespace Express
58 } // namespace MNN
59