[enco] frontend/caffe: separate Input (#2541)
author박세희/동작제어Lab(SR)/Principal Engineer/삼성전자 <saehie.park@samsung.com>
Fri, 7 Dec 2018 01:18:53 +0000 (10:18 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Fri, 7 Dec 2018 01:18:53 +0000 (10:18 +0900)
This will move Input layer handler to separate file.
And changes for related with registry updates.

Signed-off-by: SaeHie Park <saehie.park@samsung.com>
contrib/enco/frontend/caffe/CMakeLists.txt
contrib/enco/frontend/caffe/src/Frontend.cpp
contrib/enco/frontend/caffe/src/GraphBuilderRegistry.cpp
contrib/enco/frontend/caffe/src/Op/Input.cpp [new file with mode: 0644]
contrib/enco/frontend/caffe/src/Op/Input.h [new file with mode: 0644]

index 4de5445..e50cdb4 100644 (file)
@@ -17,6 +17,7 @@ target_link_libraries(enco_caffe_frontend enco_intf_cmdline)
 target_link_libraries(enco_caffe_frontend nncc_foundation)
 target_link_libraries(enco_caffe_frontend morph)
 target_link_libraries(enco_caffe_frontend caffeproto)
+target_link_libraries(enco_caffe_frontend stdex)
 
 nncc_find_package(GTest QUIET)
 
index d6532d2..fd94aea 100644 (file)
@@ -131,29 +131,6 @@ enco::Bundle Frontend::load(void) const
       graph_builder->build(layer, &opbuilder_context);
     }
     // TODO move type handlers to separate builder
-    else if (layer.type() == "Input")
-    {
-      assert(layer.has_input_param());
-      const auto &param = layer.input_param();
-
-      for (uint32_t n = 0; n < layer.top_size(); ++n)
-      {
-        const auto &name = layer.top(n);
-        const auto shape = caffeimport::as_tensor_shape(param.shape(n));
-
-        auto bag = module->entity()->bag()->create(num_elements(shape));
-        auto input = module->entity()->input()->create(shape);
-
-        input->bag(bag);
-        input->name(name);
-        input->reorder<LexicalLayout>();
-
-        module->input()->insert(input);
-
-        bag_ctx[name] = bag;
-        shape_ctx[name] = shape;
-      }
-    }
     else if (layer.type() == "Convolution")
     {
       assert(layer.bottom().size() == 1);
index 094896d..e8e31ff 100644 (file)
 
 #include "GraphBuilderRegistry.h"
 
+#include "Op/Input.h"
+
+#include <stdex/Memory.h>
+
+using stdex::make_unique;
+
 namespace caffeimport
 {
 
 GraphBuilderRegistry::GraphBuilderRegistry()
 {
   // TODO add GraphBuilder for each caffe layer.
+  _builder_map["Input"] = make_unique<InputBuilder>();
 }
 
 } // namespace caffeimport
diff --git a/contrib/enco/frontend/caffe/src/Op/Input.cpp b/contrib/enco/frontend/caffe/src/Op/Input.cpp
new file mode 100644 (file)
index 0000000..39e44fa
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2018 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 "Input.h"
+#include "Convert.h"
+
+#include <nncc/core/ADT/tensor/LexicalLayout.h>
+
+#include <cassert>
+
+using namespace nncc::core::ADT;
+
+using tensor::num_elements;
+using tensor::LexicalLayout;
+
+namespace caffeimport
+{
+
+void InputBuilder::build(const ::caffe::LayerParameter &layer, GraphBuilderContext *context) const
+{
+  coco::Module *module = context->module();
+  std::map<std::string, tensor::Shape> &shape_ctx = context->shape_ctx();
+  std::map<std::string, coco::Bag *> &bag_ctx = context->bag_ctx();
+
+  assert(layer.has_input_param());
+  const auto &param = layer.input_param();
+
+  for (uint32_t n = 0; n < layer.top_size(); ++n)
+  {
+    const auto &name = layer.top(n);
+    const auto shape = as_tensor_shape(param.shape(n));
+
+    auto bag = module->entity()->bag()->create(num_elements(shape));
+    auto input = module->entity()->input()->create(shape);
+
+    input->bag(bag);
+    input->name(name);
+    input->reorder<LexicalLayout>();
+
+    module->input()->insert(input);
+
+    bag_ctx[name] = bag;
+    shape_ctx[name] = shape;
+  }
+}
+
+} // namespace caffeimport
diff --git a/contrib/enco/frontend/caffe/src/Op/Input.h b/contrib/enco/frontend/caffe/src/Op/Input.h
new file mode 100644 (file)
index 0000000..a50d6c6
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2018 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 __INPUT_GRAPH_BUILDER_H__
+#define __INPUT_GRAPH_BUILDER_H__
+
+#include "GraphBuilder.h"
+
+#include "Context.h"
+
+namespace caffeimport
+{
+
+class InputBuilder final : public GraphBuilder
+{
+public:
+  void build(const ::caffe::LayerParameter &layer, GraphBuilderContext *context) const override;
+};
+
+} // namespace caffeimport
+
+#endif // __INPUT_GRAPH_BUILDER_H__