blob: e5b4adda26ffcb925aa5687c865fc132ffe64a01 [file] [log] [blame]
Anthony Barbier2a07e182017-08-04 18:20:27 +01001/*
Sheri Zhangc65023e2021-11-03 21:24:00 +00002 * Copyright (c) 2018,2021 Arm Limited.
Anthony Barbier2a07e182017-08-04 18:20:27 +01003 *
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 */
Anthony Barbier2a07e182017-08-04 18:20:27 +010024#include "arm_compute/graph/INode.h"
25
Georgios Pinitasd9eb2752018-04-03 13:44:29 +010026#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"
Anthony Barbier2a07e182017-08-04 18:20:27 +010030
Georgios Pinitasd9eb2752018-04-03 13:44:29 +010031namespace arm_compute
Anthony Barbier2a07e182017-08-04 18:20:27 +010032{
Georgios Pinitasd9eb2752018-04-03 13:44:29 +010033namespace graph
34{
35// *INDENT-OFF*
36// clang-format off
37INode::INode()
38 : _graph(nullptr), _id(EmptyNodeID), _common_params({ "", Target::UNSPECIFIED}),
39 _outputs(), _input_edges(), _output_edges(), _assigned_target(Target::UNSPECIFIED)
Sheri Zhangc65023e2021-11-03 21:24:00 +000040 ,_post_op_info_list(std::list<std::unique_ptr<ConvPostOpInfo>> {})
Georgios Pinitasd9eb2752018-04-03 13:44:29 +010041{
42}
43// clang-format on
44// *INDENT-ON*
45
Georgios Pinitascac13b12018-04-27 19:07:19 +010046Status INode::validate() const
47{
48 return Status{};
49}
50
Georgios Pinitasd9eb2752018-04-03 13:44:29 +010051void INode::set_graph(Graph *g)
52{
53 ARM_COMPUTE_ERROR_ON(g == nullptr);
54 _graph = g;
55}
56
57void INode::set_id(NodeID id)
58{
59 _id = id;
60}
61
62void INode::set_common_node_parameters(NodeParams common_params)
63{
64 _common_params = std::move(common_params);
65}
66
67void INode::set_requested_target(Target target)
68{
69 _common_params.target = target;
70}
71
72void INode::set_assigned_target(Target target)
73{
74 _assigned_target = target;
75}
76
77void INode::set_output_tensor(TensorID tid, size_t idx)
78{
79 if(tid != NullTensorID && (idx < _outputs.size()) && (_graph->tensor(tid) != nullptr))
Anthony Barbier2a07e182017-08-04 18:20:27 +010080 {
Georgios Pinitasd9eb2752018-04-03 13:44:29 +010081 ARM_COMPUTE_ERROR_ON(_graph == nullptr);
82 Tensor *updated_tensor = _graph->tensor(tid);
83 _outputs[idx] = tid;
84
85 // Set tensor to all output edges of the node
86 for(auto &output_edge_id : _output_edges)
87 {
88 auto output_edge = _graph->edge(output_edge_id);
89 if(output_edge != nullptr)
90 {
91 // Unbind edge from current tensor
92 auto current_output_tensor = output_edge->tensor();
93 current_output_tensor->unbind_edge(output_edge->id());
94
95 // Update tensor to edge and rebind tensor
96 output_edge->update_bound_tensor(updated_tensor);
97 updated_tensor->bind_edge(output_edge->id());
98 }
99 }
Anthony Barbier2a07e182017-08-04 18:20:27 +0100100 }
Anthony Barbier2a07e182017-08-04 18:20:27 +0100101}
Georgios Pinitasd9eb2752018-04-03 13:44:29 +0100102
103NodeID INode::id() const
Michele Di Giorgiodde9ec92018-02-13 15:24:04 +0000104{
Georgios Pinitasd9eb2752018-04-03 13:44:29 +0100105 return _id;
Michele Di Giorgiodde9ec92018-02-13 15:24:04 +0000106}
Georgios Pinitasd9eb2752018-04-03 13:44:29 +0100107
108std::string INode::name() const
Michele Di Giorgiodde9ec92018-02-13 15:24:04 +0000109{
Georgios Pinitasd9eb2752018-04-03 13:44:29 +0100110 return _common_params.name;
Michele Di Giorgiodde9ec92018-02-13 15:24:04 +0000111}
Georgios Pinitasd9eb2752018-04-03 13:44:29 +0100112
113const Graph *INode::graph() const
Anthony Barbier2a07e182017-08-04 18:20:27 +0100114{
Georgios Pinitasd9eb2752018-04-03 13:44:29 +0100115 return _graph;
Anthony Barbier2a07e182017-08-04 18:20:27 +0100116}
Georgios Pinitasd9eb2752018-04-03 13:44:29 +0100117
118Graph *INode::graph()
119{
120 return _graph;
121}
122
123const std::vector<TensorID> &INode::outputs() const
124{
125 return _outputs;
126}
127
128const std::vector<EdgeID> &INode::input_edges() const
129{
130 return _input_edges;
131}
132
133const std::set<EdgeID> &INode::output_edges() const
134{
135 return _output_edges;
136}
137
138TensorID INode::input_id(size_t idx) const
139{
140 ARM_COMPUTE_ERROR_ON(idx >= _input_edges.size());
141 Edge *e = _graph->edge(_input_edges[idx]);
142 return (e != nullptr) ? e->tensor_id() : NullTensorID;
143}
144
145TensorID INode::output_id(size_t idx) const
146{
147 ARM_COMPUTE_ERROR_ON(idx >= _outputs.size());
148 return _outputs[idx];
149}
150
151Tensor *INode::input(size_t idx) const
152{
153 ARM_COMPUTE_ERROR_ON(_graph == nullptr);
154 ARM_COMPUTE_ERROR_ON(idx >= _input_edges.size());
155 Edge *e = _graph->edge(_input_edges[idx]);
156 return (e != nullptr) ? e->tensor() : nullptr;
157}
158
159Tensor *INode::output(size_t idx) const
160{
161 ARM_COMPUTE_ERROR_ON(_graph == nullptr);
162 ARM_COMPUTE_ERROR_ON(idx >= _outputs.size());
163 return _graph->tensor(_outputs[idx]);
164}
165
166EdgeID INode::input_edge_id(size_t idx) const
167{
168 ARM_COMPUTE_ERROR_ON(idx >= _input_edges.size());
169 return _input_edges[idx];
170}
171
172Edge *INode::input_edge(size_t idx) const
173{
174 ARM_COMPUTE_ERROR_ON(_graph == nullptr);
175 ARM_COMPUTE_ERROR_ON(idx >= _input_edges.size());
176 return _graph->edge(_input_edges[idx]);
177}
178
179size_t INode::num_inputs() const
180{
181 return _input_edges.size();
182}
183
184size_t INode::num_outputs() const
185{
186 return _outputs.size();
187}
188
Georgios Pinitas2a2db592018-08-15 12:14:46 +0100189NodeParams INode::common_node_params() const
190{
191 return _common_params;
192}
193
Georgios Pinitasd9eb2752018-04-03 13:44:29 +0100194Target INode::requested_target() const
195{
196 return _common_params.target;
197}
198
199Target INode::assigned_target() const
200{
201 return _assigned_target;
202}
Sheri Zhangc65023e2021-11-03 21:24:00 +0000203
204const std::list<std::unique_ptr<ConvPostOpInfo>> &INode::post_op_info_list() const
205{
206 return _post_op_info_list;
207}
208
209std::list<std::unique_ptr<ConvPostOpInfo>> &INode::post_op_info_list()
210{
211 return _post_op_info_list;
212}
Georgios Pinitasd9eb2752018-04-03 13:44:29 +0100213} // namespace graph
214} // namespace arm_compute