[neurun] Merge graph node classes (#2497)
author이한종/동작제어Lab(SR)/Engineer/삼성전자 <hanjoung.lee@samsung.com>
Wed, 29 Aug 2018 01:45:03 +0000 (10:45 +0900)
committer오형석/동작제어Lab(SR)/Staff Engineer/삼성전자 <hseok82.oh@samsung.com>
Wed, 29 Aug 2018 01:45:03 +0000 (10:45 +0900)
Merge Old Node into New Node.

Old Node : `internal::tflite::op::Node`
New Node : `neurun::graph::operation::Node`

- struct `Param` for each Node holds non-tensor parameters only
- Tensor parameters are stored in `_inputs` and `_outputs`
- Provide a default implementation of get/setters for inputs and
  outputs of `Node`
- `NodeVisitors` are now for New Node, not Old Node
- class `Linear` now holds New Node rather than Old Node

This commit completes the draft commit #2479, with #2483 and #2486
which were already merged.

Resolve #2404

Signed-off-by: Hanjoung Lee <hanjoung.lee@samsung.com>
43 files changed:
runtimes/neurun/src/backend/IInitializerGenerator.h
runtimes/neurun/src/backend/IStageGenerator.h
runtimes/neurun/src/backend/acl_cl/InitializerGenerator.cc
runtimes/neurun/src/backend/acl_cl/InitializerGenerator.h
runtimes/neurun/src/backend/acl_cl/StageGenerator.cc
runtimes/neurun/src/backend/acl_cl/StageGenerator.h
runtimes/neurun/src/backend/cpu/InitializerGenerator.cc
runtimes/neurun/src/backend/cpu/InitializerGenerator.h
runtimes/neurun/src/backend/cpu/StageGenerator.cc
runtimes/neurun/src/backend/cpu/StageGenerator.h
runtimes/neurun/src/codegen/BackendResolver.h
runtimes/neurun/src/codegen/Planner.cc
runtimes/neurun/src/codegen/Planner.h
runtimes/neurun/src/codegen/TensorMarker.cc
runtimes/neurun/src/codegen/TensorMarker.h
runtimes/neurun/src/compilation.cc
runtimes/neurun/src/frontend/model.cc
runtimes/neurun/src/graph/operand/IndexSet.cc
runtimes/neurun/src/graph/operand/IndexSet.h
runtimes/neurun/src/graph/operation/AvgPool2D.cc
runtimes/neurun/src/graph/operation/AvgPool2D.h
runtimes/neurun/src/graph/operation/Concat.cc
runtimes/neurun/src/graph/operation/Concat.h
runtimes/neurun/src/graph/operation/Conv2D.cc
runtimes/neurun/src/graph/operation/Conv2D.h
runtimes/neurun/src/graph/operation/FullyConnected.cc
runtimes/neurun/src/graph/operation/FullyConnected.h
runtimes/neurun/src/graph/operation/MaxPool2D.cc
runtimes/neurun/src/graph/operation/MaxPool2D.h
runtimes/neurun/src/graph/operation/NOP.cc
runtimes/neurun/src/graph/operation/NOP.h
runtimes/neurun/src/graph/operation/Node.h
runtimes/neurun/src/graph/operation/Reshape.cc
runtimes/neurun/src/graph/operation/Reshape.h
runtimes/neurun/src/graph/operation/Softmax.cc
runtimes/neurun/src/graph/operation/Softmax.h
runtimes/neurun/src/internal/op/Op.lst
runtimes/neurun/src/linear/Linear.cc
runtimes/neurun/src/linear/Linear.h
runtimes/neurun/test/graph/operation/Insert.cc
runtimes/neurun/test/graph/operation/Set.cc
runtimes/neurun/test/graph/operation/SetIO.cc
runtimes/neurun/test/graph/verifier/Verifier.cc

index 7878f77..2b05e08 100644 (file)
@@ -3,8 +3,8 @@
 
 #include "arm_compute/core/ITensor.h"
 
-#include "internal/op/Conv2D.h"
-#include "internal/op/FullyConnected.h"
+#include "graph/operation/Conv2D.h"
+#include "graph/operation/FullyConnected.h"
 
 using Initializer = std::function<void(::arm_compute::ITensor &)>;
 
@@ -17,12 +17,11 @@ struct IInitializerGenerator
 {
   virtual ~IInitializerGenerator() = default;
 
-  virtual Initializer
-  generateWeight(const ::internal::tflite::op::Conv2D::implicit::Node &node) = 0;
-  virtual Initializer generateWeight(const ::internal::tflite::op::FullyConnected::Node &node) = 0;
+  virtual Initializer generateWeight(const graph::operation::Conv2D::Implicit::Node &node) = 0;
+  virtual Initializer generateWeight(const graph::operation::FullyConnected::Node &node) = 0;
 
-  virtual Initializer generateBias(const ::internal::tflite::op::Conv2D::implicit::Node &node) = 0;
-  virtual Initializer generateBias(const ::internal::tflite::op::FullyConnected::Node &node) = 0;
+  virtual Initializer generateBias(const graph::operation::Conv2D::Implicit::Node &node) = 0;
+  virtual Initializer generateBias(const graph::operation::FullyConnected::Node &node) = 0;
 };
 
 } // namespace backend
index bea51d0..587c4f3 100644 (file)
@@ -7,14 +7,14 @@
 #include <arm_compute/runtime/IFunction.h>
 
 #include "backend/ITensorBuilder.h"
-#include "internal/op/Conv2D.h"
-#include "internal/op/MaxPool2D.h"
-#include "internal/op/AvgPool2D.h"
-#include "internal/op/Concat.h"
-#include "internal/op/FullyConnected.h"
-#include "internal/op/Reshape.h"
-#include "internal/op/Softmax.h"
-#include "internal/op/NOP.h"
+#include "graph/operation/Conv2D.h"
+#include "graph/operation/MaxPool2D.h"
+#include "graph/operation/AvgPool2D.h"
+#include "graph/operation/Concat.h"
+#include "graph/operation/FullyConnected.h"
+#include "graph/operation/Reshape.h"
+#include "graph/operation/Softmax.h"
+#include "graph/operation/NOP.h"
 
 struct IExecutionBuilder
 {
@@ -36,14 +36,14 @@ struct IStageGenerator
 
   virtual std::shared_ptr<ITensorBuilder> tensor_builder() = 0;
 
-  virtual Stage generate(const ::internal::tflite::op::Conv2D::implicit::Node &node) = 0;
-  virtual Stage generate(const ::internal::tflite::op::MaxPool2D::implicit::Node &node) = 0;
-  virtual Stage generate(const ::internal::tflite::op::AvgPool2D::implicit::Node &node) = 0;
-  virtual Stage generate(const ::internal::tflite::op::Concat::Node &node) = 0;
-  virtual Stage generate(const ::internal::tflite::op::FullyConnected::Node &node) = 0;
-  virtual Stage generate(const ::internal::tflite::op::Reshape::Node &node) = 0;
-  virtual Stage generate(const ::internal::tflite::op::Softmax::Node &node) = 0;
-  virtual Stage generate(const ::internal::tflite::op::NOP::Node &node) = 0;
+  virtual Stage generate(const graph::operation::Conv2D::Implicit::Node &node) = 0;
+  virtual Stage generate(const graph::operation::MaxPool2D::Implicit::Node &node) = 0;
+  virtual Stage generate(const graph::operation::AvgPool2D::Implicit::Node &node) = 0;
+  virtual Stage generate(const graph::operation::Concat::Node &node) = 0;
+  virtual Stage generate(const graph::operation::FullyConnected::Node &node) = 0;
+  virtual Stage generate(const graph::operation::Reshape::Node &node) = 0;
+  virtual Stage generate(const graph::operation::Softmax::Node &node) = 0;
+  virtual Stage generate(const graph::operation::NOP::Node &node) = 0;
 };
 
 } // namespace backend
index 5e23398..5804827 100644 (file)
@@ -19,9 +19,9 @@ InitializerGenerator::InitializerGenerator(const neurun::graph::operand::Set &ct
 }
 
 Initializer
-InitializerGenerator::generateWeight(const ::internal::tflite::op::Conv2D::implicit::Node &node)
+InitializerGenerator::generateWeight(const graph::operation::Conv2D::Implicit::Node &node)
 {
-  const ::neurun::graph::operand::Index ker_index{node.param().ker_index};
+  const ::neurun::graph::operand::Index ker_index{node.getInputs().at(1)};
 
   const auto ker_shape = _ctx.at(ker_index).shape().asKernel();
   auto ker_base = _ctx.at(ker_index).data().base();
@@ -39,11 +39,10 @@ InitializerGenerator::generateWeight(const ::internal::tflite::op::Conv2D::impli
   };
 }
 
-Initializer
-InitializerGenerator::generateWeight(const ::internal::tflite::op::FullyConnected::Node &node)
+Initializer InitializerGenerator::generateWeight(const graph::operation::FullyConnected::Node &node)
 {
-  const ::neurun::graph::operand::Index weight_index{node.param().weight_index};
-  const ::neurun::graph::operand::Index input_index{node.param().input_index};
+  const ::neurun::graph::operand::Index weight_index{node.getInputs().at(1)};
+  const ::neurun::graph::operand::Index input_index{node.getInputs().at(0)};
 
   const auto num_output = _ctx.at(weight_index).shape().dim(0);
   auto weight_base = _ctx.at(weight_index).data().base();
@@ -78,12 +77,11 @@ InitializerGenerator::generateWeight(const ::internal::tflite::op::FullyConnecte
   };
 }
 
-Initializer
-InitializerGenerator::generateBias(const ::internal::tflite::op::Conv2D::implicit::Node &node)
+Initializer InitializerGenerator::generateBias(const graph::operation::Conv2D::Implicit::Node &node)
 {
   // TODO Refactor so we can reuse the common code
 
-  const ::neurun::graph::operand::Index bias_index{node.param().bias_index};
+  const ::neurun::graph::operand::Index bias_index{node.getInputs().at(2)};
 
   auto bias_base = _ctx.at(bias_index).data().base();
   const auto bias_size = _ctx.at(bias_index).shape().asVector();
@@ -103,10 +101,9 @@ InitializerGenerator::generateBias(const ::internal::tflite::op::Conv2D::implici
   };
 }
 
