Release 18.03
[platform/upstream/armnn.git] / src / armnn / Optimizer.cpp
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // See LICENSE file in the project root for full license information.
4 //
5 #include "Optimizer.hpp"
6 #include "optimizations/All.hpp"
7
8 namespace armnn
9 {
10
11 Optimizer::Optimizer()
12 {
13     // Add optimizations here
14     static optimizations::SquashEqualPermuteSiblings squashEqualPermuteSiblings;
15     static optimizations::SquashEqualReshapeSiblings squashEqualReshapeSiblings;
16     static optimizations::OptimizeInversePermutes optimizeInversePermutes;
17     static optimizations::MovePermuteUp movePermuteUp;
18     static optimizations::PermuteAsReshape permuteAsReshape;
19     static optimizations::OptimizeConsecutiveReshapes optimizeConsecutiveReshapes;
20
21     // Set optimizations in desired order
22     m_Optimizations = {&squashEqualPermuteSiblings,
23                        &squashEqualReshapeSiblings,
24                        &optimizeInversePermutes,
25                        &movePermuteUp,
26                        &permuteAsReshape,
27                        &optimizeConsecutiveReshapes,
28                       };
29 }
30
31 void Optimizer::Optimize(Graph& graph)
32 {
33     Optimizer optimizer;
34     auto it = graph.TopologicalSort().end();
35     // Call TopologicalSort() in every iteration to re-order the list in case layers where added/removed.
36     while (it != graph.TopologicalSort().begin())
37     {
38         --it;
39         for (auto&& optimization : optimizer.m_Optimizations)
40         {
41             optimization->Run(graph, **it);
42
43             if ((*it)->IsOutputUnconnected())
44             {
45                 it = graph.EraseLayer(it);
46                 break;
47             }
48         }
49     }
50 }
51
52
53 } // namespace armnn