ArmNN
 24.02
SubgraphView Class Referencefinal

The SubgraphView class represents a subgraph of a Graph. More...

#include <SubgraphView.hpp>

Inheritance diagram for SubgraphView:
[legend]
Collaboration diagram for SubgraphView:
[legend]

Public Types

using SubgraphViewPtr = std::shared_ptr< SubgraphView >
 
using InputSlots = std::vector< InputSlot * >
 
using IInputSlots = std::vector< IInputSlot * >
 
using OutputSlots = std::vector< OutputSlot * >
 
using IOutputSlots = std::vector< IOutputSlot * >
 
using Layers = std::list< Layer * >
 
using IConnectableLayers = std::list< IConnectableLayer * >
 
using Iterator = Layers::iterator
 
using IConnectableLayerIterator = IConnectableLayers::iterator
 
using ConstIterator = Layers::const_iterator
 
using ConstIConnectableIterator = IConnectableLayers::const_iterator
 

Public Member Functions

template<typename Func >
void ForEachLayer (Func func) const
 
template<typename Func >
void ForEachIConnectableLayer (Func func) const
 
 SubgraphView (Graph &graph)
 Constructs a sub-graph from the entire given graph. More...
 
 ARMNN_DEPRECATED_MSG_REMOVAL_DATE ("This function has been deprecated, please use constructor with arguments: " "IConnectableLayers, IInputSlots and IOutputSlots", "23.08") SubgraphView(InputSlots &&inputs
 Constructs a sub-graph with the given arguments. More...
 
 SubgraphView (IConnectableLayers &&layers, IInputSlots &&inputs, IOutputSlots &&outputs)
 Constructs a sub-graph with the given arguments. More...
 
 SubgraphView (const SubgraphView &subgraph)
 Copy-constructor. More...
 
 SubgraphView (SubgraphView &&subgraph)
 Move-constructor. More...
 
 SubgraphView (IConnectableLayer *layer)
 Constructs a sub-graph with only the given layer. More...
 
SubgraphViewoperator= (SubgraphView &&other)
 Move-assignment operator. More...
 
const IInputSlotsGetIInputSlots () const
 
const IOutputSlotsGetIOutputSlots () const
 
const IConnectableLayersGetIConnectableLayers () const
 
const IInputSlotGetIInputSlot (unsigned int index) const
 
IInputSlotGetIInputSlot (unsigned int index)
 
const IOutputSlotGetIOutputSlot (unsigned int index) const
 
OutputSlotGetOutputSlot (unsigned int index)
 
IOutputSlotGetIOutputSlot (unsigned int index)
 
unsigned int GetNumInputSlots () const
 
unsigned int GetNumOutputSlots () const
 
IConnectableLayerIterator begin ()
 
 ARMNN_DEPRECATED_MSG_CHANGE_DATE ("This function is deprecated and will be removed; please use " "begin() returning public IConnectableIterator", "24.05") IConnectableLayerIterator beginIConnectable()
 
IConnectableLayerIterator end ()
 
 ARMNN_DEPRECATED_MSG_CHANGE_DATE ("This function is deprecated and will be removed; please use " "end() returning public IConnectableLayerIterator", "24.05") IConnectableLayerIterator endIConnectable()
 
ConstIConnectableIterator begin () const
 
 ARMNN_DEPRECATED_MSG_CHANGE_DATE ("This function is deprecated and will be removed; please use " "begin() returning public ConstIConnectableIterator", "24.05") ConstIConnectableIterator beginIConnectable() const
 
ConstIConnectableIterator end () const
 
 ARMNN_DEPRECATED_MSG_CHANGE_DATE ("This function is deprecated and will be removed; please use " "end() returning public ConstIConnectableIterator", "24.05") ConstIConnectableIterator endIConnectable() const
 
ConstIConnectableIterator cbegin () const
 
 ARMNN_DEPRECATED_MSG_CHANGE_DATE ("This function is deprecated and will be removed; please use " "cbegin() returning public ConstIterator", "24.05") ConstIConnectableIterator cbeginIConnectable() const
 
ConstIConnectableIterator cend () const
 
 ARMNN_DEPRECATED_MSG_CHANGE_DATE ("This function is deprecated and will be removed; please use " "cend() returning public ConstIConnectableIterator", "24.05") ConstIConnectableIterator cendIConnectable() const
 
void Clear ()
 
SubgraphView GetWorkingCopy () const
 This method returns a copy of the original SubgraphView provided by OptimizeSubgraphView with a separate underlying graph from the main ArmNN graph. More...
 
void SubstituteSubgraph (SubgraphView &, IConnectableLayer *)
 These methods should be called on a working copy subgraph created from GetWorkingCopy. More...
 
void SubstituteSubgraph (SubgraphView &, const SubgraphView &)
 
const IInputSlotsGetOriginalInputSlots () const
 These methods should be called on a working copy subgraph created from GetWorkingCopy. More...
 
const IOutputSlotsGetOriginalOutputSlots () const
 

Public Attributes

OutputSlots && outputs
 
OutputSlots Layers && layers
 

Detailed Description

The SubgraphView class represents a subgraph of a Graph.

The data it holds, points to data held by layers of the Graph, so the the contents of the SubgraphView become invalid when the Layers are destroyed or changed.

Definition at line 31 of file SubgraphView.hpp.

Member Typedef Documentation

◆ ConstIConnectableIterator

using ConstIConnectableIterator = IConnectableLayers::const_iterator

Definition at line 66 of file SubgraphView.hpp.

◆ ConstIterator

using ConstIterator = Layers::const_iterator

Definition at line 65 of file SubgraphView.hpp.

◆ IConnectableLayerIterator

using IConnectableLayerIterator = IConnectableLayers::iterator

Definition at line 64 of file SubgraphView.hpp.

◆ IConnectableLayers

Definition at line 62 of file SubgraphView.hpp.

◆ IInputSlots

using IInputSlots = std::vector<IInputSlot*>

Definition at line 58 of file SubgraphView.hpp.

◆ InputSlots

using InputSlots = std::vector<InputSlot*>

Definition at line 57 of file SubgraphView.hpp.

◆ IOutputSlots

using IOutputSlots = std::vector<IOutputSlot*>

Definition at line 60 of file SubgraphView.hpp.

◆ Iterator

using Iterator = Layers::iterator

Definition at line 63 of file SubgraphView.hpp.

◆ Layers

using Layers = std::list<Layer*>

Definition at line 61 of file SubgraphView.hpp.

◆ OutputSlots

using OutputSlots = std::vector<OutputSlot*>

Definition at line 59 of file SubgraphView.hpp.

◆ SubgraphViewPtr

using SubgraphViewPtr = std::shared_ptr<SubgraphView>

Definition at line 56 of file SubgraphView.hpp.

Constructor & Destructor Documentation

◆ SubgraphView() [1/5]

SubgraphView ( Graph graph)
explicit

Constructs a sub-graph from the entire given graph.

Definition at line 45 of file SubgraphView.cpp.

46  : enable_shared_from_this()
47  , m_InputSlots{}
48  , m_OutputSlots{}
49  , m_Layers(graph.begin(), graph.end())
50  , m_IConnectableLayers(graph.begin(), graph.end())
51 {
52  ArrangeBySortOrder();
53  CheckSubgraph();
54 }

◆ SubgraphView() [2/5]

Constructs a sub-graph with the given arguments.

IConnectable Duplication to maintain backwards compatibility.

Definition at line 71 of file SubgraphView.cpp.

74  : enable_shared_from_this()
75  , m_IInputSlots{inputs}
76  , m_IOutputSlots{outputs}
77  , m_IConnectableLayers(IConnectableLayers{layers.begin(), layers.end()})
78 {
79  // Cast from IConnectableLayer to Layer for backward compatibility
80  auto f = [](IConnectableLayer* value)
81  {
82  return PolymorphicDowncast<Layer*>(value);
83  };
84  std::transform(layers.begin(), layers.end(), std::back_inserter(m_Layers), f);
85 
86  m_InputSlots.resize(inputs.size());
87  m_IInputSlots.resize(inputs.size());
88  for (unsigned int i = 0; i < inputs.size(); i++)
89  {
90  m_InputSlots.at(i) = PolymorphicDowncast<InputSlot*>(inputs[i]);
91  m_IInputSlots.at(i) = inputs[i];
92  }
93 
94  m_OutputSlots.resize(outputs.size());
95  m_IOutputSlots.resize(outputs.size());
96  for (unsigned int i = 0; i < outputs.size(); i++)
97  {
98  m_OutputSlots.at(i) = PolymorphicDowncast<OutputSlot*>(outputs[i]);
99  m_IOutputSlots.at(i) = outputs[i];
100  }
101 
102  ArrangeBySortOrder();
103  CheckSubgraph();
104 }

◆ SubgraphView() [3/5]

SubgraphView ( const SubgraphView subgraph)

Copy-constructor.

Definition at line 144 of file SubgraphView.cpp.

145  : enable_shared_from_this()
146  , m_InputSlots(subgraph.m_InputSlots.begin(), subgraph.m_InputSlots.end())
147  , m_IInputSlots(subgraph.m_IInputSlots.begin(), subgraph.m_IInputSlots.end())
148  , m_OutputSlots(subgraph.m_OutputSlots.begin(), subgraph.m_OutputSlots.end())
149  , m_IOutputSlots(subgraph.m_IOutputSlots.begin(), subgraph.m_IOutputSlots.end())
150  , m_Layers(subgraph.m_Layers.begin(), subgraph.m_Layers.end())
151  , m_IConnectableLayers(IConnectableLayers{subgraph.m_IConnectableLayers.begin(),
152  subgraph.m_IConnectableLayers.end()})
153 {
154  ArrangeBySortOrder();
155  CheckSubgraph();
156 }

◆ SubgraphView() [4/5]

SubgraphView ( SubgraphView &&  subgraph)

Move-constructor.

Definition at line 158 of file SubgraphView.cpp.

159  : enable_shared_from_this()
160  , m_InputSlots(std::move(subgraph.m_InputSlots))
161  , m_IInputSlots(std::move(subgraph.m_IInputSlots))
162  , m_OutputSlots(std::move(subgraph.m_OutputSlots))
163  , m_IOutputSlots(std::move(subgraph.m_IOutputSlots))
164  , m_Layers(std::move(subgraph.m_Layers))
165  , m_IConnectableLayers(std::move(subgraph.m_IConnectableLayers))
166 {
167  ArrangeBySortOrder();
168  CheckSubgraph();
169 }

◆ SubgraphView() [5/5]

Constructs a sub-graph with only the given layer.

Definition at line 171 of file SubgraphView.cpp.

172  : enable_shared_from_this()
173  , m_Layers{PolymorphicDowncast<Layer*>(layer)}
174  , m_IConnectableLayers{layer}
175 {
176  unsigned int numInputSlots = layer->GetNumInputSlots();
177  m_InputSlots.resize(numInputSlots);
178  m_IInputSlots.resize(numInputSlots);
179  for (unsigned int i = 0; i < numInputSlots; i++)
180  {
181  m_InputSlots.at(i) = PolymorphicDowncast<InputSlot*>(&(layer->GetInputSlot(i)));
182  m_IInputSlots.at(i) = &(layer->GetInputSlot(i));
183  }
184 
185  unsigned int numOutputSlots = layer->GetNumOutputSlots();
186  m_OutputSlots.resize(numOutputSlots);
187  m_IOutputSlots.resize(numOutputSlots);
188  for (unsigned int i = 0; i < numOutputSlots; i++)
189  {
190  m_OutputSlots.at(i) = PolymorphicDowncast<OutputSlot*>(&(layer->GetOutputSlot(i)));
191  m_IOutputSlots.at(i) = &(layer->GetOutputSlot(i));
192  }
193 
194  CheckSubgraph();
195 }

Member Function Documentation

◆ ARMNN_DEPRECATED_MSG_CHANGE_DATE() [1/6]

ARMNN_DEPRECATED_MSG_CHANGE_DATE ( "This function is deprecated and will be removed; please use " "begin() returning public ConstIConnectableIterator ,
"24.05"   
) const

◆ ARMNN_DEPRECATED_MSG_CHANGE_DATE() [2/6]

ARMNN_DEPRECATED_MSG_CHANGE_DATE ( "This function is deprecated and will be removed; please use " "begin() returning public IConnectableIterator"  ,
"24.05"   
)

◆ ARMNN_DEPRECATED_MSG_CHANGE_DATE() [3/6]

ARMNN_DEPRECATED_MSG_CHANGE_DATE ( "This function is deprecated and will be removed; please use " "cbegin() returning public ConstIterator ,
"24.05"   
) const

◆ ARMNN_DEPRECATED_MSG_CHANGE_DATE() [4/6]

ARMNN_DEPRECATED_MSG_CHANGE_DATE ( "This function is deprecated and will be removed; please use " "cend() returning public ConstIConnectableIterator ,
"24.05"   
) const

◆ ARMNN_DEPRECATED_MSG_CHANGE_DATE() [5/6]

ARMNN_DEPRECATED_MSG_CHANGE_DATE ( "This function is deprecated and will be removed; please use " "end() returning public ConstIConnectableIterator ,
"24.05"   
) const

◆ ARMNN_DEPRECATED_MSG_CHANGE_DATE() [6/6]

ARMNN_DEPRECATED_MSG_CHANGE_DATE ( "This function is deprecated and will be removed; please use " "end() returning public IConnectableLayerIterator ,
"24.05"   
)

◆ ARMNN_DEPRECATED_MSG_REMOVAL_DATE()

ARMNN_DEPRECATED_MSG_REMOVAL_DATE ( "This function has been  deprecated,
please use constructor with arguments:" "  IConnectableLayers,
IInputSlots and IOutputSlots ,
"23.08"   
) &&

Constructs a sub-graph with the given arguments.

◆ begin() [1/2]

◆ begin() [2/2]

ConstIConnectableIterator begin ( ) const

◆ cbegin()

Definition at line 325 of file SubgraphView.cpp.

326 {
327  return begin();
328 }

References SubgraphView::begin().

◆ cend()

Definition at line 330 of file SubgraphView.cpp.

331 {
332  return end();
333 }

References SubgraphView::end().

◆ Clear()

void Clear ( )

Definition at line 346 of file SubgraphView.cpp.

347 {
348  m_InputSlots.clear();
349  m_OutputSlots.clear();
350  m_Layers.clear();
351 
352  m_IInputSlots.clear();
353  m_IOutputSlots.clear();
354  m_IConnectableLayers.clear();
355 }

◆ end() [1/2]

◆ end() [2/2]

◆ ForEachIConnectableLayer()

void ForEachIConnectableLayer ( Func  func) const
inline

Definition at line 46 of file SubgraphView.hpp.

47  {
48  for (auto it = m_IConnectableLayers.begin(); it != m_IConnectableLayers.end(); )
49  {
50  auto next = std::next(it);
51  func(*it);
52  it = next;
53  }
54  }

Referenced by SubgraphView::SubstituteSubgraph(), and Graph::SubstituteSubgraph().

◆ ForEachLayer()

void ForEachLayer ( Func  func) const
inline

Definition at line 35 of file SubgraphView.hpp.

36  {
37  for (auto it = m_Layers.begin(); it != m_Layers.end(); )
38  {
39  auto next = std::next(it);
40  func(*it);
41  it = next;
42  }
43  }

◆ GetIConnectableLayers()

const SubgraphView::IConnectableLayers & GetIConnectableLayers ( ) const

Definition at line 278 of file SubgraphView.cpp.

279 {
280  return m_IConnectableLayers;
281 }

Referenced by armnn::ApplyBackendOptimizations(), SubgraphView::GetWorkingCopy(), SubgraphViewSelector::SelectSubgraphs(), and OptimizationViews::Validate().

◆ GetIInputSlot() [1/2]

IInputSlot * GetIInputSlot ( unsigned int  index)

Definition at line 248 of file SubgraphView.cpp.

249 {
250  return m_IInputSlots.at(index);
251 }

◆ GetIInputSlot() [2/2]

const IInputSlot * GetIInputSlot ( unsigned int  index) const

Definition at line 243 of file SubgraphView.cpp.

244 {
245  return m_IInputSlots.at(index);
246 }

◆ GetIInputSlots()

const SubgraphView::IInputSlots & GetIInputSlots ( ) const

◆ GetIOutputSlot() [1/2]

IOutputSlot * GetIOutputSlot ( unsigned int  index)

Definition at line 263 of file SubgraphView.cpp.

264 {
265  return m_IOutputSlots.at(index);
266 }

◆ GetIOutputSlot() [2/2]

const IOutputSlot * GetIOutputSlot ( unsigned int  index) const

Definition at line 253 of file SubgraphView.cpp.

254 {
255  return m_IOutputSlots.at(index);
256 }

Referenced by TosaRefBackend::OptimizeSubgraphView().

◆ GetIOutputSlots()

const SubgraphView::IOutputSlots & GetIOutputSlots ( ) const

Definition at line 238 of file SubgraphView.cpp.

239 {
240  return m_IOutputSlots;
241 }

Referenced by SubgraphView::GetWorkingCopy(), SubgraphView::SubstituteSubgraph(), and OptimizationViews::Validate().

◆ GetNumInputSlots()

unsigned int GetNumInputSlots ( ) const

Definition at line 268 of file SubgraphView.cpp.

269 {
270  return armnn::numeric_cast<unsigned int>(m_IInputSlots.size());
271 }

Referenced by TosaRefBackend::OptimizeSubgraphView().

◆ GetNumOutputSlots()

unsigned int GetNumOutputSlots ( ) const

Definition at line 273 of file SubgraphView.cpp.

274 {
275  return armnn::numeric_cast<unsigned int>(m_IOutputSlots.size());
276 }

Referenced by TosaRefBackend::OptimizeSubgraphView(), and GpuFsaBackend::OptimizeSubgraphView().

◆ GetOriginalInputSlots()

const SubgraphView::IInputSlots & GetOriginalInputSlots ( ) const

These methods should be called on a working copy subgraph created from GetWorkingCopy.

They return pointers to the input and output Slots belonging to the original SubgraphView that the working copy was created from. This may be used to find the original TensorInfo of connected boundary OutputSlots.

Definition at line 602 of file SubgraphView.cpp.

603 {
604  if (!p_WorkingCopyImpl)
605  {
606  throw NullPointerException("The SubgraphView calling GetOriginalInputSlots is not a working copy. "
607  "Call this function on SubgraphView returned from SubgraphView::GetWorkingCopy()");
608  }
609  if (!p_WorkingCopyImpl->m_OriginalSubgraphView)
610  {
611  throw NullPointerException("The working copy SubgraphView pointer to its original SubgraphView is null.");
612  }
613  return p_WorkingCopyImpl->m_OriginalSubgraphView->GetIInputSlots();
614 }

◆ GetOriginalOutputSlots()

const SubgraphView::IOutputSlots & GetOriginalOutputSlots ( ) const

Definition at line 615 of file SubgraphView.cpp.

616 {
617  if (!p_WorkingCopyImpl)
618  {
619  throw NullPointerException("The SubgraphView calling GetOriginalOutputSlots is not a working copy. "
620  "Call this function on SubgraphView returned from SubgraphView::GetWorkingCopy()");
621  }
622  if (!p_WorkingCopyImpl->m_OriginalSubgraphView)
623  {
624  throw NullPointerException("The working copy SubgraphView pointer to its original SubgraphView is null.");
625  }
626  return p_WorkingCopyImpl->m_OriginalSubgraphView->GetIOutputSlots();
627 }

◆ GetOutputSlot()

OutputSlot * GetOutputSlot ( unsigned int  index)

Definition at line 258 of file SubgraphView.cpp.

259 {
260  return m_OutputSlots.at(index);
261 }

◆ GetWorkingCopy()

SubgraphView GetWorkingCopy ( ) const

This method returns a copy of the original SubgraphView provided by OptimizeSubgraphView with a separate underlying graph from the main ArmNN graph.

Backend users should edit this working copy and then add it as a SubstitutionPair, along with original SubgraphView, to the OptimizationViews returned by OptimizeSubgraphView. ArmNN will then decide on whether or not to carry out Substitution of the two SubgraphViews.

Definition at line 393 of file SubgraphView.cpp.

394 {
395  if (p_WorkingCopyImpl)
396  {
397  throw Exception("The SubgraphView calling GetWorkingCopy() is already a working copy. This function "
398  "should be called on original SubgraphView obtained from OptimizeSubgraphView()");
399  }
400 
401  // Create a cut down SubgraphView with underlying graph containing only the relevant layers.
402  // It needs its own underlying layers so that they can be replaced safely.
403  auto ptr = std::make_shared<SubgraphViewWorkingCopy>(Graph(), shared_from_this());
404 
405  std::unordered_map<const IConnectableLayer*, IConnectableLayer*> originalToClonedLayerMap;
406  std::list<armnn::IConnectableLayer*> originalSubgraphLayers = GetIConnectableLayers();
407 
408  for (auto&& originalLayer : originalSubgraphLayers)
409  {
410  Layer* const layer = PolymorphicDowncast<const Layer*>(originalLayer)->Clone(ptr->m_Graph);
411  originalToClonedLayerMap.emplace(originalLayer, layer);
412  }
413 
414  SubgraphView::IInputSlots workingCopyInputs;
415  // Add IInputSlots to workingCopy
416  for (auto originalSubgraphInputSlot : GetIInputSlots())
417  {
418  const IConnectableLayer& originalSubgraphLayer =
419  PolymorphicDowncast<InputSlot*>(originalSubgraphInputSlot)->GetOwningLayer();
420 
421  auto* clonedLayer = originalToClonedLayerMap[&originalSubgraphLayer];
422 
423  workingCopyInputs.push_back(&clonedLayer->GetInputSlot(originalSubgraphInputSlot->GetSlotIndex()));
424  }
425 
426  for (auto originalSubgraphLayer : originalSubgraphLayers)
427  {
428  IConnectableLayer* const clonedLayer = originalToClonedLayerMap[originalSubgraphLayer];
429 
430  // OutputLayers have no OutputSlots to be connected
431  if (clonedLayer->GetType() != LayerType::Output)
432  {
433  // connect all cloned layers as per original subgraph
434  for (unsigned int i = 0; i < clonedLayer->GetNumOutputSlots(); i++)
435  {
436  auto& originalOutputSlot = originalSubgraphLayer->GetOutputSlot(i);
437  auto& clonedOutputSlot = clonedLayer->GetOutputSlot(i);
438  for (unsigned int j = 0; j < originalOutputSlot.GetNumConnections(); j++)
439  {
440  // nextLayer is the layer with IInputSlot connected to IOutputSlot we are working on
441  const IConnectableLayer& nextLayerOnOriginalSubgraph =
442  originalOutputSlot.GetConnection(j)->GetOwningIConnectableLayer();
443 
444  // Check the layer is in our map and so has a clonedLayer
445  if (originalToClonedLayerMap.find(&nextLayerOnOriginalSubgraph) != originalToClonedLayerMap.end())
446  {
447  auto* nextLayerOnClonedSubgraph = originalToClonedLayerMap[&nextLayerOnOriginalSubgraph];
448 
449  auto index = PolymorphicDowncast<OutputSlot*>(
450  &originalOutputSlot)->GetConnection(j)->GetSlotIndex();
451 
452  IInputSlot& inputSlot = nextLayerOnClonedSubgraph->GetInputSlot(index);
453 
454  // Then make the connection
455  clonedOutputSlot.Connect(inputSlot);
456  }
457  }
458  // Copy the tensorInfo to the clonedOutputSlot
459  clonedOutputSlot.SetTensorInfo(originalOutputSlot.GetTensorInfo());
460  }
461  }
462  }
463 
464  SubgraphView::IOutputSlots workingCopyOutputs;
465 
466  // Add IOutputSlots to workingCopy
467  for (auto outputSlot : GetIOutputSlots())
468  {
469  auto outputSlotIndex = outputSlot->CalculateIndexOnOwner();
470  const IConnectableLayer& originalSubgraphLayer = outputSlot->GetOwningIConnectableLayer();
471 
472  // OutputLayers have no OutputSlots to be connected
473  if (originalSubgraphLayer.GetType() != LayerType::Output)
474  {
475  IConnectableLayer* clonedLayer = originalToClonedLayerMap[&originalSubgraphLayer];
476 
477  // Add the OutputSlot of clonedLayer to WorkingCopy OutputSlots
478  workingCopyOutputs.push_back(&clonedLayer->GetOutputSlot(outputSlotIndex));
479  }
480  }
481 
482  SubgraphView::IConnectableLayers workingCopyLayers;
483  for (auto& pair : originalToClonedLayerMap)
484  {
485  workingCopyLayers.push_back(pair.second);
486  }
487 
488  return {std::move(workingCopyLayers),
489  std::move(workingCopyInputs),
490  std::move(workingCopyOutputs),
491  ptr};
492 }

References Layer::Clone(), SubgraphView::GetIConnectableLayers(), SubgraphView::GetIInputSlots(), SubgraphView::GetIOutputSlots(), IConnectableLayer::GetNumOutputSlots(), IConnectableLayer::GetOutputSlot(), IConnectableLayer::GetType(), armnn::Output, and IInputSlot::SetTensorInfo().

◆ operator=()

SubgraphView & operator= ( SubgraphView &&  other)

Move-assignment operator.

Definition at line 197 of file SubgraphView.cpp.

198 {
199  m_InputSlots = std::move(other.m_InputSlots);
200  m_IInputSlots = std::move(other.m_IInputSlots);
201  m_OutputSlots = std::move(other.m_OutputSlots);
202  m_IOutputSlots = std::move(other.m_IOutputSlots);
203  m_Layers = std::move(other.m_Layers);
204  m_IConnectableLayers = std::move(other.m_IConnectableLayers);
205 
206  CheckSubgraph();
207 
208  return *this;
209 }

◆ SubstituteSubgraph() [1/2]

void SubstituteSubgraph ( SubgraphView patternSubgraph,
const SubgraphView substituteSubgraph 
)

Definition at line 536 of file SubgraphView.cpp.

537 {
538  if (!p_WorkingCopyImpl)
539  {
540  throw NullPointerException("The SubgraphView calling SubstituteSubgraphView is not a working copy. "
541  "Call this function on SubgraphView returned from SubgraphView::GetWorkingCopy()");
542  }
543 
544  auto numPatternInputs = patternSubgraph.GetIInputSlots().size();
545  auto numSubInputs = substituteSubgraph.GetIInputSlots().size();
546  if (numPatternInputs != numSubInputs)
547  {
549  fmt::format("Number of InputSlots on substitute SubgraphView ({}) must equal the number of"
550  " InputSlots on pattern SubgraphView ({})",
551  numSubInputs,
552  numPatternInputs));
553  }
554 
555  auto numPatternOutputs = patternSubgraph.GetIOutputSlots().size();
556  auto numSubOutputs = substituteSubgraph.GetIOutputSlots().size();
557  if (numPatternOutputs != numSubOutputs)
558  {
560  fmt::format("Number of OutputSlots on substitute SubgraphView ({}) must equal the number of"
561  " OutputSlots on pattern SubgraphView ({})",
562  numSubOutputs,
563  numPatternOutputs));
564  }
565 
566  // Add substitute layer to the Main graph i.e. graph in p_WorkingCopyImpl
567  auto workingCopyGraph = &p_WorkingCopyImpl->m_Graph;
568  substituteSubgraph.ForEachIConnectableLayer([workingCopyGraph](IConnectableLayer* iConnectableLayer)
569  {
570  // Search WorkingCopy Graph for substituteLayer and add if missing
571  if (std::find(std::begin(workingCopyGraph->m_Layers),
572  std::end(workingCopyGraph->m_Layers),
573  iConnectableLayer) ==
574  std::end(workingCopyGraph->m_Layers))
575  {
576  auto layer = PolymorphicDowncast<Layer*>(iConnectableLayer);
577 
578  layer->Reparent(*workingCopyGraph,
579  (workingCopyGraph->m_Layers).end());
580 
581  workingCopyGraph->m_LayersInOrder = false;
582  }
583  });
584 
585  // Replace the old connections with connections to new layer
586  workingCopyGraph->ReplaceSubgraphConnections(patternSubgraph, substituteSubgraph);
587 
588  // Update input/outputSlot pointers
589  UpdateSubgraphViewSlotPointers(patternSubgraph, substituteSubgraph);
590 
591  // Delete the old layers.
592  workingCopyGraph->EraseSubgraphLayers(patternSubgraph);
593 
594  // Sort
595  workingCopyGraph->TopologicalSort();
596 
597  // Update SubgraphView layer pointers to match those of the internal WorkingCopy layer pointers
598  m_IConnectableLayers = IConnectableLayers{ workingCopyGraph->m_Layers.begin(),
599  workingCopyGraph->m_Layers.end() };
600 }