-Initializer
-InitializerGenerator::generateBias(const ::internal::tflite::op::FullyConnected::Node &node)
+Initializer InitializerGenerator::generateBias(const graph::operation::FullyConnected::Node &node)
 {
-  const ::neurun::graph::operand::Index bias_index{node.param().bias_index};
+  const ::neurun::graph::operand::Index bias_index{node.getInputs().at(2)};
 
   auto bias_base = _ctx.at(bias_index).data().base();
   const auto bias_size = _ctx.at(bias_index).shape().asVector();
index 7c42607..5a40927 100644 (file)
@@ -17,11 +17,11 @@ class InitializerGenerator : public IInitializerGenerator
 public:
   InitializerGenerator(const neurun::graph::operand::Set &ctx);
 
-  Initializer generateWeight(const ::internal::tflite::op::Conv2D::implicit::Node &node) override;
-  Initializer generateWeight(const ::internal::tflite::op::FullyConnected::Node &node) override;
+  Initializer generateWeight(const graph::operation::Conv2D::Implicit::Node &node) override;
+  Initializer generateWeight(const graph::operation::FullyConnected::Node &node) override;
 
-  Initializer generateBias(const ::internal::tflite::op::Conv2D::implicit::Node &node) override;
-  Initializer generateBias(const ::internal::tflite::op::FullyConnected::Node &node) override;
+  Initializer generateBias(const graph::operation::Conv2D::Implicit::Node &node) override;
+  Initializer generateBias(const graph::operation::FullyConnected::Node &node) override;
 
 private:
   const neurun::graph::operand::Set &_ctx;
index bb76009..b259578 100644 (file)
@@ -107,12 +107,12 @@ StageGenerator::StageGenerator(const neurun::graph::operand::Set &ctx,
   // DO NOTHING
 }
 
-Stage StageGenerator::generate(const ::internal::tflite::op::Conv2D::implicit::Node &node)
+Stage StageGenerator::generate(const graph::operation::Conv2D::Implicit::Node &node)
 {
-  const ::neurun::graph::operand::Index ofm_index{node.param().ofm_index};
-  const ::neurun::graph::operand::Index ifm_index{node.param().ifm_index};
-  const ::neurun::graph::operand::Index ker_index{node.param().ker_index};
-  const ::neurun::graph::operand::Index bias_index{node.param().bias_index};
+  const ::neurun::graph::operand::Index ofm_index{node.getOutputs().at(0)};
+  const ::neurun::graph::operand::Index ifm_index{node.getInputs().at(0)};
+  const ::neurun::graph::operand::Index ker_index{node.getInputs().at(1)};
+  const ::neurun::graph::operand::Index bias_index{node.getInputs().at(2)};
 
   const ::neurun::graph::operand::Index vstride_index{node.param().vstride_index};
   const ::neurun::graph::operand::Index hstride_index{node.param().hstride_index};
@@ -185,10 +185,10 @@ Stage StageGenerator::generate(const ::internal::tflite::op::Conv2D::implicit::N
   };
 }
 
-Stage StageGenerator::generate(const ::internal::tflite::op::MaxPool2D::implicit::Node &node)
+Stage StageGenerator::generate(const graph::operation::MaxPool2D::Implicit::Node &node)
 {
-  const ::neurun::graph::operand::Index ofm_index{node.param().ofm_index};
-  const ::neurun::graph::operand::Index ifm_index{node.param().ifm_index};
+  const ::neurun::graph::operand::Index ofm_index{node.getOutputs().at(0)};
+  const ::neurun::graph::operand::Index ifm_index{node.getInputs().at(0)};
 
   const ::neurun::graph::operand::Index kh_index{node.param().kh_index};
   const ::neurun::graph::operand::Index kw_index{node.param().kw_index};
@@ -271,10 +271,10 @@ Stage StageGenerator::generate(const ::internal::tflite::op::MaxPool2D::implicit
   };
 }
 
-Stage StageGenerator::generate(const ::internal::tflite::op::AvgPool2D::implicit::Node &node)
+Stage StageGenerator::generate(const graph::operation::AvgPool2D::Implicit::Node &node)
 {
-  const ::neurun::graph::operand::Index ofm_index{node.param().ofm_index};
-  const ::neurun::graph::operand::Index ifm_index{node.param().ifm_index};
+  const ::neurun::graph::operand::Index ofm_index{node.getOutputs().at(0)};
+  const ::neurun::graph::operand::Index ifm_index{node.getInputs().at(0)};
 
   const ::neurun::graph::operand::Index kh_index{node.param().kh_index};
   const ::neurun::graph::operand::Index kw_index{node.param().kw_index};
@@ -361,9 +361,9 @@ Stage StageGenerator::generate(const ::internal::tflite::op::AvgPool2D::implicit
   };
 }
 
-Stage StageGenerator::generate(const ::internal::tflite::op::Concat::Node &node)
+Stage StageGenerator::generate(const graph::operation::Concat::Node &node)
 {
-  const ::neurun::graph::operand::Index ofm_index{node.param().ofm_index};
+  const ::neurun::graph::operand::Index ofm_index{node.getOutputs().at(0)};
   const ::neurun::graph::operand::Index axis_index{node.param().axis_index};
 
   struct Param
@@ -376,8 +376,11 @@ Stage StageGenerator::generate(const ::internal::tflite::op::Concat::Node &node)
 
   Param param;
 
-  param.output_index = node.param().ofm_index;
-  param.input_indexes = node.param().ifm_indexes;
+  param.output_index = ofm_index.asInt();
+  for (const auto &e : node.getInputs().list())
+  {
+    param.input_indexes.emplace_back(e.asInt());
+  }
   param.axis = _ctx.at(axis_index).asScalar<int32_t>();
 
   auto tensors = _tensor_builder;
@@ -400,12 +403,12 @@ Stage StageGenerator::generate(const ::internal::tflite::op::Concat::Node &node)
   };
 }
 
-Stage StageGenerator::generate(const ::internal::tflite::op::FullyConnected::Node &node)
+Stage StageGenerator::generate(const graph::operation::FullyConnected::Node &node)
 {
-  const ::neurun::graph::operand::Index output_index{node.param().output_index};
-  const ::neurun::graph::operand::Index input_index{node.param().input_index};
-  const ::neurun::graph::operand::Index weight_index{node.param().weight_index};
-  const ::neurun::graph::operand::Index bias_index{node.param().bias_index};
+  const ::neurun::graph::operand::Index output_index{node.getOutputs().at(0)};
+  const ::neurun::graph::operand::Index input_index{node.getInputs().at(0)};
+  const ::neurun::graph::operand::Index weight_index{node.getInputs().at(1)};
+  const ::neurun::graph::operand::Index bias_index{node.getInputs().at(2)};
   const ::neurun::graph::operand::Index activation_index{node.param().activation_index};
 
   // Construct operation parameters
@@ -447,10 +450,10 @@ Stage StageGenerator::generate(const ::internal::tflite::op::FullyConnected::Nod
   };
 }
 
