From a49ff0841e86acb0a77747d93e6c9f18b8517ee8 Mon Sep 17 00:00:00 2001 From: Francis Murtagh Date: Mon, 17 Jan 2022 17:08:01 +0000 Subject: IVGCVSW-6712 Move SubgraphView to backends include folder * Make subgraphview a public interface for backends. Change-Id: I615a29ffec41e947215c3d29c2d7d214e327fb90 Signed-off-by: Francis Murtagh --- include/armnn/backends/IBackendInternal.hpp | 2 +- include/armnn/backends/OptimizationViews.hpp | 2 +- include/armnn/backends/SubgraphView.hpp | 172 +++++++++++++++++++++++++++ 3 files changed, 174 insertions(+), 2 deletions(-) create mode 100644 include/armnn/backends/SubgraphView.hpp (limited to 'include/armnn') diff --git a/include/armnn/backends/IBackendInternal.hpp b/include/armnn/backends/IBackendInternal.hpp index 0756fdd8fb..c64150a484 100644 --- a/include/armnn/backends/IBackendInternal.hpp +++ b/include/armnn/backends/IBackendInternal.hpp @@ -10,12 +10,12 @@ #include #include -#include #include #include #include #include +#include #include #include diff --git a/include/armnn/backends/OptimizationViews.hpp b/include/armnn/backends/OptimizationViews.hpp index f3479febd3..3146dd7f74 100644 --- a/include/armnn/backends/OptimizationViews.hpp +++ b/include/armnn/backends/OptimizationViews.hpp @@ -5,7 +5,7 @@ #pragma once -#include +#include namespace armnn { diff --git a/include/armnn/backends/SubgraphView.hpp b/include/armnn/backends/SubgraphView.hpp new file mode 100644 index 0000000000..b5a74bab5d --- /dev/null +++ b/include/armnn/backends/SubgraphView.hpp @@ -0,0 +1,172 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include +#include + +#include +#include + +namespace armnn +{ + +/// +/// 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. +/// +class SubgraphView final +{ +public: + template + void ForEachLayer(Func func) const + { + for (auto it = m_Layers.begin(); it != m_Layers.end(); ) + { + auto next = std::next(it); + func(*it); + it = next; + } + } + + template + void ForEachIConnectableLayer(Func func) const + { + for (auto it = m_IConnectableLayers.begin(); it != m_IConnectableLayers.end(); ) + { + auto next = std::next(it); + func(*it); + it = next; + } + } + + using SubgraphViewPtr = std::unique_ptr; + using InputSlots = std::vector; + using IInputSlots = std::vector; + using OutputSlots = std::vector; + using IOutputSlots = std::vector; + using Layers = std::list; + using IConnectableLayers = std::list; + using Iterator = Layers::iterator; + using IConnectableLayerIterator = IConnectableLayers::iterator; + using ConstIterator = Layers::const_iterator; + using ConstIConnectableIterator = IConnectableLayers::const_iterator; + + /// Constructs a sub-graph from the entire given graph. + explicit SubgraphView(Graph& graph); + + /// Constructs a sub-graph with the given arguments. + ARMNN_DEPRECATED_MSG_REMOVAL_DATE("This function has been deprecated, please use constructor with arguments: " + "IConnectableLayers, IInputSlots and IOutputSlots", "22.08") + SubgraphView(InputSlots&& inputs, OutputSlots&& outputs, Layers&& layers); + + /// Constructs a sub-graph with the given arguments. + SubgraphView(IConnectableLayers&& layers, IInputSlots&& inputs, IOutputSlots&& outputs); + + /// Copy-constructor. + SubgraphView(const SubgraphView& subgraph); + + /// Move-constructor. + SubgraphView(SubgraphView&& subgraph); + + /// Constructs a sub-graph with only the given layer. + SubgraphView(IConnectableLayer* layer); + + /// Move-assignment operator. + SubgraphView& operator=(SubgraphView&& other); + + ARMNN_DEPRECATED_MSG_REMOVAL_DATE("This function has been deprecated, please use GetIInputSlots() returning" + " public IInputSlots", "22.08") + const InputSlots& GetInputSlots() const; + const IInputSlots& GetIInputSlots() const; + + ARMNN_DEPRECATED_MSG_REMOVAL_DATE("This function has been deprecated, please use GetIOutputSlots() returning" + " public IOutputSlots", "22.08") + const OutputSlots& GetOutputSlots() const; + const IOutputSlots& GetIOutputSlots() const; + + ARMNN_DEPRECATED_MSG_REMOVAL_DATE("This function has been deprecated, please use GetIConnectableLayers() " + "returning public IConnectableLayers", "22.08") + const Layers& GetLayers() const; + const IConnectableLayers& GetIConnectableLayers() const; + + ARMNN_DEPRECATED_MSG_REMOVAL_DATE("This function has been deprecated, please use GetIInputSlot() returning public " + "IInputSlot", "22.08") + const InputSlot* GetInputSlot(unsigned int index) const; + const IInputSlot* GetIInputSlot(unsigned int index) const; + ARMNN_DEPRECATED_MSG_REMOVAL_DATE("This function has been deprecated, please use GetIInputSlot() returning public " + "IInputSlot", "22.08") + InputSlot* GetInputSlot(unsigned int index); + IInputSlot* GetIInputSlot(unsigned int index); + + ARMNN_DEPRECATED_MSG_REMOVAL_DATE("This function has been deprecated, please use GetIOutputSlot() returning" + " public IOutputSlot", "22.08") + const OutputSlot* GetOutputSlot(unsigned int index) const; + const IOutputSlot* GetIOutputSlot(unsigned int index) const; + ARMNN_DEPRECATED_MSG_REMOVAL_DATE("This function has been deprecated, please use GetIOutputSlot() returning" + " public IOutputSlot", "22.08") + OutputSlot* GetOutputSlot(unsigned int index); + IOutputSlot* GetIOutputSlot(unsigned int index); + + unsigned int GetNumInputSlots() const; + unsigned int GetNumOutputSlots() const; + + ARMNN_DEPRECATED_MSG_CHANGE_DATE("This function is deprecated and will be changed to return an " + "IConnectableLayerIterator, until that occurs in 23.02; please use " + "beginIConnectable() returning public IConnectableLayerIterator", "23.02") + Iterator begin(); + IConnectableLayerIterator beginIConnectable(); + ARMNN_DEPRECATED_MSG_CHANGE_DATE("This function is deprecated and will be changed to return an " + "IConnectableLayerIterator, until that occurs in 23.02; please use " + "endIConnectable() returning public IConnectableLayerIterator", "23.02") + Iterator end(); + IConnectableLayerIterator endIConnectable(); + + ARMNN_DEPRECATED_MSG_CHANGE_DATE("This function is deprecated and will be changed to return an " + "ConstIConnectableIterator, until that occurs in 23.02; please use " + "beginIConnectable() returning public ConstIConnectableIterator", "23.02") + ConstIterator begin() const; + ConstIConnectableIterator beginIConnectable() const; + ARMNN_DEPRECATED_MSG_CHANGE_DATE("This function is deprecated and will be changed to return an " + "ConstIConnectableIterator, until that occurs in 23.02; please use " + "endIConnectable() returning public ConstIConnectableIterator", "23.02") + ConstIterator end() const; + ConstIConnectableIterator endIConnectable() const; + + ARMNN_DEPRECATED_MSG_CHANGE_DATE("This function is deprecated and will be changed to return an " + "ConstIConnectableIterator, until that occurs in 23.02; please use " + "cbeginIConnectable() returning public ConstIConnectableIterator", "23.02") + ConstIterator cbegin() const; + ConstIConnectableIterator cbeginIConnectable() const; + ARMNN_DEPRECATED_MSG_CHANGE_DATE("This function is deprecated and will be changed to return an " + "ConstIConnectableIterator, until that occurs in 23.02; please use " + "cendIConnectable() returning public ConstIConnectableIterator", "23.02") + ConstIterator cend() const; + ConstIConnectableIterator cendIConnectable() const; + + void Clear(); + +private: + void CheckSubgraph(); + + /// Arrange the order of layers topologically so that nodes can be visited in valid order + void ArrangeBySortOrder(); + + /// The list of pointers to the input slots of the parent graph. + InputSlots m_InputSlots; + IInputSlots m_IInputSlots; + + /// The list of pointers to the output slots of the parent graph. + OutputSlots m_OutputSlots; + IOutputSlots m_IOutputSlots; + + /// The list of pointers to the layers of the parent graph. + Layers m_Layers; + IConnectableLayers m_IConnectableLayers; +}; +} // namespace armnn -- cgit v1.2.1