Compute Library
 23.11
Graph.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018-2020,2023 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 #ifndef ARM_COMPUTE_GRAPH_GRAPH_H
25 #define ARM_COMPUTE_GRAPH_GRAPH_H
26 
27 #include "arm_compute/graph/Edge.h"
31 
32 #include "support/Mutex.h"
33 
34 #include <map>
35 #include <memory>
36 #include <string>
37 #include <utility>
38 #include <vector>
39 
40 #ifndef BARE_METAL
41 #include <thread>
42 #endif /* BARE_METAL */
43 
44 namespace arm_compute
45 {
46 namespace graph
47 {
48 /** Graph class
49  *
50  * Represents a multiple source - multiple sink directed graph
51  */
52 class Graph final
53 {
54 public:
55  Graph() = default;
56  /** Constructor
57  *
58  * @param[in] id Graph identification number. Can be used to differentiate between graphs. Default value 0
59  * @param[in] name Graph name. Default value empty string
60  */
61  Graph(GraphID id, std::string name);
62  /** Prevent instances of this class from being copied (As this class contains pointers) */
63  Graph(const Graph &) = delete;
64  /** Prevent instances of this class from being copy assigned (As this class contains pointers) */
65  Graph &operator=(const Graph &) = delete;
66  /** Prevent instances of this class from being moved (As this class contains non movable objects) */
67  Graph(Graph &&) = delete;
68  /** Prevent instances of this class from being moved (As this class contains non movable objects) */
69  Graph &operator=(Graph &&) = delete;
70  /** Adds a node to the graph
71  *
72  * @note Models a single output node
73  *
74  * @tparam NT Node operation
75  * @tparam Ts Arguments to operation
76  *
77  * @param[in] args Node arguments
78  *
79  * @return ID of the node
80  */
81  template <typename NT, typename... Ts>
82  NodeID add_node(Ts &&...args);
83  /** Remove the node with the given ID
84  *
85  * @param[in] nid ID of the node to remove
86  *
87  * @return True if the removal took place else false
88  */
89  bool remove_node(NodeID nid);
90  /** Adds a connection between two nodes
91  *
92  * @param[in] source ID of the source node
93  * @param[in] source_idx Output index of the source node
94  * @param[in] sink ID of the sink node
95  * @param[in] sink_idx Input index of the sink node
96  *
97  * @return ID of this connection
98  */
99  EdgeID add_connection(NodeID source, size_t source_idx, NodeID sink, size_t sink_idx);
100  /** Removes an edge (connection)
101  *
102  * @param[in] eid Connection to remove
103  *
104  * @return True if the removal took place else false
105  */
106  bool remove_connection(EdgeID eid);
107  /** Returns graph name
108  *
109  * @return Graph name
110  */
111  std::string name() const;
112  /** Returns graph id
113  *
114  * @return Graph id
115  */
116  GraphID id() const;
117  /** Returns graph input nodes
118  *
119  * @param[in] type Type of nodes to return
120  *
121  * @return vector containing the graph node of given type
122  */
123  const std::vector<NodeID> &nodes(NodeType type);
124  /** Returns nodes of graph
125  *
126  * @warning Nodes can be nullptr if they have been removed during the mutation steps of the graph
127  *
128  * @return Nodes of graph
129  */
130  std::vector<std::unique_ptr<INode>> &nodes();
131  /** Returns nodes of graph
132  *
133  * @warning Nodes can be nullptr if they have been removed during the mutation steps of the graph
134  *
135  * @return Nodes of graph
136  */
137  const std::vector<std::unique_ptr<INode>> &nodes() const;
138  /** Returns edges of graph
139  *
140  * @warning Edges can be nullptr if they have been removed during the mutation steps of the graph
141  *
142  * @return Edges of graph
143  */
144  const std::vector<std::unique_ptr<Edge>> &edges() const;
145  /** Returns tensors of graph
146  *
147  * @warning Tensor can be nullptr if they have been removed during the mutation steps of the graph
148  *
149  * @return Tensors of graph
150  */
151  std::vector<std::unique_ptr<Tensor>> &tensors();
152  /** Returns tensors of graph
153  *
154  * @warning Tensor can be nullptr if they have been removed during the mutation steps of the graph
155  *
156  * @return Tensors of graph
157  */
158  const std::vector<std::unique_ptr<Tensor>> &tensors() const;
159  /** Get node object given its id
160  *
161  * @warning Can be nullptr if node was removed during the mutation steps of the graph
162  *
163  * @param[in] id Node ID
164  *
165  * @return The actual node object
166  */
167  const INode *node(NodeID id) const;
168  /** Get node object given its id
169  *
170  * @warning Can be nullptr if node was removed during the mutation steps of the graph
171  *
172  * @param[in] id Node ID
173  *
174  * @return The actual node object
175  */
176  INode *node(NodeID id);
177  /** Get edge object given its id
178  *
179  * @warning Can be nullptr if node was removed during the mutation steps of the graph
180  *
181  * @param[in] id Edge ID
182  *
183  * @return The actual edge object
184  */
185  const Edge *edge(EdgeID id) const;
186  /** Get edge object given its id
187  *
188  * @warning Can be nullptr if node was removed during the mutation steps of the graph
189  *
190  * @param[in] id Edge ID
191  *
192  * @return The actual edge object
193  */
194  Edge *edge(EdgeID id);
195  /** Get tensor object given its id
196  *
197  * @warning Can be nullptr if tensor was removed during the mutation steps of the graph
198  *
199  * @param[in] id Tensor ID
200  *
201  * @return The actual tensor object
202  */
203  const Tensor *tensor(TensorID id) const;
204  /** Get tensor object given its id
205  *
206  * @warning Can be nullptr if tensor was removed during the mutation steps of the graph
207  *
208  * @param[in] id Tensor ID
209  *
210  * @return The actual tensor object
211  */
212  Tensor *tensor(TensorID id);
213 
214 private:
215  /** Creates a tensor object
216  *
217  * @param[in] desc Tensor descriptor
218  *
219  * @return Tensor ID
220  */
221  TensorID create_tensor(const TensorDescriptor &desc = TensorDescriptor());
222 
223 private:
224  GraphID _id = GraphID(0); /**< Graph id */
225  std::string _name = {}; /**< Graph name */
226  std::vector<std::unique_ptr<INode>> _nodes = {}; /**< Graph nodes */
227  std::vector<std::unique_ptr<Edge>> _edges = {}; /**< Graph edges */
228  std::vector<std::unique_ptr<Tensor>> _tensors = {}; /**< Graph tensors */
229  std::map<NodeType, std::vector<NodeID>> _tagged_nodes = {}; /**< Graph nodes map with the node type as key */
230  arm_compute::Mutex _mtx = {}; /**< Mutex used for graph construction */
231 };
232 
233 template <typename NT, typename... Ts>
234 inline NodeID Graph::add_node(Ts &&...args)
235 {
237 
238  // Create node
239  NodeID nid = _nodes.size();
240  auto node = std::make_unique<NT>(std::forward<Ts>(args)...);
241  node->set_graph(this);
242  node->set_id(nid);
243 
244  // Keep track of input nodes
245  _tagged_nodes[node->type()].push_back(nid);
246 
247  // Associate a new tensor with each output
248  for (auto &output : node->_outputs)
249  {
250  output = create_tensor();
251  }
252 
253  // Propagate node shape if possible
255 
256  // Add node to the graph nodes
257  _nodes.push_back(std::move(node));
258 
259  return nid;
260 }
261 } // namespace graph
262 } // namespace arm_compute
263 #endif /* ARM_COMPUTE_GRAPH_GRAPH_H */
arm_compute::graph::Graph::edge
const Edge * edge(EdgeID id) const
Get edge object given its id.
Definition: Graph.cpp:218
GemmTuner.args
args
Definition: GemmTuner.py:679
arm_compute::lock_guard
std::lock_guard< Mutex > lock_guard
Wrapper of lock_guard data-object.
Definition: Mutex.h:37
type
decltype(strategy::transforms) typedef type
Definition: gemm_interleaved.hpp:261
Edge.h
arm_compute::graph::Graph::edges
const std::vector< std::unique_ptr< Edge > > & edges() const
Returns edges of graph.
Definition: Graph.cpp:193
INode.h
arm_compute::graph::Tensor
Tensor object.
Definition: Tensor.h:40
arm_compute::graph::Graph::id
GraphID id() const
Returns graph id.
Definition: Graph.cpp:173
arm_compute::graph::INode::forward_descriptors
virtual bool forward_descriptors()=0
Forwards descriptor information to outputs if possible.
arm_compute::graph::Edge
Graph Edge.
Definition: Edge.h:39
arm_compute::graph::Graph::add_connection
EdgeID add_connection(NodeID source, size_t source_idx, NodeID sink, size_t sink_idx)
Adds a connection between two nodes.
Definition: Graph.cpp:69
arm_compute::Mutex
std::mutex Mutex
Wrapper of Mutex data-object.
Definition: Mutex.h:33
arm_compute::graph::INode
Node interface.
Definition: INode.h:46
arm_compute::graph::NodeType
NodeType
Supported nodes.
Definition: Types.h:154
arm_compute::graph::GraphID
unsigned int GraphID
Definition: Types.h:70
arm_compute::graph::Graph::tensors
std::vector< std::unique_ptr< Tensor > > & tensors()
Returns tensors of graph.
Definition: Graph.cpp:198
arm_compute::graph::Graph::add_node
NodeID add_node(Ts &&...args)
Adds a node to the graph.
Definition: Graph.h:234
arm_compute::graph::INode::set_graph
void set_graph(Graph *g)
Sets the graph that this node is registered to.
Definition: INode.cpp:50
arm_compute::graph::NodeID
unsigned int NodeID
Definition: Types.h:72
arm_compute::graph::INode::type
virtual NodeType type() const =0
Returns node's type.
arm_compute::graph::Graph::node
const INode * node(NodeID id) const
Get node object given its id.
Definition: Graph.cpp:208
Types.h
arm_compute::graph::Graph::remove_node
bool remove_node(NodeID nid)
Remove the node with the given ID.
Definition: Graph.cpp:35
Mutex.h
arm_compute
Copyright (c) 2017-2023 Arm Limited.
Definition: introduction.dox:24
arm_compute::graph::Graph::tensor
const Tensor * tensor(TensorID id) const
Get tensor object given its id.
Definition: Graph.cpp:228
arm_compute::graph::Graph::name
std::string name() const
Returns graph name.
Definition: Graph.cpp:168
arm_compute::graph::TensorDescriptor
Tensor metadata class.
Definition: TensorDescriptor.h:38
arm_compute::graph::Graph::Graph
Graph()=default
Tensor.h
arm_compute::graph::Graph
Graph class.
Definition: Graph.h:52
arm_compute::graph::Graph::operator=
Graph & operator=(const Graph &)=delete
Prevent instances of this class from being copy assigned (As this class contains pointers)
arm_compute::graph::INode::set_id
void set_id(NodeID id)
Sets the node id.
Definition: INode.cpp:56
arm_compute::graph::TensorID
unsigned int TensorID
Definition: Types.h:71
arm_compute::graph::Graph::remove_connection
bool remove_connection(EdgeID eid)
Removes an edge (connection)
Definition: Graph.cpp:122
arm_compute::graph::EdgeID
unsigned int EdgeID
Definition: Types.h:73
arm_compute::graph::Graph::nodes
std::vector< std::unique_ptr< INode > > & nodes()
Returns nodes of graph.
Definition: Graph.cpp:183