1 // 2 // Copyright © 2017 Arm Ltd. All rights reserved. 3 // SPDX-License-Identifier: MIT 4 // 5 #pragma once 6 7 #include "SubgraphView.hpp" 8 #include <functional> 9 #include <memory> 10 11 namespace armnn 12 { 13 14 class Layer; 15 class Graph; 16 17 /// Algorithm that splits a Graph into Subgraphs based on a filtering of layers (e.g. which layers are appropriate for 18 /// a certain backend). The resulting subgraphs are guaranteed to be form a DAG (i.e. there are no dependency loops). 19 /// 20 /// The algorithm aims to produce as few subgraphs as possible. 21 class SubgraphViewSelector final 22 { 23 public: 24 using SubgraphViewPtr = std::unique_ptr<SubgraphView>; 25 using Subgraphs = std::vector<SubgraphViewPtr>; 26 using LayerSelectorFunction = std::function<bool(const Layer&)>; 27 28 /// Selects subgraphs from a graph based on the selector function and the algorithm. 29 /// Since the Subgraphs object returns modifiable pointers to the input and output slots of the graph: 30 /// 1) the graph/sub-graph cannot be const 31 /// 2) the caller needs to make sure that the Subgraphs lifetime is shorter than the parent graph's 32 static Subgraphs SelectSubgraphs(Graph& graph, const LayerSelectorFunction& selector); 33 static Subgraphs SelectSubgraphs(SubgraphView& subgraph, const LayerSelectorFunction& selector); 34 35 private: 36 // this is a utility class, don't construct or copy 37 SubgraphViewSelector() = delete; 38 SubgraphViewSelector(const SubgraphViewSelector&) = delete; 39 SubgraphViewSelector & operator=(const SubgraphViewSelector&) = delete; 40 }; 41 42 } // namespace armnn 43