ArmNN
 24.05
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 48 of file SubgraphView.cpp.

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

◆ SubgraphView() [2/5]

Constructs a sub-graph with the given arguments.

IConnectable Duplication to maintain backwards compatibility.

Definition at line 74 of file SubgraphView.cpp.

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

◆ SubgraphView() [3/5]

SubgraphView ( const SubgraphView subgraph)

Copy-constructor.

Definition at line 147 of file SubgraphView.cpp.

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

◆ SubgraphView() [4/5]

SubgraphView ( SubgraphView &&  subgraph)

Move-constructor.

Definition at line 161 of file SubgraphView.cpp.

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

◆ SubgraphView() [5/5]

Constructs a sub-graph with only the given layer.

Definition at line 174 of file SubgraphView.cpp.

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

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 328 of file SubgraphView.cpp.

329 {
330  return begin();
331 }

References SubgraphView::begin().

◆ cend()

Definition at line 333 of file SubgraphView.cpp.

334 {
335  return end();
336 }

References SubgraphView::end().

◆ Clear()

void Clear ( )

Definition at line 349 of file SubgraphView.cpp.

350 {
351  m_InputSlots.clear();
352  m_OutputSlots.clear();
353  m_Layers.clear();
354 
355  m_IInputSlots.clear();
356  m_IOutputSlots.clear();
357  m_IConnectableLayers.clear();
358 }

◆ 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 281 of file SubgraphView.cpp.

282 {
283  return m_IConnectableLayers;
284 }

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

◆ GetIInputSlot() [1/2]

IInputSlot * GetIInputSlot ( unsigned int  index)

Definition at line 251 of file SubgraphView.cpp.

252 {
253  return m_IInputSlots.at(index);
254 }

◆ GetIInputSlot() [2/2]

const IInputSlot * GetIInputSlot ( unsigned int  index) const

Definition at line 246 of file SubgraphView.cpp.

247 {
248  return m_IInputSlots.at(index);
249 }

◆ GetIInputSlots()

const SubgraphView::IInputSlots & GetIInputSlots ( ) const

◆ GetIOutputSlot() [1/2]

IOutputSlot * GetIOutputSlot ( unsigned int  index)

Definition at line 266 of file SubgraphView.cpp.

267 {
268  return m_IOutputSlots.at(index);
269 }

◆ GetIOutputSlot() [2/2]

const IOutputSlot * GetIOutputSlot ( unsigned int  index) const

Definition at line 256 of file SubgraphView.cpp.

257 {
258  return m_IOutputSlots.at(index);
259 }

Referenced by TosaRefBackend::OptimizeSubgraphView().

◆ GetIOutputSlots()

const SubgraphView::IOutputSlots & GetIOutputSlots ( ) const

Definition at line 241 of file SubgraphView.cpp.

242 {
243  return m_IOutputSlots;
244 }

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

◆ GetNumInputSlots()

unsigned int GetNumInputSlots ( ) const

Definition at line 271 of file SubgraphView.cpp.

272 {
273  return armnn::numeric_cast<unsigned int>(m_IInputSlots.size());
274 }

Referenced by TosaRefBackend::OptimizeSubgraphView().

◆ GetNumOutputSlots()

unsigned int GetNumOutputSlots ( ) const

Definition at line 276 of file SubgraphView.cpp.

277 {
278  return armnn::numeric_cast<unsigned int>(m_IOutputSlots.size());
279 }

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 606 of file SubgraphView.cpp.

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

◆ GetOriginalOutputSlots()

const SubgraphView::IOutputSlots & GetOriginalOutputSlots ( ) const

Definition at line 619 of file SubgraphView.cpp.

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

◆ GetOutputSlot()

OutputSlot * GetOutputSlot ( unsigned int  index)

Definition at line 261 of file SubgraphView.cpp.

262 {
263  return m_OutputSlots.at(index);
264 }

◆ 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 396 of file SubgraphView.cpp.

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

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 200 of file SubgraphView.cpp.

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

◆ SubstituteSubgraph() [1/2]

void SubstituteSubgraph ( SubgraphView patternSubgraph,
const SubgraphView substituteSubgraph 
)

Definition at line 540 of file SubgraphView.cpp.

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

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 497 of file SubgraphView.cpp.

498 {
499  ARMNN_THROW_INVALIDARG_MSG_IF_FALSE(substituteLayer, "substituteLayer should not be null");
500 
501  SubgraphView substituteSubgraph(substituteLayer);
502 
503  SubstituteSubgraph(subgraph, substituteSubgraph);
504 }

References ARMNN_THROW_INVALIDARG_MSG_IF_FALSE.

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::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:281
armnn::SubgraphView::begin
IConnectableLayerIterator begin()
Definition: SubgraphView.cpp:286
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:236
armnn::SubgraphView::end
IConnectableLayerIterator end()
Definition: SubgraphView.cpp:291
armnn::SubgraphView::outputs
OutputSlots && outputs
Definition: SubgraphView.hpp:74
armnn::SubgraphView::GetIOutputSlots
const IOutputSlots & GetIOutputSlots() const
Definition: SubgraphView.cpp:241
armnn::SubgraphView::SubstituteSubgraph
void SubstituteSubgraph(SubgraphView &, IConnectableLayer *)
These methods should be called on a working copy subgraph created from GetWorkingCopy.
Definition: SubgraphView.cpp:497
armnn::SubgraphView::SubgraphView
SubgraphView(Graph &graph)
Constructs a sub-graph from the entire given graph.
Definition: SubgraphView.cpp:48
armnn::LayerType::Output
@ Output
ARMNN_THROW_INVALIDARG_MSG_IF_FALSE
#define ARMNN_THROW_INVALIDARG_MSG_IF_FALSE(_cond, _str)
Definition: Exceptions.hpp:210