ArmNN  NotReleased
SubgraphView.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "SubgraphView.hpp"
7 #include "Graph.hpp"
8 
9 #include <boost/numeric/conversion/cast.hpp>
10 
11 #include <utility>
12 
13 namespace armnn
14 {
15 
16 namespace
17 {
18 
19 template <class C>
20 void AssertIfNullsOrDuplicates(const C& container, const std::string& errorMessage)
21 {
22  using T = typename C::value_type;
23  std::unordered_set<T> duplicateSet;
24  std::for_each(container.begin(), container.end(), [&duplicateSet, &errorMessage](const T& i)
25  {
26  // Ignore unused for release builds
27  boost::ignore_unused(errorMessage);
28 
29  // Check if the item is valid
30  BOOST_ASSERT_MSG(i, errorMessage.c_str());
31 
32  // Check if a duplicate has been found
33  BOOST_ASSERT_MSG(duplicateSet.find(i) == duplicateSet.end(), errorMessage.c_str());
34 
35  duplicateSet.insert(i);
36  });
37 }
38 
39 } // anonymous namespace
40 
42  : m_InputSlots{}
43  , m_OutputSlots{}
44  , m_Layers(graph.begin(), graph.end())
45 {
46  CheckSubgraph();
47 }
48 
50  : m_InputSlots{inputs}
51  , m_OutputSlots{outputs}
52  , m_Layers{layers}
53 {
54  CheckSubgraph();
55 }
56 
58  : m_InputSlots(subgraph.m_InputSlots.begin(), subgraph.m_InputSlots.end())
59  , m_OutputSlots(subgraph.m_OutputSlots.begin(), subgraph.m_OutputSlots.end())
60  , m_Layers(subgraph.m_Layers.begin(), subgraph.m_Layers.end())
61 {
62  CheckSubgraph();
63 }
64 
66  : m_InputSlots(std::move(subgraph.m_InputSlots))
67  , m_OutputSlots(std::move(subgraph.m_OutputSlots))
68  , m_Layers(std::move(subgraph.m_Layers))
69 {
70  CheckSubgraph();
71 }
72 
74  : m_InputSlots{}
75  , m_OutputSlots{}
76  , m_Layers{boost::polymorphic_downcast<Layer*>(layer)}
77 {
78  unsigned int numInputSlots = layer->GetNumInputSlots();
79  m_InputSlots.resize(numInputSlots);
80  for (unsigned int i = 0; i < numInputSlots; i++)
81  {
82  m_InputSlots.at(i) = boost::polymorphic_downcast<InputSlot*>(&(layer->GetInputSlot(i)));
83  }
84 
85  unsigned int numOutputSlots = layer->GetNumOutputSlots();
86  m_OutputSlots.resize(numOutputSlots);
87  for (unsigned int i = 0; i < numOutputSlots; i++)
88  {
89  m_OutputSlots.at(i) = boost::polymorphic_downcast<OutputSlot*>(&(layer->GetOutputSlot(i)));
90  }
91 
92  CheckSubgraph();
93 }
94 
96 {
97  m_InputSlots = std::move(other.m_InputSlots);
98  m_OutputSlots = std::move(other.m_OutputSlots);
99  m_Layers = std::move(other.m_Layers);
100 
101  CheckSubgraph();
102 
103  return *this;
104 }
105 
106 void SubgraphView::CheckSubgraph()
107 {
108  // Check for invalid or duplicate input slots
109  AssertIfNullsOrDuplicates(m_InputSlots, "Sub-graphs cannot contain null or duplicate input slots");
110 
111  // Check for invalid or duplicate output slots
112  AssertIfNullsOrDuplicates(m_OutputSlots, "Sub-graphs cannot contain null or duplicate output slots");
113 
114  // Check for invalid or duplicate layers
115  AssertIfNullsOrDuplicates(m_Layers, "Sub-graphs cannot contain null or duplicate layers");
116 }
117 
119 {
120  return m_InputSlots;
121 }
122 
124 {
125  return m_OutputSlots;
126 }
127 
128 const InputSlot* SubgraphView::GetInputSlot(unsigned int index) const
129 {
130  return m_InputSlots.at(index);
131 }
132 
134 {
135  return m_InputSlots.at(index);
136 }
137 
138 const OutputSlot* SubgraphView::GetOutputSlot(unsigned int index) const
139 {
140  return m_OutputSlots.at(index);
141 }
142 
144 {
145  return m_OutputSlots.at(index);
146 }
147 
148 unsigned int SubgraphView::GetNumInputSlots() const
149 {
150  return boost::numeric_cast<unsigned int>(m_InputSlots.size());
151 }
152 
154 {
155  return boost::numeric_cast<unsigned int>(m_OutputSlots.size());
156 }
157 
159 {
160  return m_Layers;
161 }
162 
164 {
165  return m_Layers.begin();
166 }
167 
169 {
170  return m_Layers.end();
171 }
172 
174 {
175  return m_Layers.begin();
176 }
177 
179 {
180  return m_Layers.end();
181 }
182 
184 {
185  return begin();
186 }
187 
189 {
190  return end();
191 }
192 
194 {
195  m_InputSlots.clear();
196  m_OutputSlots.clear();
197  m_Layers.clear();
198 }
199 
200 } // namespace armnn
Layers::const_iterator ConstIterator
const Layers & GetLayers() const
std::list< Layer * > Layers
ConstIterator cbegin() const
Layers::iterator Iterator
unsigned int GetNumInputSlots() const
SubgraphView & operator=(SubgraphView &&other)
Move-assignment operator.
std::vector< InputSlot * > InputSlots
const InputSlot * GetInputSlot(unsigned int index) const
unsigned int GetNumOutputSlots() const
const OutputSlots & GetOutputSlots() const
const InputSlots & GetInputSlots() const
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
Definition: INetwork.hpp:61
std::vector< OutputSlot * > OutputSlots
SubgraphView(Graph &graph)
Constructs a sub-graph from the entire given graph.
const OutputSlot * GetOutputSlot(unsigned int index) const
ConstIterator cend() const