[neurun] Create AddNode with OperationFactory (#4441)
author이한종/On-Device Lab(SR)/Engineer/삼성전자 <hanjoung.lee@samsung.com>
Tue, 19 Feb 2019 23:58:41 +0000 (08:58 +0900)
committer박세희/On-Device Lab(SR)/Principal Engineer/삼성전자 <saehie.park@samsung.com>
Tue, 19 Feb 2019 23:58:41 +0000 (08:58 +0900)
Move AddNode creation from `ANeuralNetworksModel_addOperation` to
`OperationFactory`.

Signed-off-by: Hanjoung Lee <hanjoung.lee@samsung.com>
runtimes/neurun/src/frontend/wrapper/OperationFactory.cc
runtimes/neurun/src/frontend/wrapper/model.cc
runtimes/neurun/src/model/operation/AddNode.cc
runtimes/neurun/src/model/operation/AddNode.h

index 2edc1fc..1d80122 100644 (file)
@@ -16,7 +16,7 @@
 
 #include "OperationFactory.h"
 
-#include "model/operation/Conv2DNode.h"
+#include "model/operation/Node.Include.h"
 
 OperationFactory &OperationFactory::instance()
 {
@@ -26,8 +26,9 @@ OperationFactory &OperationFactory::instance()
 
 OperationFactory::OperationFactory()
 {
+  using namespace neurun::model;
+
   _map[ANEURALNETWORKS_CONV_2D] = [](const OperationFactory::Param &init_param) {
-    using namespace neurun::model;
     using neurun::model::operation::Conv2DNode;
 
     // inputCount is either 7 or 10 acccording to NN API specification.
@@ -88,6 +89,25 @@ OperationFactory::OperationFactory()
 
     return new Conv2DNode{inputs, outputs, param};
   };
+
+  _map[ANEURALNETWORKS_ADD] = [](const OperationFactory::Param &init_param) {
+    assert(init_param.input_count == 3);
+    assert(init_param.output_count == 1);
+
+    // Each input should be interpreted as follows:
+    //
+    //  0 -> Lefthand side operand
+    //  1 -> Righthand side operand
+
+    operand::IndexSet inputs{init_param.inputs[0], init_param.inputs[1]};
+    operand::IndexSet outputs{init_param.outputs[0]};
+
+    operation::AddNode::Param param;
+
+    param.activation_index = operand::Index{init_param.inputs[2]};
+
+    return new operation::AddNode{inputs, outputs, param};
+  };
 }
 
 neurun::model::operation::Node *OperationFactory::create(ANeuralNetworksOperationType type,
index 6be9748..44172c4 100644 (file)
@@ -115,16 +115,6 @@ bool ANeuralNetworksModel::addOperation(ANeuralNetworksOperationType type, uint3
     switch (type)
     {
       case ANEURALNETWORKS_ADD:
-      {
-        assert(inputCount == 3);
-        assert(outputCount == 1);
-
-        using GraphNode = neurun::model::operation::AddNode;
-
-        _model->addOperation(nnfw::cpp14::make_unique<GraphNode>(node_param));
-
-        break;
-      }
       case ANEURALNETWORKS_CONV_2D:
       {
         auto node = factory.create(type, param);
index 9a7e798..7de82df 100644 (file)
@@ -29,21 +29,10 @@ namespace operation
 
 void AddNode::accept(NodeVisitor &&v) const { v.visit(*this); }
 
-AddNode::AddNode(const model::operation::Node::InitParam &init_param)
-    : model::operation::Node{OperandConstraint::createExact(2u)}
+AddNode::AddNode(const operand::IndexSet &inputs, const operand::IndexSet &outputs,
+                 const Param &param)
+    : model::operation::Node{OperandConstraint::createExact(2u), inputs, outputs}, _param{param}
 {
-  assert(init_param.input_count == 3);
-  assert(init_param.output_count == 1);
-
-  // Each input should be interpreted as follows:
-  //
-  //  0 -> Lefthand side operand
-  //  1 -> Righthand side operand
-
-  setInputs({init_param.inputs[0], init_param.inputs[1]});
-  setOutputs({init_param.outputs[0]});
-
-  _param.activation_index = operand::Index{init_param.inputs[2]};
 }
 
 } // namespace operation
index e205806..533f8ff 100644 (file)
@@ -29,8 +29,6 @@ namespace operation
 class AddNode : public model::operation::Node
 {
 public:
-  AddNode(const model::operation::Node::InitParam &init_param);
-
   enum Input
   {
     LHS = 0,
@@ -43,6 +41,9 @@ public:
   };
 
 public:
+  AddNode(const operand::IndexSet &inputs, const operand::IndexSet &outputs, const Param &param);
+
+public:
   virtual void accept(NodeVisitor &&) const override;
   virtual std::string getName() const override { return "Add"; }