xref: /aosp_15_r20/external/armnn/include/armnn/backends/OptimizationViews.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
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