diff options
author | Francis Murtagh <francis.murtagh@arm.com> | 2021-12-13 18:48:12 +0000 |
---|---|---|
committer | Francis Murtagh <francis.murtagh@arm.com> | 2022-01-14 16:01:58 +0000 |
commit | 56ccf68c7858560f2ba00f19076b3cb112970881 (patch) | |
tree | 6e19cd38aa1d452ca3b9a9a1f68ff42dd64dc1d7 /src/armnn/SubgraphView.cpp | |
parent | 2db6d5aff3d4f596d4b4018a7b454c2a2c8f7122 (diff) | |
download | armnn-56ccf68c7858560f2ba00f19076b3cb112970881.tar.gz |
IVGCVSW-6633 SubgraphView uses IConnectableLayer rather than Layer in its m_Layers
* Added IInputSlot, IOutputSlot and IConnectableLayer to SubgraphView
* Deprecated old member functions
* Removed deprecated calls in ArmNN
* Added GetOwningIConnectableLayer function to IOutputSlot
* Updates ArmNN Core Major version for IOutputSlot ABI break
* Updated Minor version of TfliteParser, OnnxParser and Delegate
Signed-off-by: Francis Murtagh <francis.murtagh@arm.com>
Change-Id: I2a8611bfabf5ae09d3602fe6a4bef166e18117b9
Diffstat (limited to 'src/armnn/SubgraphView.cpp')
-rw-r--r-- | src/armnn/SubgraphView.cpp | 168 |
1 files changed, 160 insertions, 8 deletions
diff --git a/src/armnn/SubgraphView.cpp b/src/armnn/SubgraphView.cpp index 0d41889e15..2de4510b7b 100644 --- a/src/armnn/SubgraphView.cpp +++ b/src/armnn/SubgraphView.cpp @@ -44,24 +44,69 @@ SubgraphView::SubgraphView(Graph& graph) : m_InputSlots{} , m_OutputSlots{} , m_Layers(graph.begin(), graph.end()) + , m_IConnectableLayers(graph.begin(), graph.end()) { ArrangeBySortOrder(); CheckSubgraph(); } +/// IConnectable Duplication to maintain backwards compatibility SubgraphView::SubgraphView(InputSlots&& inputs, OutputSlots&& outputs, Layers&& layers) - : m_InputSlots{inputs} - , m_OutputSlots{outputs} - , m_Layers{layers} + : m_InputSlots{InputSlots{inputs.begin(), inputs.end()}} + , m_IInputSlots{IInputSlots{inputs.begin(), inputs.end()}} + , m_OutputSlots{OutputSlots{outputs.begin(), outputs.end()}} + , m_IOutputSlots{IOutputSlots{outputs.begin(), outputs.end()}} + , m_Layers(layers) + , m_IConnectableLayers(IConnectableLayers{layers.begin(), layers.end()}) { ArrangeBySortOrder(); CheckSubgraph(); } +/// IConnectable Duplication to maintain backwards compatibility +SubgraphView::SubgraphView(SubgraphView::IConnectableLayers &&layers, + SubgraphView::IInputSlots &&inputs, + SubgraphView::IOutputSlots &&outputs) + : m_IInputSlots{inputs} + , m_IOutputSlots{outputs} + , m_IConnectableLayers(IConnectableLayers{layers.begin(), layers.end()}) +{ + // Cast from IConnectableLayer to Layer for backward compatibility + auto f = [](IConnectableLayer* value) + { + return PolymorphicDowncast<Layer*>(value); + }; + std::transform(layers.begin(), layers.end(), std::back_inserter(m_Layers), f); + + + m_InputSlots.resize(inputs.size()); + m_IInputSlots.resize(inputs.size()); + for (unsigned int i = 0; i < inputs.size(); i++) + { + m_InputSlots.at(i) = PolymorphicDowncast<InputSlot*>(inputs[i]); + m_IInputSlots.at(i) = inputs[i]; + } + + m_OutputSlots.resize(outputs.size()); + m_IOutputSlots.resize(outputs.size()); + for (unsigned int i = 0; i < outputs.size(); i++) + { + m_OutputSlots.at(i) = PolymorphicDowncast<OutputSlot*>(outputs[i]); + m_IOutputSlots.at(i) = outputs[i]; + } + + ArrangeBySortOrder(); + CheckSubgraph(); +} + SubgraphView::SubgraphView(const SubgraphView& subgraph) : m_InputSlots(subgraph.m_InputSlots.begin(), subgraph.m_InputSlots.end()) + , m_IInputSlots(subgraph.m_IInputSlots.begin(), subgraph.m_IInputSlots.end()) , m_OutputSlots(subgraph.m_OutputSlots.begin(), subgraph.m_OutputSlots.end()) + , m_IOutputSlots(subgraph.m_IOutputSlots.begin(), subgraph.m_IOutputSlots.end()) , m_Layers(subgraph.m_Layers.begin(), subgraph.m_Layers.end()) + , m_IConnectableLayers(IConnectableLayers{subgraph.m_IConnectableLayers.begin(), + subgraph.m_IConnectableLayers.end()}) { ArrangeBySortOrder(); CheckSubgraph(); @@ -69,30 +114,36 @@ SubgraphView::SubgraphView(const SubgraphView& subgraph) SubgraphView::SubgraphView(SubgraphView&& subgraph) : m_InputSlots(std::move(subgraph.m_InputSlots)) + , m_IInputSlots(std::move(subgraph.m_IInputSlots)) , m_OutputSlots(std::move(subgraph.m_OutputSlots)) + , m_IOutputSlots(std::move(subgraph.m_IOutputSlots)) , m_Layers(std::move(subgraph.m_Layers)) + , m_IConnectableLayers(std::move(subgraph.m_IConnectableLayers)) { ArrangeBySortOrder(); CheckSubgraph(); } SubgraphView::SubgraphView(IConnectableLayer* layer) - : m_InputSlots{} - , m_OutputSlots{} - , m_Layers{PolymorphicDowncast<Layer*>(layer)} + : m_Layers{PolymorphicDowncast<Layer*>(layer)} + , m_IConnectableLayers{layer} { unsigned int numInputSlots = layer->GetNumInputSlots(); m_InputSlots.resize(numInputSlots); + m_IInputSlots.resize(numInputSlots); for (unsigned int i = 0; i < numInputSlots; i++) { m_InputSlots.at(i) = PolymorphicDowncast<InputSlot*>(&(layer->GetInputSlot(i))); + m_IInputSlots.at(i) = &(layer->GetInputSlot(i)); } unsigned int numOutputSlots = layer->GetNumOutputSlots(); m_OutputSlots.resize(numOutputSlots); + m_IOutputSlots.resize(numOutputSlots); for (unsigned int i = 0; i < numOutputSlots; i++) { m_OutputSlots.at(i) = PolymorphicDowncast<OutputSlot*>(&(layer->GetOutputSlot(i))); + m_IOutputSlots.at(i) = &(layer->GetOutputSlot(i)); } CheckSubgraph(); @@ -101,8 +152,11 @@ SubgraphView::SubgraphView(IConnectableLayer* layer) SubgraphView& SubgraphView::operator=(SubgraphView&& other) { m_InputSlots = std::move(other.m_InputSlots); + m_IInputSlots = std::move(other.m_IInputSlots); m_OutputSlots = std::move(other.m_OutputSlots); + m_IOutputSlots = std::move(other.m_IOutputSlots); m_Layers = std::move(other.m_Layers); + m_IConnectableLayers = std::move(other.m_IConnectableLayers); CheckSubgraph(); @@ -119,6 +173,16 @@ void SubgraphView::CheckSubgraph() // Check for invalid or duplicate layers AssertIfNullsOrDuplicates(m_Layers, "Sub-graphs cannot contain null or duplicate layers"); + + // Check for invalid or duplicate input slots + AssertIfNullsOrDuplicates(m_IInputSlots, "Sub-graphs cannot contain null or duplicate IInputSlots"); + + // Check for invalid or duplicate output slots + AssertIfNullsOrDuplicates(m_IOutputSlots, "Sub-graphs cannot contain null or duplicate IOutputSlots"); + + // Check for invalid or duplicate layers + AssertIfNullsOrDuplicates(m_IConnectableLayers, + "Sub-graphs cannot contain null or duplicate IConnectableLayers"); } const SubgraphView::InputSlots& SubgraphView::GetInputSlots() const @@ -126,39 +190,69 @@ const SubgraphView::InputSlots& SubgraphView::GetInputSlots() const return m_InputSlots; } +const SubgraphView::IInputSlots& SubgraphView::GetIInputSlots() const +{ + return m_IInputSlots; +} + const SubgraphView::OutputSlots& SubgraphView::GetOutputSlots() const { return m_OutputSlots; } +const SubgraphView::IOutputSlots& SubgraphView::GetIOutputSlots() const +{ + return m_IOutputSlots; +} + const InputSlot* SubgraphView::GetInputSlot(unsigned int index) const { return m_InputSlots.at(index); } +const IInputSlot* SubgraphView::GetIInputSlot(unsigned int index) const +{ + return m_IInputSlots.at(index); +} + InputSlot* SubgraphView::GetInputSlot(unsigned int index) { return m_InputSlots.at(index); } +IInputSlot* SubgraphView::GetIInputSlot(unsigned int index) +{ + return m_IInputSlots.at(index); +} + const OutputSlot* SubgraphView::GetOutputSlot(unsigned int index) const { return m_OutputSlots.at(index); } +const IOutputSlot* SubgraphView::GetIOutputSlot(unsigned int index) const +{ + return m_IOutputSlots.at(index); +} + OutputSlot* SubgraphView::GetOutputSlot(unsigned int index) { return m_OutputSlots.at(index); } +IOutputSlot* SubgraphView::GetIOutputSlot(unsigned int index) +{ + return m_IOutputSlots.at(index); +} + unsigned int SubgraphView::GetNumInputSlots() const { - return armnn::numeric_cast<unsigned int>(m_InputSlots.size()); + return armnn::numeric_cast<unsigned int>(m_IInputSlots.size()); } unsigned int SubgraphView::GetNumOutputSlots() const { - return armnn::numeric_cast<unsigned int>(m_OutputSlots.size()); + return armnn::numeric_cast<unsigned int>(m_IOutputSlots.size()); } const SubgraphView::Layers& SubgraphView::GetLayers() const @@ -166,6 +260,11 @@ const SubgraphView::Layers& SubgraphView::GetLayers() const return m_Layers; } +const SubgraphView::IConnectableLayers& SubgraphView::GetIConnectableLayers() const +{ + return m_IConnectableLayers; +} + SubgraphView::Iterator SubgraphView::begin() { return m_Layers.begin(); @@ -176,6 +275,17 @@ SubgraphView::Iterator SubgraphView::end() return m_Layers.end(); } +// IConnectable Duplication to maintain backwards compatibility +SubgraphView::IConnectableLayerIterator SubgraphView::beginIConnectable() +{ + return m_IConnectableLayers.begin(); +} + +SubgraphView::IConnectableLayerIterator SubgraphView::endIConnectable() +{ + return m_IConnectableLayers.end(); +} + SubgraphView::ConstIterator SubgraphView::begin() const { return m_Layers.begin(); @@ -186,14 +296,42 @@ SubgraphView::ConstIterator SubgraphView::end() const return m_Layers.end(); } +// IConnectable Duplication to maintain backwards compatibility +SubgraphView::ConstIConnectableIterator SubgraphView::beginIConnectable() const +{ + return m_IConnectableLayers.begin(); +} + +SubgraphView::ConstIConnectableIterator SubgraphView::endIConnectable() const +{ + return m_IConnectableLayers.end(); +} + SubgraphView::ConstIterator SubgraphView::cbegin() const { + // Ignore deprecated call as this is internal to SubgraphView + ARMNN_NO_DEPRECATE_WARN_BEGIN return begin(); + ARMNN_NO_DEPRECATE_WARN_END } SubgraphView::ConstIterator SubgraphView::cend() const { + // Ignore deprecated call as this is internal to SubgraphView + ARMNN_NO_DEPRECATE_WARN_BEGIN return end(); + ARMNN_NO_DEPRECATE_WARN_END +} + +// IConnectable Duplication to maintain backwards compatibility +SubgraphView::ConstIConnectableIterator SubgraphView::cbeginIConnectable() const +{ + return beginIConnectable(); +} + +SubgraphView::ConstIConnectableIterator SubgraphView::cendIConnectable() const +{ + return endIConnectable(); } void SubgraphView::Clear() @@ -201,6 +339,10 @@ void SubgraphView::Clear() m_InputSlots.clear(); m_OutputSlots.clear(); m_Layers.clear(); + + m_IInputSlots.clear(); + m_IOutputSlots.clear(); + m_IConnectableLayers.clear(); } void SubgraphView::ArrangeBySortOrder() @@ -212,6 +354,16 @@ void SubgraphView::ArrangeBySortOrder() }; m_Layers.sort(compareLayerPriority); + + using IConnectableLayersList = std::list<IConnectableLayer*>; + auto compareIConnectableLayerPriority = [](const IConnectableLayersList::value_type& layerA, + const IConnectableLayersList::value_type& layerB) + { + return PolymorphicDowncast<Layer*>(layerA)->GetPriority() < + PolymorphicDowncast<Layer*>(layerB)->GetPriority(); + }; + + m_IConnectableLayers.sort(compareIConnectableLayerPriority); } } // namespace armnn |