• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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