-Stage StageGenerator::generate(const ::internal::tflite::op::Reshape::Node &node)
+Stage StageGenerator::generate(const graph::operation::Reshape::Node &node)
 {
-  const ::neurun::graph::operand::Index output_index{node.param().output_index};
-  const ::neurun::graph::operand::Index input_index{node.param().input_index};
+  const ::neurun::graph::operand::Index output_index{node.getOutputs().at(0)};
+  const ::neurun::graph::operand::Index input_index{node.getInputs().at(0)};
 
   struct Param
   {
@@ -477,10 +480,10 @@ Stage StageGenerator::generate(const ::internal::tflite::op::Reshape::Node &node
   };
 }
 
-Stage StageGenerator::generate(const ::internal::tflite::op::Softmax::Node &node)
+Stage StageGenerator::generate(const graph::operation::Softmax::Node &node)
 {
-  const ::neurun::graph::operand::Index output_index{node.param().output_index};
-  const ::neurun::graph::operand::Index input_index{node.param().input_index};
+  const ::neurun::graph::operand::Index output_index{node.getOutputs().at(0)};
+  const ::neurun::graph::operand::Index input_index{node.getInputs().at(0)};
   const ::neurun::graph::operand::Index scale_index{node.param().scale_index};
 
   assert(_ctx.at(scale_index).shape().rank() == 0);
@@ -512,7 +515,7 @@ Stage StageGenerator::generate(const ::internal::tflite::op::Softmax::Node &node
   };
 }
 
-Stage StageGenerator::generate(const ::internal::tflite::op::NOP::Node &node)
+Stage StageGenerator::generate(const graph::operation::NOP::Node &node)
 {
   // DO NOTHING
 }
index 8965f62..fec1d2b 100644 (file)
@@ -21,14 +21,14 @@ public:
 
   virtual std::shared_ptr<ITensorBuilder> tensor_builder() override { return _tensor_builder; }
 
-  virtual Stage generate(const ::internal::tflite::op::Conv2D::implicit::Node &node) override;
-  virtual Stage generate(const ::internal::tflite::op::MaxPool2D::implicit::Node &node) override;
-  virtual Stage generate(const ::internal::tflite::op::AvgPool2D::implicit::Node &node) override;
-  virtual Stage generate(const ::internal::tflite::op::Concat::Node &node) override;
-  virtual Stage generate(const ::internal::tflite::op::FullyConnected::Node &node) override;
-  virtual Stage generate(const ::internal::tflite::op::Reshape::Node &node) override;
-  virtual Stage generate(const ::internal::tflite::op::Softmax::Node &node) override;
-  virtual Stage generate(const ::internal::tflite::op::NOP::Node &node) override;
+  virtual Stage generate(const graph::operation::Conv2D::Implicit::Node &node) override;
+  virtual Stage generate(const graph::operation::MaxPool2D::Implicit::Node &node) override;
+  virtual Stage generate(const graph::operation::AvgPool2D::Implicit::Node &node) override;
+  virtual Stage generate(const graph::operation::Concat::Node &node) override;
+  virtual Stage generate(const graph::operation::FullyConnected::Node &node) override;
+  virtual Stage generate(const graph::operation::Reshape::Node &node) override;
+  virtual Stage generate(const graph::operation::Softmax::Node &node) override;
+  virtual Stage generate(const graph::operation::NOP::Node &node) override;
 
 private:
   const neurun::graph::operand::Set &_ctx;
index d626a1c..3208655 100644 (file)
@@ -19,9 +19,9 @@ InitializerGenerator::InitializerGenerator(const neurun::graph::operand::Set &ct
 }
 
 Initializer
-InitializerGenerator::generateWeight(const ::internal::tflite::op::Conv2D::implicit::Node &node)
+InitializerGenerator::generateWeight(const graph::operation::Conv2D::Implicit::Node &node)
 {
-  const ::neurun::graph::operand::Index ker_index{node.param().ker_index};
+  const ::neurun::graph::operand::Index ker_index{node.getInputs().at(1)};
 
   const auto ker_shape = _ctx.at(ker_index).shape().asKernel();
   auto ker_base = _ctx.at(ker_index).data().base();
@@ -39,11 +39,10 @@ InitializerGenerator::generateWeight(const ::internal::tflite::op::Conv2D::impli
   };
 }
 
-Initializer
-InitializerGenerator::generateWeight(const ::internal::tflite::op::FullyConnected::Node &node)
+Initializer InitializerGenerator::generateWeight(const graph::operation::FullyConnected::Node &node)
 {
-  const ::neurun::graph::operand::Index weight_index{node.param().weight_index};
-  const ::neurun::graph::operand::Index input_index{node.param().input_index};
+  const ::neurun::graph::operand::Index weight_index{node.getInputs().at(1)};
+  const ::neurun::graph::operand::Index input_index{node.getInputs().at(0)};
 
   const auto num_output = _ctx.at(weight_index).shape().dim(0);
   auto weight_base = _ctx.at(weight_index).data().base();
@@ -115,12 +114,11 @@ InitializerGenerator::generateWeight(const ::internal::tflite::op::FullyConnecte
   }
 }
 
-Initializer
-InitializerGenerator::generateBias(const ::internal::tflite::op::Conv2D::implicit::Node &node)
+Initializer InitializerGenerator::generateBias(const graph::operation::Conv2D::Implicit::Node &node)
 {
   // TODO Refactor so we can reuse the common code
 
-  const ::neurun::graph::operand::Index bias_index{node.param().bias_index};
+  const ::neurun::graph::operand::Index bias_index{node.getInputs().at(2)};
 
   auto bias_base = _ctx.at(bias_index).data().base();
   const auto bias_size = _ctx.at(bias_index).shape().asVector();
@@ -140,10 +138,9 @@ InitializerGenerator::generateBias(const ::internal::tflite::op::Conv2D::implici
   };
 }
 
-Initializer
-InitializerGenerator::generateBias(const ::internal::tflite::op::FullyConnected::Node &node)
+Initializer InitializerGenerator::generateBias(const graph::operation::FullyConnected::Node &node)
 {
-  const ::neurun::graph::operand::Index bias_index{node.param().bias_index};
+  const ::neurun::graph::operand::Index bias_index{node.getInputs().at(2)};
 
   auto bias_base = _ctx.at(bias_index).data().base();
   auto bias_type = _ctx.at(bias_index).typeInfo().type();
index 63574b6..4588232 100644 (file)
@@ -17,11 +17,11 @@ class InitializerGenerator : public IInitializerGenerator
 public:
   InitializerGenerator(const neurun::graph::operand::Set &ctx);
 
-  Initializer generateWeight(const ::internal::tflite::op::Conv2D::implicit::Node &node) override;
-  Initializer generateWeight(const ::internal::tflite::op::FullyConnected::Node &node) override;
+  Initializer generateWeight(const graph::operation::Conv2D::Implicit::Node &node) override;
+  Initializer generateWeight(const graph::operation::FullyConnected::Node &node) override;
 
-  Initializer generateBias(const ::internal::tflite::op::Conv2D::implicit::Node &node) override;
-  Initializer generateBias(const ::internal::tflite::op::FullyConnected::Node &node) override;
+  Initializer generateBias(const graph::operation::Conv2D::Implicit::Node &node) override;
+  Initializer generateBias(const graph::operation::FullyConnected::Node &node) override;
 
 private:
   const neurun::graph::operand::Set &_ctx;
index fa607db..5d30c39 100644 (file)
@@ -34,12 +34,12 @@ StageGenerator::StageGenerator(const neurun::graph::operand::Set &operand_ctx,
   // DO NOTHING
 }
 
-Stage StageGenerator::generate(const ::internal::tflite::op::Conv2D::implicit::Node &node)
+Stage StageGenerator::generate(const graph::operation::Conv2D::Implicit::Node &node)
 {
-  const ::neurun::graph::operand::Index ofm_index{node.param().ofm_index};
-  const ::neurun::graph::operand::Index ifm_index{node.param().ifm_index};
-  const ::neurun::graph::operand::Index ker_index{node.param().ker_index};
-  const ::neurun::graph::operand::Index bias_index{node.param().bias_index};
+  const ::neurun::graph::operand::Index ofm_index{node.getOutputs().at(0)};
+  const ::neurun::graph::operand::Index ifm_index{node.getInputs().at(0)};
+  const ::neurun::graph::operand::Index ker_index{node.getInputs().at(1)};
+  const ::neurun::graph::operand::Index bias_index{node.getInputs().at(2)};
 
   const ::neurun::graph::operand::Index vstride_index{node.param().vstride_index};
   const ::neurun::graph::operand::Index hstride_index{node.param().hstride_index};
@@ -119,12 +119,12 @@ Stage StageGenerator::generate(const ::internal::tflite::op::Conv2D::implicit::N
   };
 }
 
-Stage StageGenerator::generate(const ::internal::tflite::op::MaxPool2D::implicit::Node &node)
+Stage StageGenerator::generate(const graph::operation::MaxPool2D::Implicit::Node &node)
 {
   VERBOSE(MaxPool2D) << "generate CPU MaxPool2D" << std::endl;
 
-  const ::neurun::graph::operand::Index ofm_index{node.param().ofm_index};
-  const ::neurun::graph::operand::Index ifm_index{node.param().ifm_index};
+  const ::neurun::graph::operand::Index ofm_index{node.getOutputs().at(0)};
+  const ::neurun::graph::operand::Index ifm_index{node.getInputs().at(0)};
 
   const ::neurun::graph::operand::Index kh_index{node.param().kh_index};
   const ::neurun::graph::operand::Index kw_index{node.param().kw_index};
@@ -215,12 +215,12 @@ Stage StageGenerator::generate(const ::internal::tflite::op::MaxPool2D::implicit
   };
 }
 
-Stage StageGenerator::generate(const ::internal::tflite::op::AvgPool2D::implicit::Node &node)
+Stage StageGenerator::generate(const graph::operation::AvgPool2D::Implicit::Node &node)
 {
   VERBOSE(AvgPool2D) << "generate CPU AvgPool2D" << std::endl;
 
-  const ::neurun::graph::operand::Index ofm_index{node.param().ofm_index};
-  const ::neurun::graph::operand::Index ifm_index{node.param().ifm_index};
+  const ::neurun::graph::operand::Index ofm_index{node.getOutputs().at(0)};
+  const ::neurun::graph::operand::Index ifm_index{node.getInputs().at(0)};
 
   const ::neurun::graph::operand::Index kh_index{node.param().kh_index};
   const ::neurun::graph::operand::Index kw_index{node.param().kw_index};
@@ -315,11 +315,11 @@ Stage StageGenerator::generate(const ::internal::tflite::op::AvgPool2D::implicit
   };
 }
 
-Stage StageGenerator::generate(const ::internal::tflite::op::Concat::Node &node)
+Stage StageGenerator::generate(const graph::operation::Concat::Node &node)
 {
   VERBOSE(Concat) << "generate CPU Concat" << std::endl;
 
-  const ::neurun::graph::operand::Index ofm_index{node.param().ofm_index};
+  const ::neurun::graph::operand::Index ofm_index{node.getOutputs().at(0)};
   const ::neurun::graph::operand::Index axis_index{node.param().axis_index};
 
   struct Param
@@ -335,16 +335,18 @@ Stage StageGenerator::generate(const ::internal::tflite::op::Concat::Node &node)
 
   Param param;
 
-  param.output_index = node.param().ofm_index;
-  param.input_indexes = node.param().ifm_indexes;
+  param.output_index = ofm_index.asInt();
+  for (const auto &e : node.getInputs().list())
+  {
+    param.input_indexes.emplace_back(e.asInt());
+  }
   param.axis = _ctx.at(axis_index).asScalar<int32_t>();
 
   param.ofm_shape = ::neurun::kernel::cpu::getShape(_ctx.at(ofm_index));
 
-  for (auto ifm_ind : node.param().ifm_indexes)
+  for (auto e : node.getInputs().list())
   {
-    const ::neurun::graph::operand::Index ifm_index{ifm_ind};
-    param.ifm_shapes.emplace_back(::neurun::kernel::cpu::getShape(_ctx.at(ifm_index)));
+    param.ifm_shapes.emplace_back(::neurun::kernel::cpu::getShape(_ctx.at(e)));
   }
 
   auto tensors = _tensor_builder;
@@ -368,14 +370,14 @@ Stage StageGenerator::generate(const ::internal::tflite::op::Concat::Node &node)
   };
 }
 
-Stage StageGenerator::generate(const ::internal::tflite::op::FullyConnected::Node &node)
+Stage StageGenerator::generate(const graph::operation::FullyConnected::Node &node)
 {
   VERBOSE(FullyConnected) << "generate CPU FullyConnected" << std::endl;
 
-  const ::neurun::graph::operand::Index output_index{node.param().output_index};
-  const ::neurun::graph::operand::Index input_index{node.param().input_index};
-  const ::neurun::graph::operand::Index weight_index{node.param().weight_index};
-  const ::neurun::graph::operand::Index bias_index{node.param().bias_index};
+  const ::neurun::graph::operand::Index output_index{node.getOutputs().at(0)};
+  const ::neurun::graph::operand::Index input_index{node.getInputs().at(0)};
+  const ::neurun::graph::operand::Index weight_index{node.getInputs().at(1)};
+  const ::neurun::graph::operand::Index bias_index{node.getInputs().at(2)};
   const ::neurun::graph::operand::Index activation_index{node.param().activation_index};
 
   // Construct operation parameters
@@ -427,10 +429,10 @@ Stage StageGenerator::generate(const ::internal::tflite::op::FullyConnected::Nod
   };
 }
 
-Stage StageGenerator::generate(const ::internal::tflite::op::Reshape::Node &node)
+Stage StageGenerator::generate(const graph::operation::Reshape::Node &node)
 {
-  const ::neurun::graph::operand::Index output_index{node.param().output_index};
-  const ::neurun::graph::operand::Index input_index{node.param().input_index};
+  const ::neurun::graph::operand::Index output_index{node.getOutputs().at(0)};
+  const ::neurun::graph::operand::Index input_index{node.getInputs().at(0)};
 
   struct Param
   {
@@ -464,12 +466,12 @@ Stage StageGenerator::generate(const ::internal::tflite::op::Reshape::Node &node
   };
 }
 
-Stage StageGenerator::generate(const ::internal::tflite::op::Softmax::Node &node)
+Stage StageGenerator::generate(const graph::operation::Softmax::Node &node)
 {
   VERBOSE(Softmax) << "generate CPU Softmax" << std::endl;
 
-  const ::neurun::graph::operand::Index output_index{node.param().output_index};
-  const ::neurun::graph::operand::Index input_index{node.param().input_index};
+  const ::neurun::graph::operand::Index output_index{node.getOutputs().at(0)};
+  const ::neurun::graph::operand::Index input_index{node.getInputs().at(0)};
   const ::neurun::graph::operand::Index scale_index{node.param().scale_index};
 
   struct Param
@@ -509,7 +511,7 @@ Stage StageGenerator::generate(const ::internal::tflite::op::Softmax::Node &node
   };
 }
 
-Stage StageGenerator::generate(const ::internal::tflite::op::NOP::Node &node)
+Stage StageGenerator::generate(const graph::operation::NOP::Node &node)
 {
   // DO NOTHING
 }
index a39e7d0..55a1bce 100644 (file)
@@ -22,14 +22,14 @@ public:
 
   virtual std::shared_ptr<ITensorBuilder> tensor_builder() override { return _tensor_builder; }
 
-  virtual Stage generate(const ::internal::tflite::op::Conv2D::implicit::Node &node) override;
-  virtual Stage generate(const ::internal::tflite::op::MaxPool2D::implicit::Node &node) override;
-  virtual Stage generate(const ::internal::tflite::op::AvgPool2D::implicit::Node &node) override;
-  virtual Stage generate(const ::internal::tflite::op::Concat::Node &node) override;
-  virtual Stage generate(const ::internal::tflite::op::FullyConnected::Node &node) override;
-  virtual Stage generate(const ::internal::tflite::op::Reshape::Node &node) override;
-  virtual Stage generate(const ::internal::tflite::op::Softmax::Node &node) override;
-  virtual Stage generate(const ::internal::tflite::op::NOP::Node &node) override;
+  virtual Stage generate(const graph::operation::Conv2D::Implicit::Node &node) override;
+  virtual Stage generate(const graph::operation::MaxPool2D::Implicit::Node &node) override;
+  virtual Stage generate(const graph::operation::AvgPool2D::Implicit::Node &node) override;
+  virtual Stage generate(const graph::operation::Concat::Node &node) override;
+  virtual Stage generate(const graph::operation::FullyConnected::Node &node) override;
+  virtual Stage generate(const graph::operation::Reshape::Node &node) override;
+  virtual Stage generate(const graph::operation::Softmax::Node &node) override;
+  virtual Stage generate(const graph::operation::NOP::Node &node) override;
 
 private:
   const neurun::graph::operand::Set &_ctx;
index 58cb92f..73693c3 100644 (file)
@@ -26,10 +26,10 @@ public:
     if (backend_all_str.compare("none") != 0)
     {
       VERBOSE(BackendResolver) << "Use backend for all ops: " << backend_all_str << std::endl;
-#define OP(InternalName, NnApiName)                                         \
-  {                                                                         \
-    auto backend = _backend_manager.get(backend_all_str);                   \
-    _gen_map[typeid(::internal::tflite::op::InternalName::Node)] = backend; \
+#define OP(InternalName, NnApiName)                                   \
+  {                                                                   \
+    auto backend = _backend_manager.get(backend_all_str);             \
+    _gen_map[typeid(graph::operation::InternalName::Node)] = backend; \
   }
 #include "internal/op/Op.lst"
 #undef OP
@@ -42,7 +42,7 @@ public:
         ::nnfw::util::EnvVar{std::string("OP_BACKEND_") + #NnApiName}.asString("acl_cl");         \
     auto backend = _backend_manager.get(backend_str);                                             \
     VERBOSE(BackendResolver) << "backend for " << #NnApiName << ": " << backend_str << std::endl; \
-    _gen_map[typeid(::internal::tflite::op::InternalName::Node)] = backend;                       \
+    _gen_map[typeid(graph::operation::InternalName::Node)] = backend;                             \
   }
 
 #include "internal/op/Op.lst"
index 21636ce..b569ad5 100644 (file)
@@ -13,13 +13,13 @@ namespace neurun
 namespace codegen
 {
 
-void Planner::visit(const ::internal::tflite::op::Conv2D::implicit::Node &node)
+void Planner::visit(const graph::operation::Conv2D::Implicit::Node &node)
 {
-  const ::neurun::graph::operand::Index ofm_index{node.param().ofm_index};
+  const auto ofm_index = node.getOutputs().at(0);
 
-  const ::neurun::graph::operand::Index ifm_index{node.param().ifm_index};
-  const ::neurun::graph::operand::Index ker_index{node.param().ker_index};
-  const ::neurun::graph::operand::Index bias_index{node.param().bias_index};
+  const auto ifm_index = node.getInputs().at(0);
+  const auto ker_index = node.getInputs().at(1);
+  const auto bias_index = node.getInputs().at(2);
 
   const auto ofm_shape = _ctx.at(ofm_index).shape().asFeature();
   const auto ifm_shape = _ctx.at(ifm_index).shape().asFeature();
@@ -42,10 +42,10 @@ void Planner::visit(const ::internal::tflite::op::Conv2D::implicit::Node &node)
   _builder.addStage(stage_gen->generate(node));
 }
 
-void Planner::visit(const ::internal::tflite::op::MaxPool2D::implicit::Node &node)
+void Planner::visit(const graph::operation::MaxPool2D::Implicit::Node &node)
 {
-  const ::neurun::graph::operand::Index ofm_index{node.param().ofm_index};
-  const ::neurun::graph::operand::Index ifm_index{node.param().ifm_index};
+  const ::neurun::graph::operand::Index ofm_index{node.getOutputs().at(0)};
+  const ::neurun::graph::operand::Index ifm_index{node.getInputs().at(0)};
 
   const auto ofm_shape = _ctx.at(ofm_index).shape().asFeature();
   const auto ifm_shape = _ctx.at(ifm_index).shape().asFeature();
@@ -59,10 +59,10 @@ void Planner::visit(const ::internal::tflite::op::MaxPool2D::implicit::Node &nod
   _builder.addStage(stage_gen->generate(node));
 }
 
-void Planner::visit(const ::internal::tflite::op::AvgPool2D::implicit::Node &node)
+void Planner::visit(const graph::operation::AvgPool2D::Implicit::Node &node)
 {
-  const ::neurun::graph::operand::Index ofm_index{node.param().ofm_index};
-  const ::neurun::graph::operand::Index ifm_index{node.param().ifm_index};
+  const ::neurun::graph::operand::Index ofm_index{node.getOutputs().at(0)};
+  const ::neurun::graph::operand::Index ifm_index{node.getInputs().at(0)};
 
   const auto ofm_shape = _ctx.at(ofm_index).shape().asFeature();
   const auto ifm_shape = _ctx.at(ifm_index).shape().asFeature();
@@ -76,11 +76,11 @@ void Planner::visit(const ::internal::tflite::op::AvgPool2D::implicit::Node &nod
   _builder.addStage(stage_gen->generate(node));
 }
 
-void Planner::visit(const ::internal::tflite::op::Concat::Node &node)
+void Planner::visit(const graph::operation::Concat::Node &node)
 {
-  const ::neurun::graph::operand::Index ofm_index{node.param().ofm_index};
+  const ::neurun::graph::operand::Index ofm_index{node.getOutputs().at(0)};
 
-  // NOTE This implementation assumes that inputs and output are a feature
+  // NOTE This implementation assumes that input and output are a feature
   // TODO Remove this assumption
   const auto ofm_shape = _ctx.at(ofm_index).shape().asFeature();
 
@@ -95,7 +95,7 @@ void Planner::visit(const ::internal::tflite::op::Concat::Node &node)
   // Set Shape Constraints (for input)
   uint32_t depth = 0;
 
-  for (const auto &index : node.param().ifm_indexes)
+  for (const auto &index : node.getInputs().list())
   {
     const ::neurun::graph::operand::Index ifm_index{index};
     const auto ifm_shape = _ctx.at(ifm_index).shape().asFeature();
@@ -107,15 +107,15 @@ void Planner::visit(const ::internal::tflite::op::Concat::Node &node)
   _builder.addStage(stage_gen->generate(node));
 }
 
-void Planner::visit(const ::internal::tflite::op::FullyConnected::Node &node)
+void Planner::visit(const graph::operation::FullyConnected::Node &node)
 {
   VERBOSE(FullyConnected) << "Configure FULLY_CONNECTED operation" << std::endl;
 
-  const ::neurun::graph::operand::Index output_index{node.param().output_index};
+  const ::neurun::graph::operand::Index output_index{node.getOutputs().at(0)};
 
-  const ::neurun::graph::operand::Index input_index{node.param().input_index};
-  const ::neurun::graph::operand::Index weight_index{node.param().weight_index};
-  const ::neurun::graph::operand::Index bias_index{node.param().bias_index};
+  const ::neurun::graph::operand::Index input_index{node.getInputs().at(0)};
+  const ::neurun::graph::operand::Index weight_index{node.getInputs().at(1)};
+  const ::neurun::graph::operand::Index bias_index{node.getInputs().at(2)};
 
   const ::neurun::graph::operand::Index activation_index{node.param().activation_index};
 
@@ -150,10 +150,10 @@ void Planner::visit(const ::internal::tflite::op::FullyConnected::Node &node)
   _builder.addStage(stage_gen->generate(node));
 }
 
-void Planner::visit(const ::internal::tflite::op::Reshape::Node &node)
+void Planner::visit(const graph::operation::Reshape::Node &node)
 {
-  const ::neurun::graph::operand::Index output_index{node.param().output_index};
-  const ::neurun::graph::operand::Index input_index{node.param().input_index};
+  const ::neurun::graph::operand::Index output_index{node.getOutputs().at(0)};
+  const ::neurun::graph::operand::Index input_index{node.getInputs().at(0)};
 
   // NOTE The content of a tensor specified by shape_index should be aligned with
   //      output tensor shape
@@ -180,12 +180,12 @@ void Planner::visit(const ::internal::tflite::op::Reshape::Node &node)
   _builder.addStage(stage_gen->generate(node));
 }
 
-void Planner::visit(const ::internal::tflite::op::Softmax::Node &node)
+void Planner::visit(const graph::operation::Softmax::Node &node)
 {
   VERBOSE(Softmax) << "Configure SOFTMAX operation" << std::endl;
 
-  const ::neurun::graph::operand::Index output_index{node.param().output_index};
-  const ::neurun::graph::operand::Index input_index{node.param().input_index};
+  const ::neurun::graph::operand::Index output_index{node.getOutputs().at(0)};
+  const ::neurun::graph::operand::Index input_index{node.getInputs().at(0)};
 
   assert(_ctx.at(output_index).shape().rank() == _ctx.at(input_index).shape().rank());
 
@@ -205,7 +205,7 @@ void Planner::visit(const ::internal::tflite::op::Softmax::Node &node)
   _builder.addStage(stage_gen->generate(node));
 }
 
-void Planner::visit(const ::internal::tflite::op::NOP::Node &node)
+void Planner::visit(const graph::operation::NOP::Node &node)
 {
   // DO NOTHING
   // TODO : It's just for graph manipulation test now, it should be added tensor copy stage later.
index 2e410ed..cad2f2e 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef __NEURUN_CODEGEN_PLANNER_H__
 #define __NEURUN_CODEGEN_PLANNER_H__
 
-#include "internal/op/NodeVisitor.h"
+#include "graph/operation/NodeVisitor.h"
 
 namespace neurun
 {
@@ -22,7 +22,7 @@ namespace codegen
 class IPlanBuilder;
 class BackendResolver;
 
-class Planner : public ::internal::tflite::op::NodeVisitor
+class Planner : public graph::operation::NodeVisitor
 {
 public:
   Planner(const neurun::graph::operand::Set &ctx, neurun::codegen::IPlanBuilder &builder,
@@ -32,14 +32,14 @@ public:
   }
 
 public:
-  void visit(const ::internal::tflite::op::Conv2D::implicit::Node &node) override;
-  void visit(const ::internal::tflite::op::MaxPool2D::implicit::Node &node) override;
-  void visit(const ::internal::tflite::op::AvgPool2D::implicit::Node &node) override;
-  void visit(const ::internal::tflite::op::Concat::Node &node) override;
-  void visit(const ::internal::tflite::op::FullyConnected::Node &node) override;
-  void visit(const ::internal::tflite::op::Reshape::Node &node) override;
-  void visit(const ::internal::tflite::op::Softmax::Node &node) override;
-  void visit(const ::internal::tflite::op::NOP::Node &node) override;
+  virtual void visit(const graph::operation::Conv2D::Implicit::Node &) override;
+  virtual void visit(const graph::operation::MaxPool2D::Implicit::Node &) override;
+  virtual void visit(const graph::operation::AvgPool2D::Implicit::Node &) override;
+  virtual void visit(const graph::operation::Concat::Node &) override;
+  virtual void visit(const graph::operation::Reshape::Node &) override;
+  virtual void visit(const graph::operation::FullyConnected::Node &) override;
+  virtual void visit(const graph::operation::Softmax::Node &) override;
+  virtual void visit(const graph::operation::NOP::Node &) override;
 
 private:
   const neurun::graph::operand::Set &_ctx;
index 0f256ad..50396b9 100644 (file)
@@ -5,63 +5,56 @@ namespace neurun
 namespace codegen
 {
 
-void TensorMarker::visit(const ::internal::tflite::op::Conv2D::implicit::Node &node)
+void TensorMarker::visit(const graph::operation::Conv2D::Implicit::Node &node)
 {
-  const auto &param = node.param();
-  mark(param.ofm_index);
-  mark(param.ifm_index);
-  mark(param.ker_index);
-  mark(param.bias_index);
+  mark(node.getOutputs().at(0));
+  mark(node.getInputs().at(0));
+  mark(node.getInputs().at(1));
+  mark(node.getInputs().at(2));
 }
 
-void TensorMarker::visit(const ::internal::tflite::op::MaxPool2D::implicit::Node &node)
+void TensorMarker::visit(const graph::operation::MaxPool2D::Implicit::Node &node)
 {
-  const auto &param = node.param();
-  mark(param.ofm_index);
-  mark(param.ifm_index);
+  mark(node.getOutputs().at(0));
+  mark(node.getInputs().at(0));
 }
 
-void TensorMarker::visit(const ::internal::tflite::op::AvgPool2D::implicit::Node &node)
+void TensorMarker::visit(const graph::operation::AvgPool2D::Implicit::Node &node)
 {
-  const auto &param = node.param();
-  mark(param.ofm_index);
-  mark(param.ifm_index);
+  mark(node.getOutputs().at(0));
+  mark(node.getInputs().at(0));
 }
 
-void TensorMarker::visit(const ::internal::tflite::op::Concat::Node &node)
+void TensorMarker::visit(const graph::operation::Concat::Node &node)
 {
-  const auto &param = node.param();
-  mark(param.ofm_index);
-  for (auto ind : param.ifm_indexes)
+  mark(node.getOutputs().at(0));
+  for (const auto &ind : node.getInputs().list())
   {
     mark(ind);
   }
 }
 
-void TensorMarker::visit(const ::internal::tflite::op::FullyConnected::Node &node)
+void TensorMarker::visit(const graph::operation::FullyConnected::Node &node)
 {
-  const auto &param = node.param();
-  mark(param.output_index);
-  mark(param.input_index);
-  mark(param.weight_index);
-  mark(param.bias_index);
+  mark(node.getOutputs().at(0));
+  mark(node.getInputs().at(0));
+  mark(node.getInputs().at(1));
+  mark(node.getInputs().at(2));
 }
 
-void TensorMarker::visit(const ::internal::tflite::op::Reshape::Node &node)
+void TensorMarker::visit(const graph::operation::Reshape::Node &node)
 {
-  const auto &param = node.param();
-  mark(param.output_index);
-  mark(param.input_index);
+  mark(node.getOutputs().at(0));
+  mark(node.getInputs().at(0));
 }
 
-void TensorMarker::visit(const ::internal::tflite::op::Softmax::Node &node)
+void TensorMarker::visit(const graph::operation::Softmax::Node &node)
 {
-  const auto &param = node.param();
-  mark(param.output_index);
-  mark(param.input_index);
+  mark(node.getOutputs().at(0));
+  mark(node.getInputs().at(0));
 }
 
-void TensorMarker::visit(const ::internal::tflite::op::NOP::Node &node)
+void TensorMarker::visit(const graph::operation::NOP::Node &node)
 {
   // DO NOTHING
 }
index 7a816f6..d2ca2d9 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef __NEURUN_CODEGEN_TENSOR_MARKER_H__
 #define __NEURUN_CODEGEN_TENSOR_MARKER_H__
 
-#include "internal/op/NodeVisitor.h"
+#include "graph/operation/NodeVisitor.h"
 #include "backend/ITensorBuilder.h"
 
 namespace neurun
@@ -9,7 +9,7 @@ namespace neurun
 namespace codegen
 {
 
-class TensorMarker : public ::internal::tflite::op::NodeVisitor
+class TensorMarker : public graph::operation::NodeVisitor
 {
 public:
   TensorMarker(neurun::backend::ITensorBuilder &tensor_builder) : _tensor_builder{tensor_builder}
@@ -18,17 +18,17 @@ public:
   }
 
 public:
-  void visit(const ::internal::tflite::op::Conv2D::implicit::Node &node) override;
-  void visit(const ::internal::tflite::op::MaxPool2D::implicit::Node &node) override;
-  void visit(const ::internal::tflite::op::AvgPool2D::implicit::Node &node) override;
-  void visit(const ::internal::tflite::op::Concat::Node &node) override;
-  void visit(const ::internal::tflite::op::FullyConnected::Node &node) override;
-  void visit(const ::internal::tflite::op::Reshape::Node &node) override;
-  void visit(const ::internal::tflite::op::Softmax::Node &node) override;
-  void visit(const ::internal::tflite::op::NOP::Node &node) override;
+  virtual void visit(const graph::operation::Conv2D::Implicit::Node &) override;
+  virtual void visit(const graph::operation::MaxPool2D::Implicit::Node &) override;
+  virtual void visit(const graph::operation::AvgPool2D::Implicit::Node &) override;
+  virtual void visit(const graph::operation::Concat::Node &) override;
+  virtual void visit(const graph::operation::Reshape::Node &) override;
+  virtual void visit(const graph::operation::FullyConnected::Node &) override;
+  virtual void visit(const graph::operation::Softmax::Node &) override;
+  virtual void visit(const graph::operation::NOP::Node &) override;
 
 private:
-  void mark(int32_t ind) { _tensor_builder.mark(::neurun::graph::operand::Index{ind}); }
+  void mark(const graph::operand::Index &ind) { _tensor_builder.mark(ind); }
 
 private:
   neurun::backend::ITensorBuilder &_tensor_builder;
index 51fafc0..8a61f36 100644 (file)
@@ -40,7 +40,8 @@ int ANeuralNetworksCompilation::finish()
   auto linear = plan.model().linearize();
 
   // Dump ops
-  linear->accept(neurun::codegen::Dumper{});
+  // TODO Update Dumper with neurun::graph::operation::Node version
+  // linear->accept(neurun::codegen::Dumper{});
 
   ::internal::BackendManager backend_manager{plan};
   neurun::codegen::BackendResolver backend_resolver{backend_manager};
index 6c29e7a..588955e 100644 (file)
@@ -212,6 +212,9 @@ int ANeuralNetworksModel_addOperation(ANeuralNetworksModel *model,
 
   auto &graph = model->deref();
 
+  auto node_param =
+      neurun::graph::operation::Node::InitParam{inputCount, inputs, outputCount, outputs};
+
   switch (type)
   {
     case ANEURALNETWORKS_CONV_2D:
@@ -224,12 +227,9 @@ int ANeuralNetworksModel_addOperation(ANeuralNetworksModel *model,
 
       if (inputCount == 7)
       {
-        using internal::tflite::op::Conv2D::implicit::Param;
-        using internal::tflite::op::Conv2D::implicit::Node;
         using GraphNode = neurun::graph::operation::Conv2D::Implicit::Node;
 
-        graph.addOperation(nnfw::make_unique<GraphNode>(
-            nnfw::make_unique<Node>(Param{inputCount, inputs, outputCount, outputs})));
+        graph.addOperation(nnfw::make_unique<GraphNode>(node_param));
       }
       else
       {
@@ -248,12 +248,9 @@ int ANeuralNetworksModel_addOperation(ANeuralNetworksModel *model,
 
       if (inputCount == 7)
       {
-        using internal::tflite::op::MaxPool2D::implicit::Param;
-        using internal::tflite::op::MaxPool2D::implicit::Node;
         using GraphNode = neurun::graph::operation::MaxPool2D::Implicit::Node;
 
-        graph.addOperation(nnfw::make_unique<GraphNode>(
-            nnfw::make_unique<Node>(Param{inputCount, inputs, outputCount, outputs})));
+        graph.addOperation(nnfw::make_unique<GraphNode>(node_param));
       }
       else
       {
@@ -272,12 +269,9 @@ int ANeuralNetworksModel_addOperation(ANeuralNetworksModel *model,
 
       if (inputCount == 7)
       {
-        using internal::tflite::op::AvgPool2D::implicit::Param;
-        using internal::tflite::op::AvgPool2D::implicit::Node;
         using GraphNode = neurun::graph::operation::AvgPool2D::Implicit::Node;
 
-        graph.addOperation(nnfw::make_unique<GraphNode>(
-            nnfw::make_unique<Node>(Param{inputCount, inputs, outputCount, outputs})));
+        graph.addOperation(nnfw::make_unique<GraphNode>(node_param));
       }
       else
       {
@@ -288,45 +282,33 @@ int ANeuralNetworksModel_addOperation(ANeuralNetworksModel *model,
     }
     case ANEURALNETWORKS_CONCATENATION:
     {
-      using internal::tflite::op::Concat::Param;
-      using internal::tflite::op::Concat::Node;
       using GraphNode = neurun::graph::operation::Concat::Node;
 
-      graph.addOperation(nnfw::make_unique<GraphNode>(
-          nnfw::make_unique<Node>(Param{inputCount, inputs, outputCount, outputs})));
+      graph.addOperation(nnfw::make_unique<GraphNode>(node_param));
 
       break;
     }
     case ANEURALNETWORKS_RESHAPE:
     {
-      using internal::tflite::op::Reshape::Param;
-      using internal::tflite::op::Reshape::Node;
       using GraphNode = neurun::graph::operation::Reshape::Node;
 
-      graph.addOperation(nnfw::make_unique<GraphNode>(
-          nnfw::make_unique<Node>(Param{inputCount, inputs, outputCount, outputs})));
+      graph.addOperation(nnfw::make_unique<GraphNode>(node_param));
 
       break;
     }
     case ANEURALNETWORKS_FULLY_CONNECTED:
     {
-      using internal::tflite::op::FullyConnected::Param;
-      using internal::tflite::op::FullyConnected::Node;
       using GraphNode = neurun::graph::operation::FullyConnected::Node;
 
-      graph.addOperation(nnfw::make_unique<GraphNode>(
-          nnfw::make_unique<Node>(Param{inputCount, inputs, outputCount, outputs})));
+      graph.addOperation(nnfw::make_unique<GraphNode>(node_param));
 
       break;
     }
     case ANEURALNETWORKS_SOFTMAX:
     {
-      using internal::tflite::op::Softmax::Param;
-      using internal::tflite::op::Softmax::Node;
       using GraphNode = neurun::graph::operation::Softmax::Node;
 
-      graph.addOperation(nnfw::make_unique<GraphNode>(
-          nnfw::make_unique<Node>(Param{inputCount, inputs, outputCount, outputs})));
+      graph.addOperation(nnfw::make_unique<GraphNode>(node_param));
 
       break;
     }
index 9f4d46f..b8e87aa 100644 (file)
@@ -22,6 +22,14 @@ IndexSet::IndexSet(std::initializer_list<int32_t> list)
   }
 }
 
+IndexSet::IndexSet(std::initializer_list<uint32_t> list)
+{
+  for (auto val : list)
+  {
+    _set.emplace_back(val);
+  }
+}
+
 bool IndexSet::contains(const Index &index) const
 {
   return std::find(_set.begin(), _set.end(), index) != _set.end();
index b4992b2..6080cf0 100644 (file)
@@ -19,6 +19,7 @@ public:
   IndexSet(void) = default;
   IndexSet(std::initializer_list<Index> list);
   IndexSet(std::initializer_list<int32_t> list);
+  IndexSet(std::initializer_list<uint32_t> list);
 
 public:
   void append(const Index &index) { _set.emplace_back(index); }
@@ -27,6 +28,7 @@ public:
   uint32_t size() const { return static_cast<uint32_t>(_set.size()); }
   const std::vector<Index> &list() const { return _set; }
   const Index &at(IO::Index set_index) const { return _set.at(set_index.asInt()); }
+  const Index &at(uint32_t index) const { return _set.at(index); }
   bool contains(const Index &index) const;
 
 private:
index b3962b8..4f93966 100644 (file)
@@ -17,20 +17,45 @@ namespace Implicit
 
 void Node::accept(NodeVisitor &&v) const { v.visit(*this); }
 
+Node::Node(const graph::operation::Node::InitParam &init_param)
+{
+  assert(init_param.input_count == 7);
+  assert(init_param.output_count == 1);
+
+  // Each input should be interpreted as follows:
+  //
+  //  0 -> IFM Tensor Index
+  //  1 -> Padding Code (ANEURALNETWORKS_PADDING_SAME or ANEURALNETWORKS_PADDING_VALID) Index
+  //  2 -> Horizontal (over width) Stride Index
+  //  3 -> Vertial (over height) Stride Index
+  //  4 -> Filter Width Index
+  //  5 -> Filter Height Index
+  //  6 -> FuseCode (activation) Index
+
+  setInputs({init_param.inputs[0]});
+  setOutputs({init_param.outputs[0]});
+
+  _param.padding_index = init_param.inputs[1];
+  _param.hstride_index = init_param.inputs[2];
+  _param.vstride_index = init_param.inputs[3];
+
+  _param.kw_index = init_param.inputs[4];
+  _param.kh_index = init_param.inputs[5];
+  _param.activation_index = init_param.inputs[6];
+}
+
 void Node::setInputs(const operand::IndexSet &indexes)
 {
   assert(indexes.size() == 1);
 
-  ::neurun::graph::operand::IO::Index index{0};
-  _op->param().ifm_index = indexes.at(index).asInt();
+  graph::operation::Node::setInputs(indexes);
 }
 
 void Node::setOutputs(const operand::IndexSet &indexes)
 {
   assert(indexes.size() == 1);
 
-  ::neurun::graph::operand::IO::Index index{0};
-  _op->param().ofm_index = indexes.at(index).asInt();
+  graph::operation::Node::setOutputs(indexes);
 }
 
 } // namespace Implicit
index cbae095..ebd6985 100644 (file)
@@ -4,7 +4,6 @@
 #include <memory>
 
 #include "graph/operation/Node.h"
-#include "internal/op/AvgPool2D.h"
 
 namespace neurun
 {
@@ -17,25 +16,35 @@ namespace AvgPool2D
 namespace Implicit
 {
 
+struct Param
+{
+  int32_t kw_index;
+  int32_t kh_index;
+
+  int32_t hstride_index;
+  int32_t vstride_index;
+
+  int32_t padding_index;
+  int32_t activation_index;
+};
+
 class Node : public graph::operation::Node
 {
 public:
-  Node(std::unique_ptr<::internal::tflite::op::AvgPool2D::implicit::Node> &&op) : _op{std::move(op)}
-  {
-  }
+  Node(const graph::operation::Node::InitParam &init_param);
 
 public:
   virtual void accept(NodeVisitor &&) const override;
 
 public:
-  virtual operand::IndexSet getInputs() const override { return {_op->param().ifm_index}; }
-  virtual operand::IndexSet getOutputs() const override { return {_op->param().ofm_index}; }
   virtual void setInputs(const operand::IndexSet &indexes) override;
   virtual void setOutputs(const operand::IndexSet &indexes) override;
-  virtual const ::internal::tflite::op::Node *op() const override { return _op.get(); }
+
+public:
+  const Param &param() const { return _param; }
 
 private:
-  std::unique_ptr<::internal::tflite::op::AvgPool2D::implicit::Node> _op;
+  Param _param;
 };
 
 } // namespace Implicit
index 1a08893..fb39a7a 100644 (file)
@@ -15,33 +15,35 @@ namespace Concat
 
 void Node::accept(NodeVisitor &&v) const { v.visit(*this); }
 
-operand::IndexSet Node::getInputs() const
+Node::Node(const graph::operation::Node::InitParam &init_param)
 {
-  operand::IndexSet set;
-  for (auto index : _op->param().ifm_indexes)
-  {
-    operand::Index ind{index};
-    set.append({ind});
-  }
-  return set;
-}
+  assert(init_param.input_count > 2); // At least one one input tensor and axis
+  assert(init_param.output_count == 1);
+
+  // When there are N + 1 inputs, each input should be interpreted as follows:
+  //
+  //  [0, N) -> Input tensors
+  //  N -> Axis
+  //
 
-void Node::setInputs(const operand::IndexSet &indexes)
-{
-  std::vector<int32_t> inds;
-  for (auto index : indexes.list())
   {
-    inds.emplace_back(index.asInt());
+    operand::IndexSet inds;
+    for (uint32_t n = 0; n < init_param.input_count - 1; ++n)
+    {
+      inds.append(operand::Index{init_param.inputs[n]});
+    }
+    setInputs(inds);
   }
-  _op->param().ifm_indexes = inds;
+  setOutputs({init_param.outputs[0]});
+
+  _param.axis_index = init_param.inputs[init_param.input_count - 1];
 }
 
 void Node::setOutputs(const operand::IndexSet &indexes)
 {
   assert(indexes.size() == 1);
 
-  ::neurun::graph::operand::IO::Index index{0};
-  _op->param().ofm_index = indexes.at(index).asInt();
+  graph::operation::Node::setOutputs(indexes);
 }
 
 } // namespace Concat
index 6c8e1bc..2821049 100644 (file)
@@ -15,23 +15,27 @@ namespace operation
 namespace Concat
 {
 
+struct Param
+{
+  int32_t axis_index;
+};
+
 class Node : public graph::operation::Node
 {
 public:
-  Node(std::unique_ptr<::internal::tflite::op::Concat::Node> &&op) : _op{std::move(op)} {}
+  Node(const graph::operation::Node::InitParam &init_param);
 
 public:
   virtual void accept(NodeVisitor &&) const override;
 
 public:
-  virtual operand::IndexSet getInputs() const override;
-  virtual operand::IndexSet getOutputs() const override { return {_op->param().ofm_index}; }
-  virtual void setInputs(const operand::IndexSet &indexes) override;
   virtual void setOutputs(const operand::IndexSet &indexes) override;
-  virtual const ::internal::tflite::op::Node *op() const override { return _op.get(); }
+
+public:
+  const Param &param() const { return _param; }
 
 private:
-  std::unique_ptr<::internal::tflite::op::Concat::Node> _op;
+  Param _param;
 };
 
 } // namespace Concat
index a158ef5..64a684a 100644 (file)
@@ -17,20 +17,42 @@ namespace Implicit
 
 void Node::accept(NodeVisitor &&v) const { v.visit(*this); }
 
+Node::Node(const graph::operation::Node::InitParam &init_param)
+{
+  assert(init_param.input_count == 7 && init_param.output_count == 1);
+
+  // Each input should be interpreted as follows:
+  //
+  //
+  //  0 -> IFM Tensor Index
+  //  1 -> Kernel Tensor Index
+  //  2 -> Bias Tensor Index
+  //  3 -> Padding Code (ANEURALNETWORKS_PADDING_SAME or ANEURALNETWORKS_PADDING_VALID) Index
+  //  4 -> Stride (width) Index
+  //  5 -> Stride (height) INdex
+  //  6 -> Activation Index
+
+  setInputs({init_param.inputs[0], init_param.inputs[1], init_param.inputs[2]});
+  setOutputs({init_param.outputs[0]});
+
+  _param.padding_index = init_param.inputs[3];
+  _param.hstride_index = init_param.inputs[4];
+  _param.vstride_index = init_param.inputs[5];
+  _param.activation_index = init_param.inputs[6];
+}
+
 void Node::setInputs(const operand::IndexSet &indexes)
 {
-  assert(indexes.size() == 1);
+  assert(indexes.size() == 3);
 
-  ::neurun::graph::operand::IO::Index index{0};
-  _op->param().ifm_index = indexes.at(index).asInt();
+  graph::operation::Node::setInputs(indexes);
 }
 
 void Node::setOutputs(const operand::IndexSet &indexes)
 {
   assert(indexes.size() == 1);
 
-  ::neurun::graph::operand::IO::Index index{0};
-  _op->param().ofm_index = indexes.at(index).asInt();
+  graph::operation::Node::setOutputs(indexes);
 }
 
 } // namespace Implicit
index 9a562bf..01b3d82 100644 (file)
@@ -17,26 +17,32 @@ namespace Conv2D
 namespace Implicit
 {
 
+struct Param
+{
+  int32_t hstride_index;
+  int32_t vstride_index;
+
+  int32_t padding_index;
+  int32_t activation_index;
+};
+
 class Node : public graph::operation::Node
 {
 public:
-  Node(std::unique_ptr<::internal::tflite::op::Conv2D::implicit::Node> &&op) : _op{std::move(op)} {}
+  Node(const graph::operation::Node::InitParam &);
 
 public:
   virtual void accept(NodeVisitor &&) const override;
 
 public:
-  virtual operand::IndexSet getInputs() const override
-  {
-    return {_op->param().ifm_index, _op->param().ker_index, _op->param().bias_index};
-  }
-  virtual operand::IndexSet getOutputs() const override { return {_op->param().ofm_index}; }
   virtual void setInputs(const operand::IndexSet &indexes) override;
   virtual void setOutputs(const operand::IndexSet &indexes) override;
-  virtual const ::internal::tflite::op::Node *op() const override { return _op.get(); }
+
+public:
+  const Param &param() const { return _param; }
 
 private:
-  std::unique_ptr<::internal::tflite::op::Conv2D::implicit::Node> _op;
+  Param _param;
 };
 
 } // namespace Implicit
index dff87d2..bf40fe8 100644 (file)
@@ -15,20 +15,35 @@ namespace FullyConnected
 
 void Node::accept(NodeVisitor &&v) const { v.visit(*this); }
 
+Node::Node(const graph::operation::Node::InitParam &init_param)
+{
+  assert(init_param.input_count == 4 && init_param.output_count == 1);
+
+  // Each input should be interpreted as follows:
+  //
+  //  0 -> A tensor, specifying the input.
+  //  1 -> A 2-D tensor, specifying the weights
+  //  2 -> A 1-D tensor, specifying the bias
+  //  3 -> An INT32 value, and has to be one of the FuseCode values
+
+  setInputs({init_param.inputs[0], init_param.inputs[1], init_param.inputs[2]});
+  setOutputs({init_param.outputs[0]});
+
+  _param.activation_index = init_param.inputs[3];
+}
+
 void Node::setInputs(const operand::IndexSet &indexes)
 {
-  assert(indexes.size() == 1);
+  assert(indexes.size() == 3);
 
-  ::neurun::graph::operand::IO::Index index{0};
-  _op->param().input_index = indexes.at(index).asInt();
+  graph::operation::Node::setInputs(indexes);
 }
 
 void Node::setOutputs(const operand::IndexSet &indexes)
 {
   assert(indexes.size() == 1);
 
-  ::neurun::graph::operand::IO::Index index{0};
-  _op->param().output_index = indexes.at(index).asInt();
+  graph::operation::Node::setOutputs(indexes);
 }
 
 } // namespace FullyConnected
index 537e329..37cf44a 100644 (file)
@@ -15,26 +15,28 @@ namespace operation
 namespace FullyConnected
 {
 
+struct Param
+{
+  int32_t activation_index;
+};
+
 class Node : public graph::operation::Node
 {
 public:
-  Node(std::unique_ptr<::internal::tflite::op::FullyConnected::Node> &&op) : _op{std::move(op)} {}
+  Node(const graph::operation::Node::InitParam &init_param);
 
 public:
   virtual void accept(NodeVisitor &&) const override;
 
 public:
-  virtual operand::IndexSet getInputs() const override
-  {
-    return {_op->param().input_index, _op->param().weight_index, _op->param().bias_index};
-  }
-  virtual operand::IndexSet getOutputs() const override { return {_op->param().output_index}; }
   virtual void setInputs(const operand::IndexSet &indexes) override;
   virtual void setOutputs(const operand::IndexSet &indexes) override;
-  virtual const ::internal::tflite::op::Node *op() const override { return _op.get(); }
+
+public:
+  const Param &param() const { return _param; }
 
 private:
-  std::unique_ptr<::internal::tflite::op::FullyConnected::Node> _op;
+  Param _param;
 };
 
 } // namespace FullyConnected
index 3759d93..5e1bf2c 100644 (file)
@@ -17,20 +17,45 @@ namespace Implicit
 
 void Node::accept(NodeVisitor &&v) const { v.visit(*this); }
 
+Node::Node(const graph::operation::Node::InitParam &init_param)
+{
+  assert(init_param.input_count == 7);
+  assert(init_param.output_count == 1);
+
+  // Each input should be interpreted as follows:
+  //
+  //  0 -> IFM Tensor Index
+  //  1 -> Padding Code (ANEURALNETWORKS_PADDING_SAME or ANEURALNETWORKS_PADDING_VALID) Index
+  //  2 -> Horizontal (over width) Stride Index
+  //  3 -> Vertial (over height) Stride Index
+  //  4 -> Filter Width Index
+  //  5 -> Filter Height Index
+  //  6 -> FuseCode (activation) Index
+
+  setInputs({init_param.inputs[0]});
+  setOutputs({init_param.outputs[0]});
+
+  _param.padding_index = init_param.inputs[1];
+  _param.hstride_index = init_param.inputs[2];
+  _param.vstride_index = init_param.inputs[3];
+
+  _param.kw_index = init_param.inputs[4];
+  _param.kh_index = init_param.inputs[5];
+  _param.activation_index = init_param.inputs[6];
+}
+
 void Node::setInputs(const operand::IndexSet &indexes)
 {
   assert(indexes.size() == 1);
 
-  ::neurun::graph::operand::IO::Index index{0};
-  _op->param().ifm_index = indexes.at(index).asInt();
+  graph::operation::Node::setInputs(indexes);
 }
 
 void Node::setOutputs(const operand::IndexSet &indexes)
 {
   assert(indexes.size() == 1);
 
-  ::neurun::graph::operand::IO::Index index{0};
-  _op->param().ofm_index = indexes.at(index).asInt();
+  graph::operation::Node::setOutputs(indexes);
 }
 
 } // namespace Implicit
index 35a2c83..11fe33a 100644 (file)
@@ -17,25 +17,35 @@ namespace MaxPool2D
 namespace Implicit
 {
 
+struct Param
+{
+  int32_t kw_index;
+  int32_t kh_index;
+
+  int32_t hstride_index;
+  int32_t vstride_index;
+
+  int32_t padding_index;
+  int32_t activation_index;
+};
+
 class Node : public graph::operation::Node
 {
 public:
-  Node(std::unique_ptr<::internal::tflite::op::MaxPool2D::implicit::Node> &&op) : _op{std::move(op)}
-  {
-  }
+  virtual void accept(NodeVisitor &&) const override;
 
 public:
-  virtual void accept(NodeVisitor &&) const override;
+  Node(const graph::operation::Node::InitParam &init_param);
 
 public:
-  virtual operand::IndexSet getInputs() const override { return {_op->param().ifm_index}; }
-  virtual operand::IndexSet getOutputs() const override { return {_op->param().ofm_index}; }
   virtual void setInputs(const operand::IndexSet &indexes) override;
   virtual void setOutputs(const operand::IndexSet &indexes) override;
-  virtual const ::internal::tflite::op::Node *op() const override { return _op.get(); }
+
+public:
+  const Param &param() const { return _param; }
 
 private:
-  std::unique_ptr<::internal::tflite::op::MaxPool2D::implicit::Node> _op;
+  Param _param;
 };
 
 } // namespace Implicit
index 643be8c..d335f55 100644 (file)
@@ -13,48 +13,6 @@ namespace NOP
 
 void Node::accept(NodeVisitor &&v) const { v.visit(*this); }
 
-operand::IndexSet Node::getInputs() const
-{
-  operand::IndexSet set;
-  for (auto index : _op->param().ifm_indexes)
-  {
-    operand::Index ind{index};
-    set.append({ind});
-  }
-  return set;
-}
-
-operand::IndexSet Node::getOutputs() const
-{
-  operand::IndexSet set;
-  for (auto index : _op->param().ofm_indexes)
-  {
-    operand::Index ind{index};
-    set.append({ind});
-  }
-  return set;
-}
-
-void Node::setInputs(const operand::IndexSet &indexes)
-{
-  std::vector<int32_t> inds;
-  for (auto index : indexes.list())
-  {
-    inds.emplace_back(index.asInt());
-  }
-  _op->param().ifm_indexes = inds;
-}
-
-void Node::setOutputs(const operand::IndexSet &indexes)
-{
-  std::vector<int32_t> inds;
-  for (auto index : indexes.list())
-  {
-    inds.emplace_back(index.asInt());
-  }
-  _op->param().ofm_indexes = inds;
-}
-
 } // namespace NOP
 } // namespace operation
 } // namespace graph
index e367aab..1f861f2 100644 (file)
@@ -18,20 +18,10 @@ namespace NOP
 class Node : public graph::operation::Node
 {
 public:
-  Node(std::unique_ptr<::internal::tflite::op::NOP::Node> &&op) : _op{std::move(op)} {}
+  Node(const graph::operation::Node::InitParam &) {}
 
 public:
   virtual void accept(NodeVisitor &&) const override;
-
-public:
-  virtual operand::IndexSet getInputs() const override;
-  virtual operand::IndexSet getOutputs() const override;
-  virtual void setInputs(const operand::IndexSet &indexes) override;
-  virtual void setOutputs(const operand::IndexSet &indexes) override;
-  virtual const ::internal::tflite::op::Node *op() const override { return _op.get(); }
-
-private:
-  std::unique_ptr<::internal::tflite::op::NOP::Node> _op;
 };
 
 } // namespace NOP
index 318234a..035b969 100644 (file)
@@ -20,24 +20,31 @@ struct NodeVisitor;
 class Node
 {
 public:
-  virtual ~Node() = default;
+  struct InitParam
+  {
+    uint32_t input_count;
+    const uint32_t *inputs;
+    uint32_t output_count;
+    const uint32_t *outputs;
+  };
 
 public:
   virtual void accept(NodeVisitor &&) const = 0;
 
 public:
-  virtual operand::IndexSet getInputs() const = 0;
-  virtual operand::IndexSet getOutputs() const = 0;
+  virtual const operand::IndexSet &getInputs() const { return _inputs; }
+  virtual const operand::IndexSet &getOutputs() const { return _outputs; }
   // It's for only input/output tensors but const data.
-  virtual void setInputs(const operand::IndexSet &indexes) = 0;
-  virtual void setOutputs(const operand::IndexSet &indexes) = 0;
-  virtual const ::internal::tflite::op::Node *op() const = 0;
+  virtual void setInputs(const operand::IndexSet &indexes) { _inputs = indexes; }
+  virtual void setOutputs(const operand::IndexSet &indexes) { _outputs = indexes; }
 
 public:
   void lower_info(std::unique_ptr<LowerInfo> &&lower_info) { _lower_info = std::move(lower_info); }
   const LowerInfo *lower_info() const { return _lower_info.get(); }
 
 private:
+  operand::IndexSet _inputs;
+  operand::IndexSet _outputs;
   std::unique_ptr<LowerInfo> _lower_info;
 };
 
index b0dc394..536a323 100644 (file)
@@ -15,20 +15,34 @@ namespace Reshape
 
 void Node::accept(NodeVisitor &&v) const { v.visit(*this); }
 
+Node::Node(const graph::operation::Node::InitParam &init_param)
+{
+  assert(init_param.input_count == 2 && init_param.output_count == 1);
+
+  // Each input should be interpreted as follows:
+  //
+  //  0 -> A tensor, specifying the tensor to be reshaped.
+  //  1 -> A 1-D tensor of type ANEURALNETWORKS_TENSOR_INT32, defining the shape of the output
+  //  tensor
+
+  setInputs({init_param.inputs[0]});
+  setOutputs({init_param.outputs[0]});
+
+  _param.shape_index = init_param.inputs[1];
+}
+
 void Node::setInputs(const operand::IndexSet &indexes)
 {
   assert(indexes.size() == 1);
 
-  ::neurun::graph::operand::IO::Index index{0};
-  _op->param().input_index = indexes.at(index).asInt();
+  graph::operation::Node::setInputs(indexes);
 }
 
 void Node::setOutputs(const operand::IndexSet &indexes)
 {
   assert(indexes.size() == 1);
 
-  ::neurun::graph::operand::IO::Index index{0};
-  _op->param().output_index = indexes.at(index).asInt();
+  graph::operation::Node::setOutputs(indexes);
 }
 
 } // namespace Reshape
index ac9faa8..4587c16 100644 (file)
@@ -15,26 +15,28 @@ namespace operation
 namespace Reshape
 {
 
+struct Param
+{
+  int32_t shape_index;
+};
+
 class Node : public graph::operation::Node
 {
 public:
-  Node(std::unique_ptr<::internal::tflite::op::Reshape::Node> &&op) : _op{std::move(op)} {}
+  virtual void accept(NodeVisitor &&) const override;
 
 public:
-  virtual void accept(NodeVisitor &&) const override;
+  Node(const graph::operation::Node::InitParam &init_param);
 
 public:
-  virtual operand::IndexSet getInputs() const override
-  {
-    return {_op->param().input_index, _op->param().shape_index};
-  }
-  virtual operand::IndexSet getOutputs() const override { return {_op->param().output_index}; }
   virtual void setInputs(const operand::IndexSet &indexes) override;
   virtual void setOutputs(const operand::IndexSet &indexes) override;
-  virtual const ::internal::tflite::op::Node *op() const override { return _op.get(); }
+
+public:
+  const Param &param() const { return _param; }
 
 private:
-  std::unique_ptr<::internal::tflite::op::Reshape::Node> _op;
+  Param _param;
 };
 
 } // namespace Reshape
index a7824d4..913a632 100644 (file)
@@ -15,20 +15,33 @@ namespace Softmax
 
 void Node::accept(NodeVisitor &&v) const { v.visit(*this); }
 
+Node::Node(const graph::operation::Node::InitParam &init_param)
+{
+  assert(init_param.input_count == 2 && init_param.output_count == 1);
+
+  // Each input should be interpreted as follows:
+  //
+  //  0 -> A 2-D or 4-D tensor, specifying the tensor to be reshaped.
+  //  1 ->  FLOAT32 value, specifying the positive scaling factor for the exponent, beta.
+
+  setInputs({init_param.inputs[0]});
+  setOutputs({init_param.outputs[0]});
+
+  _param.scale_index = init_param.inputs[1];
+}
+
 void Node::setInputs(const operand::IndexSet &indexes)
 {
   assert(indexes.size() == 1);
 
-  ::neurun::graph::operand::IO::Index index{0};
-  _op->param().input_index = indexes.at(index).asInt();
+  graph::operation::Node::setInputs(indexes);
 }
 
 void Node::setOutputs(const operand::IndexSet &indexes)
 {
   assert(indexes.size() == 1);
 
-  ::neurun::graph::operand::IO::Index index{0};
-  _op->param().output_index = indexes.at(index).asInt();
+  graph::operation::Node::setOutputs(indexes);
 }
 
 } // namespace Softmax
index b1d255c..147e8dc 100644 (file)
@@ -15,23 +15,28 @@ namespace operation
 namespace Softmax
 {
 
+struct Param
+{
+  int32_t scale_index;
+};
+
 class Node : public graph::operation::Node
 {
 public:
-  Node(std::unique_ptr<::internal::tflite::op::Softmax::Node> &&op) : _op{std::move(op)} {}
+  virtual void accept(NodeVisitor &&) const override;
 
 public:
-  virtual void accept(NodeVisitor &&) const override;
+  Node(const graph::operation::Node::InitParam &init_param);
 
 public:
-  virtual operand::IndexSet getInputs() const override { return {_op->param().input_index}; }
-  virtual operand::IndexSet getOutputs() const override { return {_op->param().output_index}; }
   virtual void setInputs(const operand::IndexSet &indexes) override;
   virtual void setOutputs(const operand::IndexSet &indexes) override;
-  virtual const ::internal::tflite::op::Node *op() const override { return _op.get(); }
+
+public:
+  const Param &param() const { return _param; }
 
 private:
-  std::unique_ptr<::internal::tflite::op::Softmax::Node> _op;
+  Param _param;
 };
 
 } // namespace Softmax
index b468067..23b4123 100644 (file)
@@ -21,9 +21,9 @@
 // NOTE The relation between "Internal Name" and "NN API Name" is "1 : N".
 
 // Internal Name       | NN API Name
-OP(Conv2D::implicit    , CONV_2D)
-OP(AvgPool2D::implicit , AVERAGE_POOL_2D)
-OP(MaxPool2D::implicit , MAX_POOL_2D)
+OP(Conv2D::Implicit    , CONV_2D)
+OP(AvgPool2D::Implicit , AVERAGE_POOL_2D)
+OP(MaxPool2D::Implicit , MAX_POOL_2D)
 OP(Concat              , CONCATENATION)
 OP(FullyConnected      , FULLY_CONNECTED)
 OP(Reshape             , RESHAPE)
index d8be62e..f20a010 100644 (file)
@@ -20,16 +20,13 @@ Linear::Linear(const graph::Graph &graph)
   //   2. Append the node to vector when DFS for the node finishes(post order)
   //   3. Reverse the order of nodes
 
-  graph::Graph::PostDfsConstIterator().iterate(graph,
-                                               [&](const neurun::graph::operation::Node &node) {
-                                                 auto op = node.op();
-                                                 _operations.emplace_back(op);
-                                               });
+  graph::Graph::PostDfsConstIterator().iterate(
+      graph, [&](const neurun::graph::operation::Node &node) { _operations.emplace_back(&node); });
 
   std::reverse(std::begin(_operations), std::end(_operations));
 }
 
-void Linear::accept(::internal::tflite::op::NodeVisitor &&visitor) const
+void Linear::accept(graph::operation::NodeVisitor &&visitor) const
 {
   for (const auto op : _operations)
   {
index 863101f..a8a9a3e 100644 (file)
@@ -3,18 +3,18 @@
 
 #include <vector>
 
-#include "internal/op/Node.h"
+#include "graph/operation/Node.h"
 
-namespace internal
+namespace neurun
 {
-namespace tflite
+namespace graph
 {
-namespace op
+namespace operation
 {
 struct NodeVisitor;
-} // namespace op
-} // namespace tflite
-} // namespace internal
+} // namespace operation
+} // namespace graph
+} // namespace neurun
 
 namespace neurun
 {
@@ -37,7 +37,7 @@ namespace neurun
 namespace linear
 {
 
-class Linear : ::internal::tflite::op::Node
+class Linear
 {
 public:
   Linear(const graph::Graph &graph);
@@ -46,14 +46,14 @@ public:
   Linear(const Linear &linear) = delete;
 
 public:
-  virtual void accept(::internal::tflite::op::NodeVisitor &&) const;
+  void accept(graph::operation::NodeVisitor &&visitor) const;
 
   // TODO Remove this since tensor marking will be replaced with another way
   virtual void markTensors(neurun::codegen::BackendResolver &) const;
 
 public:
 private:
-  std::vector<const ::internal::tflite::op::Node *> _operations;
+  std::vector<const graph::operation::Node *> _operations;
 };
 
 } // namespace linear
index 1ef4bf1..60f5cb6 100644 (file)
@@ -17,67 +17,27 @@ namespace
 class MockNode : public neurun::graph::operation::Node
 {
 public:
-  MockNode(Index input, Index output) : _input{input}, _output{output}
+  MockNode(Index input, Index output)
   {
-    // DO NOTHING
+    setInputs({input});
+    setOutputs({output});
   }
 
 public:
   virtual void accept(neurun::graph::operation::NodeVisitor &&) const override {}
-
-public:
-  virtual IndexSet getInputs() const override { return {_input}; }
-  virtual IndexSet getOutputs() const override { return {_output}; }
-  virtual void setInputs(const IndexSet &indexes) override { _input = indexes.at(IOIndex{0}); }
-  virtual void setOutputs(const IndexSet &indexes) override { _output = indexes.at(IOIndex{0}); }
-  virtual const ::internal::tflite::op::Node *op() const override { return nullptr; }
-
-private:
-  Index _input;
-  Index _output;
 };
 
 class MultiInputMockNode : public neurun::graph::operation::Node
 {
 public:
-  MultiInputMockNode(IndexSet inputs, Index output) : _output{output}
+  MultiInputMockNode(IndexSet inputs, Index output)
   {
-    for (auto index : inputs.list())
-    {
-      _inputs.emplace_back(index);
-    }
+    setInputs(inputs);
+    setOutputs({output});
   }
 
 public:
   virtual void accept(neurun::graph::operation::NodeVisitor &&) const override {}
-
-public:
-  virtual IndexSet getInputs() const override
-  {
-    IndexSet set;
-    for (auto index : _inputs)
-    {
-      set.append({index});
-    }
-    return set;
-  }
-
-  virtual IndexSet getOutputs() const override { return {_output}; }
-  virtual void setInputs(const IndexSet &indexes) override
-  {
-    std::vector<Index> inputs;
-    for (auto index : indexes.list())
-    {
-      inputs.emplace_back(index);
-    }
-    _inputs = inputs;
-  }
-  virtual void setOutputs(const IndexSet &indexes) override { _output = indexes.at(IOIndex{0}); }
-  virtual const ::internal::tflite::op::Node *op() const override { return nullptr; }
-
-private:
-  std::vector<Index> _inputs;
-  Index _output;
 };
 
 } // namespace anonymous
index ced5bd2..9b67402 100644 (file)
@@ -9,23 +9,20 @@ using neurun::graph::operation::Index;
 class TestNode : public Node
 {
 public:
-  TestNode() = default;
+  TestNode(const Node::InitParam &)
+  {
+    setInputs({1, 2, 3, 4});
+    setOutputs({5, 6, 7});
+  }
 
 public:
   virtual void accept(neurun::graph::operation::NodeVisitor &&) const override {}
-
-public:
-  virtual neurun::graph::operand::IndexSet getInputs() const { return {1, 2, 3, 4}; }
-  virtual neurun::graph::operand::IndexSet getOutputs() const { return {1, 2, 3}; }
-  virtual void setInputs(const neurun::graph::operand::IndexSet &indexes) override {}
-  virtual void setOutputs(const neurun::graph::operand::IndexSet &indexes) override {}
-  virtual const ::internal::tflite::op::Node *op() const { return nullptr; }
 };
 
 TEST(graph_operation_Set, operation_test)
 {
   Set set;
-  set.append(std::unique_ptr<Node>(new TestNode()));
+  set.append(std::unique_ptr<Node>(new TestNode(Node::InitParam{0, nullptr, 0, nullptr})));
   Index idx{0u};
   ASSERT_EQ(set.at(idx).getInputs().size(), 4);
   ASSERT_EQ(set.at(idx).getOutputs().size(), 3);
index 9ca1f93..e7b1a76 100644 (file)
@@ -11,6 +11,7 @@
 
 using Index = neurun::graph::operand::IO::Index;
 using IndexSet = neurun::graph::operand::IndexSet;
+using GraphNodeInitParam = neurun::graph::operation::Node::InitParam;
 
 TEST(graph_operation_setIO, operation_setIO_conv)
 {
@@ -28,15 +29,11 @@ TEST(graph_operation_setIO, operation_setIO_conv)
   }
   uint32_t outoperand = graph.addOperand(shape, type).asInt();
 
-  using Param = internal::tflite::op::Conv2D::implicit::Param;
-  using Node = internal::tflite::op::Conv2D::implicit::Node;
   using GraphNode = neurun::graph::operation::Conv2D::Implicit::Node;
 
-  auto conv = nnfw::make_unique<GraphNode>(
-      nnfw::make_unique<Node>(Param(7, params.data(), 1, &outoperand)));
-
+  auto conv = nnfw::make_unique<GraphNode>(GraphNodeInitParam{7, params.data(), 1, &outoperand});
   ASSERT_EQ(conv->getInputs().at(Index{0}).asInt(), params[0]);
-  conv->setInputs({8});
+  conv->setInputs({8, 9, 10});
   ASSERT_NE(conv->getInputs().at(Index{0}).asInt(), params[0]);
   ASSERT_EQ(conv->getInputs().at(Index{0}).asInt(), 8);
 }
@@ -57,12 +54,9 @@ TEST(graph_operation_setIO, operation_setIO_concat)
   }
   uint32_t outoperand = graph.addOperand(shape, type).asInt();
 
-  using Param = internal::tflite::op::Concat::Param;
-  using Node = internal::tflite::op::Concat::Node;
   using GraphNode = neurun::graph::operation::Concat::Node;
 
-  auto concat = nnfw::make_unique<GraphNode>(
-      nnfw::make_unique<Node>(Param(7, params.data(), 1, &outoperand)));
+  auto concat = nnfw::make_unique<GraphNode>(GraphNodeInitParam{7, params.data(), 1, &outoperand});
 
   ASSERT_EQ(concat->getInputs().size(), 6);
   ASSERT_EQ(concat->getInputs().at(Index{0}).asInt(), params[0]);
index 55b0dae..220ed71 100644 (file)
@@ -8,25 +8,14 @@
 class MockNode : public neurun::graph::operation::Node
 {
 public:
-  MockNode(neurun::graph::operand::Index input, neurun::graph::operand::Index output)
-      : _input{input}, _output{output}
+  MockNode(const neurun::graph::operand::Index &input, const neurun::graph::operand::Index &output)
   {
-    // DO NOTHING
+    setInputs({input});
+    setOutputs({output});
   }
 
 public:
   virtual void accept(neurun::graph::operation::NodeVisitor &&) const override {}
-
-public:
-  virtual neurun::graph::operand::IndexSet getInputs() const override { return {_input}; }
-  virtual neurun::graph::operand::IndexSet getOutputs() const override { return {_output}; }
-  virtual void setInputs(const neurun::graph::operand::IndexSet &indexes) override {}
-  virtual void setOutputs(const neurun::graph::operand::IndexSet &indexes) override {}
-  virtual const ::internal::tflite::op::Node *op() const override { return nullptr; }
-
-private:
-  neurun::graph::operand::Index _input;
-  neurun::graph::operand::Index _output;
 };
 
 TEST(Verifier, dag_checker)