// // 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.11") 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.11") 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.11") 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.11") 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.11") 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.11") 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.11") 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.11") 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