1 /*
2 * Copyright (c) 2018 Arm Limited.
3 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24 #include "arm_compute/graph/INode.h"
25
26 #include "arm_compute/core/Error.h"
27 #include "arm_compute/graph/Edge.h"
28 #include "arm_compute/graph/Graph.h"
29 #include "arm_compute/graph/Tensor.h"
30
31 namespace arm_compute
32 {
33 namespace graph
34 {
35 // *INDENT-OFF*
36 // clang-format off
INode()37 INode::INode()
38 : _graph(nullptr), _id(EmptyNodeID), _common_params({ "", Target::UNSPECIFIED}),
39 _outputs(), _input_edges(), _output_edges(), _assigned_target(Target::UNSPECIFIED)
40 {
41 }
42 // clang-format on
43 // *INDENT-ON*
44
validate() const45 Status INode::validate() const
46 {
47 return Status{};
48 }
49
set_graph(Graph * g)50 void INode::set_graph(Graph *g)
51 {
52 ARM_COMPUTE_ERROR_ON(g == nullptr);
53 _graph = g;
54 }
55
set_id(NodeID id)56 void INode::set_id(NodeID id)
57 {
58 _id = id;
59 }
60
set_common_node_parameters(NodeParams common_params)61 void INode::set_common_node_parameters(NodeParams common_params)
62 {
63 _common_params = std::move(common_params);
64 }
65
set_requested_target(Target target)66 void INode::set_requested_target(Target target)
67 {
68 _common_params.target = target;
69 }
70
set_assigned_target(Target target)71 void INode::set_assigned_target(Target target)
72 {
73 _assigned_target = target;
74 }
75
set_output_tensor(TensorID tid,size_t idx)76 void INode::set_output_tensor(TensorID tid, size_t idx)
77 {
78 if(tid != NullTensorID && (idx < _outputs.size()) && (_graph->tensor(tid) != nullptr))
79 {
80 ARM_COMPUTE_ERROR_ON(_graph == nullptr);
81 Tensor *updated_tensor = _graph->tensor(tid);
82 _outputs[idx] = tid;
83
84 // Set tensor to all output edges of the node
85 for(auto &output_edge_id : _output_edges)
86 {
87 auto output_edge = _graph->edge(output_edge_id);
88 if(output_edge != nullptr)
89 {
90 // Unbind edge from current tensor
91 auto current_output_tensor = output_edge->tensor();
92 current_output_tensor->unbind_edge(output_edge->id());
93
94 // Update tensor to edge and rebind tensor
95 output_edge->update_bound_tensor(updated_tensor);
96 updated_tensor->bind_edge(output_edge->id());
97 }
98 }
99 }
100 }
101
id() const102 NodeID INode::id() const
103 {
104 return _id;
105 }
106
name() const107 std::string INode::name() const
108 {
109 return _common_params.name;
110 }
111
graph() const112 const Graph *INode::graph() const
113 {
114 return _graph;
115 }
116
graph()117 Graph *INode::graph()
118 {
119 return _graph;
120 }
121
outputs() const122 const std::vector<TensorID> &INode::outputs() const
123 {
124 return _outputs;
125 }
126
input_edges() const127 const std::vector<EdgeID> &INode::input_edges() const
128 {
129 return _input_edges;
130 }
131
output_edges() const132 const std::set<EdgeID> &INode::output_edges() const
133 {
134 return _output_edges;
135 }
136
input_id(size_t idx) const137 TensorID INode::input_id(size_t idx) const
138 {
139 ARM_COMPUTE_ERROR_ON(idx >= _input_edges.size());
140 Edge *e = _graph->edge(_input_edges[idx]);
141 return (e != nullptr) ? e->tensor_id() : NullTensorID;
142 }
143
output_id(size_t idx) const144 TensorID INode::output_id(size_t idx) const
145 {
146 ARM_COMPUTE_ERROR_ON(idx >= _outputs.size());
147 return _outputs[idx];
148 }
149
input(size_t idx) const150 Tensor *INode::input(size_t idx) const
151 {
152 ARM_COMPUTE_ERROR_ON(_graph == nullptr);
153 ARM_COMPUTE_ERROR_ON(idx >= _input_edges.size());
154 Edge *e = _graph->edge(_input_edges[idx]);
155 return (e != nullptr) ? e->tensor() : nullptr;
156 }
157
output(size_t idx) const158 Tensor *INode::output(size_t idx) const
159 {
160 ARM_COMPUTE_ERROR_ON(_graph == nullptr);
161 ARM_COMPUTE_ERROR_ON(idx >= _outputs.size());
162 return _graph->tensor(_outputs[idx]);
163 }
164
input_edge_id(size_t idx) const165 EdgeID INode::input_edge_id(size_t idx) const
166 {
167 ARM_COMPUTE_ERROR_ON(idx >= _input_edges.size());
168 return _input_edges[idx];
169 }
170
input_edge(size_t idx) const171 Edge *INode::input_edge(size_t idx) const
172 {
173 ARM_COMPUTE_ERROR_ON(_graph == nullptr);
174 ARM_COMPUTE_ERROR_ON(idx >= _input_edges.size());
175 return _graph->edge(_input_edges[idx]);
176 }
177
num_inputs() const178 size_t INode::num_inputs() const
179 {
180 return _input_edges.size();
181 }
182
num_outputs() const183 size_t INode::num_outputs() const
184 {
185 return _outputs.size();
186 }
187
common_node_params() const188 NodeParams INode::common_node_params() const
189 {
190 return _common_params;
191 }
192
requested_target() const193 Target INode::requested_target() const
194 {
195 return _common_params.target;
196 }
197
assigned_target() const198 Target INode::assigned_target() const
199 {
200 return _assigned_target;
201 }
202 } // namespace graph
203 } // namespace arm_compute