Imported Upstream version 1.4.0
[platform/core/ml/nnfw.git] / compiler / mir-onnx-importer / Op / Constant.cpp
1 /*
2  * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *    http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include "Constant.h"
18
19 #include "ONNXHelpers.h"
20 #include "AttributeHelpers.h"
21
22 #include "mir/TensorVariant.h"
23 #include "mir/ops/ConstantOp.h"
24
25 namespace mir_onnx
26 {
27
28 void convertConstantV1(const onnx::NodeProto &onnx_node, ConverterContext *context)
29 {
30   std::vector<mir::Operation::Output *> inputs = context->getNodeInputs(onnx_node);
31   mir::Graph *graph = context->getGraph();
32
33   const auto onnx_tensor = getAttributeValue<onnx::TensorProto>(onnx_node, "value");
34   auto mir_tensor = createTensor(&onnx_tensor);
35
36   auto result = graph->create<mir::ops::ConstantOp>(mir_tensor)->getOutput(0);
37
38   context->setNodeOutputs(onnx_node, {result});
39 }
40
41 void convertConstantV9(const onnx::NodeProto &onnx_node, ConverterContext *context)
42 {
43   // Since version 9 Constant operation support other types contained in tensor
44   convertConstantV1(onnx_node, context);
45 }
46
47 void convertConstantV11(const onnx::NodeProto &onnx_node, ConverterContext *context)
48 {
49   const auto *value_attr = findAttribute(onnx_node, "value");
50   const auto *sparse_value_attr = findAttribute(onnx_node, "sparse_value");
51   if (value_attr == nullptr && sparse_value_attr == nullptr)
52     throw std::runtime_error("Not enough attributes in Constant operation!");
53
54   if (value_attr != nullptr)
55     return convertConstantV9(onnx_node, context);
56
57   if (sparse_value_attr != nullptr)
58     throw std::runtime_error("Not supported sparse_tensor in Constant operation!");
59 }
60
61 } // namespace mir_onnx