9 #include <boost/numeric/conversion/cast.hpp> 20 void AssertIfNullsOrDuplicates(
const C& container,
const std::string& errorMessage)
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)
27 boost::ignore_unused(errorMessage);
30 BOOST_ASSERT_MSG(i, errorMessage.c_str());
33 BOOST_ASSERT_MSG(duplicateSet.find(i) == duplicateSet.end(), errorMessage.c_str());
35 duplicateSet.insert(i);
44 , m_Layers(graph.begin(), graph.end())
50 : m_InputSlots{inputs}
51 , m_OutputSlots{outputs}
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())
66 : m_InputSlots(
std::move(subgraph.m_InputSlots))
67 , m_OutputSlots(
std::move(subgraph.m_OutputSlots))
68 , m_Layers(
std::move(subgraph.m_Layers))
76 , m_Layers{boost::polymorphic_downcast<Layer*>(layer)}
78 unsigned int numInputSlots = layer->GetNumInputSlots();
79 m_InputSlots.resize(numInputSlots);
80 for (
unsigned int i = 0; i < numInputSlots; i++)
82 m_InputSlots.at(i) = boost::polymorphic_downcast<InputSlot*>(&(layer->GetInputSlot(i)));
85 unsigned int numOutputSlots = layer->GetNumOutputSlots();
86 m_OutputSlots.resize(numOutputSlots);
87 for (
unsigned int i = 0; i < numOutputSlots; i++)
89 m_OutputSlots.at(i) = boost::polymorphic_downcast<OutputSlot*>(&(layer->GetOutputSlot(i)));
97 m_InputSlots = std::move(other.m_InputSlots);
98 m_OutputSlots = std::move(other.m_OutputSlots);
99 m_Layers = std::move(other.m_Layers);
106 void SubgraphView::CheckSubgraph()
109 AssertIfNullsOrDuplicates(m_InputSlots,
"Sub-graphs cannot contain null or duplicate input slots");
112 AssertIfNullsOrDuplicates(m_OutputSlots,
"Sub-graphs cannot contain null or duplicate output slots");
115 AssertIfNullsOrDuplicates(m_Layers,
"Sub-graphs cannot contain null or duplicate layers");
125 return m_OutputSlots;
130 return m_InputSlots.at(index);
135 return m_InputSlots.at(index);
140 return m_OutputSlots.at(index);
145 return m_OutputSlots.at(index);
150 return boost::numeric_cast<
unsigned int>(m_InputSlots.size());
155 return boost::numeric_cast<
unsigned int>(m_OutputSlots.size());
165 return m_Layers.begin();
170 return m_Layers.end();
175 return m_Layers.begin();
180 return m_Layers.end();
195 m_InputSlots.clear();
196 m_OutputSlots.clear();
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.
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