References SubgraphView::ForEachIConnectableLayer(), SubgraphView::GetIInputSlots(), and SubgraphView::GetIOutputSlots().

◆ SubstituteSubgraph() [2/2]

void SubstituteSubgraph ( SubgraphView subgraph,
IConnectableLayer substituteLayer 
)

These methods should be called on a working copy subgraph created from GetWorkingCopy.

They take a SubgraphView pattern to replace and the substitute layer or subgraphView to substitute in.

Definition at line 494 of file SubgraphView.cpp.

495 {
496  ARMNN_ASSERT(substituteLayer != nullptr);
497  SubgraphView substituteSubgraph(substituteLayer);
498 
499  SubstituteSubgraph(subgraph, substituteSubgraph);
500 }

References ARMNN_ASSERT.

Member Data Documentation

◆ layers

OutputSlots Layers&& layers

Definition at line 74 of file SubgraphView.hpp.

◆ outputs

OutputSlots&& outputs

Definition at line 74 of file SubgraphView.hpp.


The documentation for this class was generated from the following files:
ARMNN_ASSERT
#define ARMNN_ASSERT(COND)
Definition: Assert.hpp:14
armnn::SubgraphView::IOutputSlots
std::vector< IOutputSlot * > IOutputSlots
Definition: SubgraphView.hpp:60
armnn::SubgraphView::IConnectableLayers
std::list< IConnectableLayer * > IConnectableLayers
Definition: SubgraphView.hpp:62
armnn::SubgraphView::GetIConnectableLayers
const IConnectableLayers & GetIConnectableLayers() const
Definition: SubgraphView.cpp:278
armnn::SubgraphView::begin
IConnectableLayerIterator begin()
Definition: SubgraphView.cpp:283
armnn::InvalidArgumentException
Definition: Exceptions.hpp:80
armnn::SubgraphView::IInputSlots
std::vector< IInputSlot * > IInputSlots
Definition: SubgraphView.hpp:58
armnn::SubgraphView::layers
OutputSlots Layers && layers
Definition: SubgraphView.hpp:74
armnn::SubgraphView::GetIInputSlots
const IInputSlots & GetIInputSlots() const
Definition: SubgraphView.cpp:233
armnn::SubgraphView::end
IConnectableLayerIterator end()
Definition: SubgraphView.cpp:288
armnn::SubgraphView::outputs
OutputSlots && outputs
Definition: SubgraphView.hpp:74
armnn::SubgraphView::GetIOutputSlots
const IOutputSlots & GetIOutputSlots() const
Definition: SubgraphView.cpp:238
armnn::SubgraphView::SubstituteSubgraph
void SubstituteSubgraph(SubgraphView &, IConnectableLayer *)
These methods should be called on a working copy subgraph created from GetWorkingCopy.
Definition: SubgraphView.cpp:494
armnn::SubgraphView::SubgraphView
SubgraphView(Graph &graph)
Constructs a sub-graph from the entire given graph.
Definition: SubgraphView.cpp:45
armnn::LayerType::Output
@ Output