From 84990fb7fde4d53844c7416b8679c22c281432c4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=91=D0=B0=D1=80?= =?utf8?q?=D0=B0=D0=BD=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2/AI=20Tools=20Lab=20/S?= =?utf8?q?RR/Engineer/=EC=82=BC=EC=84=B1=EC=A0=84=EC=9E=90?= Date: Wed, 18 Sep 2019 16:36:50 +0300 Subject: [PATCH] [mir_onnx] Support Reciprocal operator (#7598) Add support for `Reciprocal` operator. Signed-off-by: Sergei Barannikov --- compiler/mir-onnx-importer/CMakeLists.txt | 2 ++ compiler/mir-onnx-importer/ONNXOpRegistration.h | 2 ++ compiler/mir-onnx-importer/Op/Reciprocal.cpp | 44 +++++++++++++++++++++++++ compiler/mir-onnx-importer/Op/Reciprocal.h | 33 +++++++++++++++++++ 4 files changed, 81 insertions(+) create mode 100644 compiler/mir-onnx-importer/Op/Reciprocal.cpp create mode 100644 compiler/mir-onnx-importer/Op/Reciprocal.h diff --git a/compiler/mir-onnx-importer/CMakeLists.txt b/compiler/mir-onnx-importer/CMakeLists.txt index cb9b7fd..e4a299e 100644 --- a/compiler/mir-onnx-importer/CMakeLists.txt +++ b/compiler/mir-onnx-importer/CMakeLists.txt @@ -63,6 +63,8 @@ set(MIR_ONNX_IMPORTER_SOURCES Op/Mul.h Op/Pad.cpp Op/Pad.h + Op/Reciprocal.cpp + Op/Reciprocal.h Op/ReduceMean.cpp Op/ReduceMean.h Op/Relu.cpp diff --git a/compiler/mir-onnx-importer/ONNXOpRegistration.h b/compiler/mir-onnx-importer/ONNXOpRegistration.h index 19922b5..e05c874 100644 --- a/compiler/mir-onnx-importer/ONNXOpRegistration.h +++ b/compiler/mir-onnx-importer/ONNXOpRegistration.h @@ -36,6 +36,7 @@ #include "Op/MaxPool.h" #include "Op/Mul.h" #include "Op/Pad.h" +#include "Op/Reciprocal.h" #include "Op/ReduceMean.h" #include "Op/Relu.h" #include "Op/Reshape.h" @@ -73,6 +74,7 @@ inline void registerSupportedOps() registry.registerConverter("MaxPool", stdex::make_unique()); registry.registerConverter("Mul", stdex::make_unique()); registry.registerConverter("Pad", stdex::make_unique()); + registry.registerConverter("Reciprocal", stdex::make_unique()); registry.registerConverter("ReduceMean", stdex::make_unique()); registry.registerConverter("Relu", stdex::make_unique()); registry.registerConverter("Reshape", stdex::make_unique()); diff --git a/compiler/mir-onnx-importer/Op/Reciprocal.cpp b/compiler/mir-onnx-importer/Op/Reciprocal.cpp new file mode 100644 index 0000000..5af3156 --- /dev/null +++ b/compiler/mir-onnx-importer/Op/Reciprocal.cpp @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Reciprocal.h" + +#include "ONNXHelpers.h" + +#include "mir/ops/ConstantOp.h" +#include "mir/ops/DivOp.h" + +namespace mir_onnx +{ + +void ReciprocalNodeConverter::convert(const onnx::NodeProto &onnx_node, + ConverterContext *context) const +{ + std::vector inputs = context->getNodeInputs(onnx_node); + mir::Graph *graph = context->getGraph(); + + assert(inputs.size() == 1); + auto input = inputs[0]; + + const float one_value = 1.0f; + mir::TensorVariant one_tensor(mir::DataType::FLOAT32, mir::Shape{1}, &one_value); + auto one = createOp(graph, one_tensor)->getOutput(0); + auto result = createOp(graph, input, one)->getOutput(0); + + context->setNodeOutputs(onnx_node, {result}); +} + +} // namespace mir_onnx diff --git a/compiler/mir-onnx-importer/Op/Reciprocal.h b/compiler/mir-onnx-importer/Op/Reciprocal.h new file mode 100644 index 0000000..46c935f --- /dev/null +++ b/compiler/mir-onnx-importer/Op/Reciprocal.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MIR_ONNX_OP_RECIPROCAL_H +#define MIR_ONNX_OP_RECIPROCAL_H + +#include "ONNXNodeConverterRegistry.h" + +namespace mir_onnx +{ + +class ReciprocalNodeConverter : public NodeConverter +{ +public: + void convert(const onnx::NodeProto &onnx_node, ConverterContext *context) const override; +}; + +} // namespace mir_onnx + +#endif // MIR_ONNX_OP_RECIPROCAL_H -- 2.7.4