1 // 2 // Copyright © 2017, 2019, 2021-2022 Arm Ltd and Contributors. All rights reserved. 3 // SPDX-License-Identifier: MIT 4 // 5 6 #pragma once 7 8 #include <armnn/BackendOptions.hpp> 9 #include <armnn/Deprecated.hpp> 10 #include <armnn/INetwork.hpp> 11 #include <armnn/backends/SubgraphView.hpp> 12 #include <vector> 13 14 namespace armnn 15 { 16 17 class OptimizationViews 18 { 19 public: OptimizationViews(const NetworkOptions & networkOptions={})20 OptimizationViews(const NetworkOptions& networkOptions = {}) : m_INetwork(INetwork::Create(networkOptions)) {} 21 OptimizationViews(const OptimizationViews&) = delete; 22 OptimizationViews& operator=(const OptimizationViews&) = delete; 23 OptimizationViews(OptimizationViews&&) = default; 24 OptimizationViews& operator=(OptimizationViews&&) = default; 25 26 struct SubstitutionPair 27 { 28 /// Subgraph of Layers from the original graph which should be replaced 29 SubgraphView m_SubstitutableSubgraph; 30 31 /// A subgraph of new layers which will replace layers in m_SubstitutableSubgraph 32 SubgraphView m_ReplacementSubgraph; 33 }; 34 35 using Subgraphs = std::vector<SubgraphView>; 36 using Substitutions = std::vector<SubstitutionPair>; 37 AddSubstitution(SubstitutionPair && substitution)38 void AddSubstitution(SubstitutionPair&& substitution) 39 { 40 m_SuccesfulOptimizations.emplace_back(substitution); 41 } 42 AddFailedSubgraph(SubgraphView && subgraph)43 void AddFailedSubgraph(SubgraphView&& subgraph) 44 { 45 m_FailedOptimizations.emplace_back(subgraph); 46 } 47 AddUntouchedSubgraph(SubgraphView && subgraph)48 void AddUntouchedSubgraph(SubgraphView&& subgraph) 49 { 50 m_UntouchedSubgraphs.emplace_back(subgraph); 51 } 52 GetSubstitutions() const53 const Substitutions& GetSubstitutions() const { return m_SuccesfulOptimizations; } GetFailedSubgraphs() const54 const Subgraphs& GetFailedSubgraphs() const { return m_FailedOptimizations; } GetUntouchedSubgraphs() const55 const Subgraphs& GetUntouchedSubgraphs() const { return m_UntouchedSubgraphs; } 56 GetSubstitutions()57 Substitutions& GetSubstitutions() { return m_SuccesfulOptimizations; } GetFailedSubgraphs()58 Subgraphs& GetFailedSubgraphs() { return m_FailedOptimizations; } GetUntouchedSubgraphs()59 Subgraphs& GetUntouchedSubgraphs() { return m_UntouchedSubgraphs; } 60 61 bool Validate(const SubgraphView& originalSubgraph) const; 62 GetINetwork()63 INetwork* GetINetwork() { return m_INetwork.get(); } GetINetworkRef()64 INetwork& GetINetworkRef() { return *m_INetwork; } 65 66 private: 67 Substitutions m_SuccesfulOptimizations; ///< Proposed substitutions from successful optimizations 68 Subgraphs m_FailedOptimizations; ///< Subgraphs from the original subgraph which cannot be supported 69 Subgraphs m_UntouchedSubgraphs; ///< Subgraphs from the original subgraph which remain unmodified 70 71 /// INetworkPtr object used only as a container for any layer generated by the optimization process 72 /// Also, can use to AddPrecompiledLayer to the SubstitutionPair 73 /// Use in favour of m_Graph which depreciates in 23.08 74 INetworkPtr m_INetwork = INetwork::Create(); 75 }; 76 77 } //namespace armnn 78