ArmNN
 25.11
Loading...
Searching...
No Matches
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.
 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.
 SubgraphView (IConnectableLayers &&layers, IInputSlots &&inputs, IOutputSlots &&outputs)
 Constructs a sub-graph with the given arguments.
 SubgraphView (const SubgraphView &subgraph)
 Copy-constructor.
 SubgraphView (SubgraphView &&subgraph)
 Move-constructor.
 SubgraphView (IConnectableLayer *layer)
 Constructs a sub-graph with only the given layer.
SubgraphViewoperator= (SubgraphView &&other)
 Move-assignment operator.
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.
void SubstituteSubgraph (SubgraphView &, IConnectableLayer *)
 These methods should be called on a working copy subgraph created from GetWorkingCopy.
void SubstituteSubgraph (SubgraphView &, const SubgraphView &)
const IInputSlotsGetOriginalInputSlots () const
 These methods should be called on a working copy subgraph created from GetWorkingCopy.
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}

References begin(), end(), and SubgraphView().

Referenced by ARMNN_DEPRECATED_MSG_CHANGE_DATE(), GetWorkingCopy(), operator=(), SubgraphView(), SubgraphView(), SubgraphView(), SubstituteSubgraph(), and SubstituteSubgraph().

◆ 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}

References begin(), end(), layers, outputs, and armnn::PolymorphicDowncast().

◆ 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}

References begin(), end(), and SubgraphView().

◆ 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}

References SubgraphView().

◆ 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}

References IConnectableLayer::GetInputSlot(), IConnectableLayer::GetNumInputSlots(), IConnectableLayer::GetNumOutputSlots(), IConnectableLayer::GetOutputSlot(), and armnn::PolymorphicDowncast().

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]

Definition at line 307 of file SubgraphView.cpp.

308{
309 return m_IConnectableLayers.begin();
310}

◆ cbegin()

Definition at line 328 of file SubgraphView.cpp.

329{
330 return begin();
331}

References begin().

Referenced by ARMNN_DEPRECATED_MSG_CHANGE_DATE().

◆ cend()

Definition at line 333 of file SubgraphView.cpp.

334{
335 return end();
336}

References end().

Referenced by ARMNN_DEPRECATED_MSG_CHANGE_DATE().

◆ 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}

Referenced by ARMNN_DEPRECATED_MSG_CHANGE_DATE().

◆ end() [1/2]

◆ end() [2/2]

Definition at line 312 of file SubgraphView.cpp.

313{
314 return m_IConnectableLayers.end();
315}

◆ ForEachIConnectableLayer()

template<typename Func>
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 Graph::SubstituteSubgraph(), and SubstituteSubgraph().

◆ ForEachLayer()

template<typename Func>
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(), 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

Definition at line 236 of file SubgraphView.cpp.

237{
238 return m_IInputSlots;
239}

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

◆ 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 GetWorkingCopy(), 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}
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)

References armnn::numeric_cast().

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}

References armnn::numeric_cast().

Referenced by TosaRefBackend::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}

Referenced by ARMNN_DEPRECATED_MSG_CHANGE_DATE().

◆ 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}

Referenced by ARMNN_DEPRECATED_MSG_CHANGE_DATE().

◆ 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(), GetIConnectableLayers(), GetIInputSlots(), GetIOutputSlots(), IConnectableLayer::GetNumOutputSlots(), IConnectableLayer::GetOutputSlot(), IConnectableLayer::GetType(), armnn::Output, armnn::PolymorphicDowncast(), IOutputSlot::SetTensorInfo(), and SubgraphView().

Referenced by ARMNN_DEPRECATED_MSG_CHANGE_DATE().

◆ 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}

References SubgraphView().

◆ 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 {
552 throw armnn::InvalidArgumentException(
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 {
563 throw armnn::InvalidArgumentException(
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 ForEachIConnectableLayer(), GetIInputSlots(), GetIOutputSlots(), armnn::PolymorphicDowncast(), and SubgraphView().

◆ 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}
#define ARMNN_THROW_INVALIDARG_MSG_IF_FALSE(_cond, _str)

References ARMNN_THROW_INVALIDARG_MSG_IF_FALSE, SubgraphView(), and SubstituteSubgraph().

Referenced by ARMNN_DEPRECATED_MSG_CHANGE_DATE(), and SubstituteSubgraph().

Member Data Documentation

◆ layers

OutputSlots Layers&& layers

Definition at line 74 of file SubgraphView.hpp.

Referenced by ARMNN_DEPRECATED_MSG_CHANGE_DATE(), and SubgraphView().

◆ outputs

OutputSlots&& outputs

Definition at line 74 of file SubgraphView.hpp.

Referenced by ARMNN_DEPRECATED_MSG_CHANGE_DATE(), and SubgraphView().


The documentation for this class was generated from the following files: