ONE - On-device Neural Engine
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
onert::ir::verifier::DAGChecker Class Reference

#include <Verifier.h>

Collaboration diagram for onert::ir::verifier::DAGChecker:

Public Member Functions

bool verify (const Graph &graph) const noexcept override
 
bool verify (const train::UseDefChains &training_defuses) const noexcept
 
- Public Member Functions inherited from onert::ir::verifier::IVerifier
virtual ~IVerifier ()=default
 

Detailed Description

Definition at line 41 of file Verifier.h.

Member Function Documentation

◆ verify() [1/2]

bool onert::ir::verifier::DAGChecker::verify ( const Graph graph) const
overridevirtualnoexcept

Implements onert::ir::verifier::IVerifier.

Definition at line 88 of file Verifier.cc.

89{
90 auto &operations = graph.operations();
91 bool cyclic = false;
92
94 operations.iterate(
95 [&](const OperationIndex &index, const IOperation &) { visited[index] = false; });
96 OperationIndexMap<bool> on_stack = visited; // Copy from visited
97
98 std::function<void(const OperationIndex &index, const IOperation &)> dfs_recursive =
99 [&](const OperationIndex &index, const IOperation &node) -> void {
100 if (on_stack[index])
101 cyclic = true;
102 if (visited[index])
103 return;
104 visited[index] = true;
105 on_stack[index] = true;
106
107 for (auto &&output : node.getOutputs() | Remove::DUPLICATED | Remove::UNDEFINED)
108 {
109 const auto &operand = graph.operands().at(output);
110 for (const auto &use : operand.getUses())
111 {
112 dfs_recursive(use, graph.operations().at(use));
113 }
114 }
115
116 on_stack[index] = false;
117 };
118
119 operations.iterate(dfs_recursive);
120
121 return !cyclic;
122}
loco::GraphInputIndex index(const TFPlaceholder *node)
Definition TFNode.cpp:54
std::unordered_map< OperationIndex, T > OperationIndexMap

References onert::ir::DUPLICATED, and onert::ir::UNDEFINED.

◆ verify() [2/2]

bool onert::ir::verifier::DAGChecker::verify ( const train::UseDefChains training_defuses) const
noexcept

Definition at line 125 of file Verifier.cc.

126{
127 bool cyclic = false;
128 const auto operations = extractOperations(training_usedefs);
129 auto outputs_map = extractNodeOutputs(training_usedefs);
130
131 std::unordered_map<train::TrainingOperationIndex, bool> visited;
132 for (const auto &node_index : operations)
133 visited[node_index] = false;
134 auto on_stack = visited; // Copy from visited
135
136 std::function<void(const train::TrainingOperationIndex &index)> dfs_recursive =
137 [&](const train::TrainingOperationIndex &index) -> void {
138 if (on_stack[index])
139 cyclic = true;
140 if (visited[index])
141 return;
142 visited[index] = true;
143 on_stack[index] = true;
144
145 auto &node_outputs = outputs_map[index];
146 for (const auto &output : node_outputs)
147 {
148 const auto &uses = training_usedefs.at(output).getTrainingUses();
149 for (const auto &use : uses)
150 {
151 dfs_recursive(use);
152 }
153 }
154
155 on_stack[index] = false;
156 };
157
158 for (const auto &node_index : operations)
159 dfs_recursive(node_index);
160
161 return !cyclic;
162}
Class that provides index of tensor for training.
Definition Index.h:34

The documentation for this class was generated from the following files: