[moco/ONNX] Introduce opset_version variable (#3550)
author남궁석/On-Device Lab(SR)/Engineer/삼성전자 <sk.namkoong@samsung.com>
Tue, 21 May 2019 05:56:30 +0000 (14:56 +0900)
committer박종현/On-Device Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Tue, 21 May 2019 05:56:30 +0000 (14:56 +0900)
* [moco/ONNX] Introduce opset_version variable

This commit will introduce opset_version variable which will be used to divide operations
according to proper opset version

Signed-off-by: Seok NamKoong <sk.namkoong@samsung.com>
* apply comments

contrib/moco/lib/frontend/onnx/src/Frontend.cpp

index 43847c6..cb8cc95 100644 (file)
@@ -71,6 +71,16 @@ void load_onnx(const std::string &path, moco::onnx::Frontend::FileType type,
   }
 }
 
+/**
+ * @brief If domain is empty string or onnx.ai, it is default domain
+ * @param [in] domain The name of domain
+ * @return Whether it is default domain or not
+ */
+bool is_default_domain(const std::string domain)
+{
+  return (domain.compare("") == 0 || domain.compare("onnx.ai") == 0);
+}
+
 void convert_graph(::onnx::ModelProto &onnx_model_proto, loco::Graph *graph)
 {
   auto nodes = stdex::make_unique<moco::onnx::SymbolTable>();
@@ -87,6 +97,28 @@ void convert_graph(::onnx::ModelProto &onnx_model_proto, loco::Graph *graph)
   assert(onnx_model_proto.has_graph());
   ::onnx::GraphProto onnx_graph_proto = onnx_model_proto.graph();
 
+  /// All nodes in the ModelProto's graph will bind against the operator
+  /// with the same-domain/same-op_type operator with the HIGHEST version
+  /// in the referenced operator sets.
+  assert(onnx_model_proto.opset_import_size() > 0);
+  int64_t opset_version = 1;
+  for (int i = 0; i < onnx_model_proto.opset_import_size(); ++i)
+  {
+    auto opset = onnx_model_proto.opset_import(i);
+
+    if (!opset.has_domain() || is_default_domain(opset.domain()))
+    {
+      if (opset.version() > opset_version)
+      {
+        opset_version = opset.version();
+      }
+    }
+    else
+    {
+      throw std::runtime_error("Not supported for custom operation");
+    }
+  }
+
   // 1. Convert all the nodes to loco::Node
   for (const auto &n : onnx_graph_proto.node())
   {