22 void AssertIfNullsOrDuplicates(
const C& container,
const std::string& errorMessage)
24 using T =
typename C::value_type;
25 std::unordered_set<T> duplicateSet;
26 std::for_each(container.begin(), container.end(), [&duplicateSet, &errorMessage](
const T& i)
35 ARMNN_ASSERT_MSG(duplicateSet.find(i) == duplicateSet.end(), errorMessage.c_str());
37 duplicateSet.insert(i);
46 , m_Layers(graph.begin(), graph.end())
53 : m_InputSlots{inputs}
54 , m_OutputSlots{outputs}
62 : m_InputSlots(subgraph.m_InputSlots.
begin(), subgraph.m_InputSlots.
end())
63 , m_OutputSlots(subgraph.m_OutputSlots.
begin(), subgraph.m_OutputSlots.
end())
64 , m_Layers(subgraph.m_Layers.
begin(), subgraph.m_Layers.
end())
71 : m_InputSlots(
std::move(subgraph.m_InputSlots))
72 , m_OutputSlots(
std::move(subgraph.m_OutputSlots))
73 , m_Layers(
std::move(subgraph.m_Layers))
82 , m_Layers{PolymorphicDowncast<Layer*>(layer)}
84 unsigned int numInputSlots = layer->GetNumInputSlots();
85 m_InputSlots.resize(numInputSlots);
86 for (
unsigned int i = 0; i < numInputSlots; i++)
88 m_InputSlots.at(i) = PolymorphicDowncast<InputSlot*>(&(layer->GetInputSlot(i)));
91 unsigned int numOutputSlots = layer->GetNumOutputSlots();
92 m_OutputSlots.resize(numOutputSlots);
93 for (
unsigned int i = 0; i < numOutputSlots; i++)
95 m_OutputSlots.at(i) = PolymorphicDowncast<OutputSlot*>(&(layer->GetOutputSlot(i)));
103 m_InputSlots = std::move(other.m_InputSlots);
104 m_OutputSlots = std::move(other.m_OutputSlots);
105 m_Layers = std::move(other.m_Layers);
112 void SubgraphView::CheckSubgraph()
115 AssertIfNullsOrDuplicates(m_InputSlots,
"Sub-graphs cannot contain null or duplicate input slots");
118 AssertIfNullsOrDuplicates(m_OutputSlots,
"Sub-graphs cannot contain null or duplicate output slots");
121 AssertIfNullsOrDuplicates(m_Layers,
"Sub-graphs cannot contain null or duplicate layers");
131 return m_OutputSlots;
136 return m_InputSlots.at(index);
141 return m_InputSlots.at(index);
146 return m_OutputSlots.at(index);
151 return m_OutputSlots.at(index);
171 return m_Layers.begin();
176 return m_Layers.end();
181 return m_Layers.begin();
186 return m_Layers.end();
201 m_InputSlots.clear();
202 m_OutputSlots.clear();
206 void SubgraphView::ArrangeBySortOrder()
208 using LayerList = std::list<Layer*>;
209 auto compareLayerPriority = [](
const LayerList::value_type& layerA,
const LayerList::value_type& layerB)
211 return layerA->GetPriority() < layerB->GetPriority();
214 m_Layers.sort(compareLayerPriority);
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
Layers::iterator Iterator
SubgraphView & operator=(SubgraphView &&other)
Move-assignment operator.
std::vector< OutputSlot * > OutputSlots
unsigned int GetNumInputSlots() const
Copyright (c) 2021 ARM Limited and Contributors.
void IgnoreUnused(Ts &&...)
The SubgraphView class represents a subgraph of a Graph.
#define ARMNN_ASSERT_MSG(COND, MSG)
const OutputSlot * GetOutputSlot(unsigned int index) const
std::vector< InputSlot * > InputSlots
SubgraphView(Graph &graph)
Constructs a sub-graph from the entire given graph.
const InputSlots & GetInputSlots() const
ConstIterator cend() const
const InputSlot * GetInputSlot(unsigned int index) const
const OutputSlots & GetOutputSlots() const
const Layers & GetLayers() const
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)
ConstIterator cbegin() const
std::list< Layer * > Layers
Layers::const_iterator ConstIterator
unsigned int GetNumOutputSlots() const