[Compiler] Preserve connection order in multi-out realizer
authorDonghyeon Jeong <dhyeon.jeong@samsung.com>
Wed, 2 Aug 2023 05:15:51 +0000 (14:15 +0900)
committerJijoong Moon <jijoong.moon@samsung.com>
Mon, 21 Aug 2023 06:29:23 +0000 (15:29 +0900)
Create multiout nodes with a given connection order in building a frequency map.

Signed-off-by: Donghyeon Jeong <dhyeon.jeong@samsung.com>
nntrainer/layers/layer_node.cpp
test/unittest/compiler/unittest_realizer.cpp

index 776430b..2e9b2c2 100644 (file)
@@ -162,7 +162,6 @@ LayerNode::LayerNode(std::unique_ptr<nntrainer::Layer> &&l) :
   needs_calc_derivative(false),
   needs_calc_gradient(false),
   output_connections(),
-  tensor_type(TensorDim::Format::NCHW),
   run_context(nullptr),
   layer_node_props(
     new PropsType(props::Name(), props::Distribute(), props::Trainable(), {},
index 1696cd3..5759fa0 100644 (file)
@@ -778,6 +778,28 @@ TEST(MultioutRealizer, multiout_p) {
     EXPECT_NO_THROW(realizeAndEqual(r, before, after));
   }
 
+  { // source has single output, all are referred multiple times
+    std::vector<LayerRepresentation> before = {
+      {"split", {"name=a", "input_shape=1:1:1:2", "axis=3"}},
+      {"fully_connected", {"name=b", "input_layers=a"}},
+      {"fully_connected", {"name=c", "input_layers=a(0)"}},
+      {"fully_connected", {"name=d", "input_layers=a(1)"}},
+      {"fully_connected", {"name=e", "input_layers=a(1)"}},
+    };
+    std::vector<LayerRepresentation> after = {
+      {"split", {"name=a", "input_shape=1:1:1:2", "axis=3"}},
+      {"multiout", {"name=a/generated_out_0", "input_layers=a(0)"}},
+      {"multiout", {"name=a/generated_out_1", "input_layers=a(1)"}},
+      {"fully_connected", {"name=b", "input_layers=a/generated_out_0(0)"}},
+      {"fully_connected", {"name=c", "input_layers=a/generated_out_0(1)"}},
+      {"fully_connected", {"name=d", "input_layers=a/generated_out_1(0)"}},
+      {"fully_connected", {"name=e", "input_layers=a/generated_out_1(1)"}},
+    };
+
+    MultioutRealizer r;
+    EXPECT_NO_THROW(realizeAndEqual(r, before, after));
+  }
+
   { // source has single output, some are referred multiple times
     std::vector<LayerRepresentation> before = {
       {"split", {"name=a", "input_shape=1:1:1:2", "axis=3"}},