[neurun] Fix Graph Verifier visit check (#3722)
author이한종/동작제어Lab(SR)/Engineer/삼성전자 <hanjoung.lee@samsung.com>
Tue, 27 Nov 2018 22:11:41 +0000 (07:11 +0900)
committer박세희/동작제어Lab(SR)/Principal Engineer/삼성전자 <saehie.park@samsung.com>
Tue, 27 Nov 2018 22:11:41 +0000 (07:11 +0900)
Visit and OnStack checking assumed ID range as vector which is wrong.
This commit changes variable `visit` and `on_stack` to be a map so it
can correctly check nodes for sure.

In the same manner with #3721

Signed-off-by: Hanjoung Lee <hanjoung.lee@samsung.com>
runtimes/neurun/src/graph/verifier/Verifier.cc

index 18c706d..4de61b8 100644 (file)
@@ -35,17 +35,21 @@ bool DAGChecker::verify(const Graph &graph) const
 {
   auto &operations = graph.operations();
   bool cyclic = false;
-  std::vector<bool> visited(operations.size(), false);
-  std::vector<bool> on_stack(operations.size(), false);
+
+  std::unordered_map<operation::Index, bool> visited;
+  operations.iterate([&](const graph::operation::Index &index, const operation::Node &) {
+    visited[index] = false;
+  });
+  std::unordered_map<operation::Index, bool> on_stack = visited; // Copy from visited
 
   std::function<void(const operation::Index &index, const operation::Node &)> dfs_recursive =
       [&](const operation::Index &index, const operation::Node &node) -> void {
-    if (on_stack[index.value()])
+    if (on_stack[index])
       cyclic = true;
-    if (visited[index.value()])
+    if (visited[index])
       return;
-    visited[index.value()] = true;
-    on_stack[index.value()] = true;
+    visited[index] = true;
+    on_stack[index] = true;
 
     for (auto output : node.getOutputs())
     {
@@ -56,7 +60,7 @@ bool DAGChecker::verify(const Graph &graph) const
       }
     }
 
-    on_stack[index.value()] = false;
+    on_stack[index] = false;
   };
 
   operations.iterate(dfs_recursive);