• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "../TestUtils.hpp"
7 
8 #include <Optimizer.hpp>
9 
10 #include <boost/test/unit_test.hpp>
11 
12 BOOST_AUTO_TEST_SUITE(Optimizer)
13 using namespace armnn::optimizations;
14 
BOOST_AUTO_TEST_CASE(MovePermuteUpTest)15 BOOST_AUTO_TEST_CASE(MovePermuteUpTest)
16 {
17     const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
18     const armnn::TensorInfo permuted({ 1, 3, 5, 2 }, armnn::DataType::Float32);
19 
20     armnn::Graph graph;
21 
22     armnn::LayerBindingId inputId = 0;
23 
24     armnn::Layer* head = graph.AddLayer<armnn::OutputLayer>(0, "output");
25 
26     std::string permuteLayerName = "original_permute";
27 
28     // Insert permute
29     head = graph.InsertNewLayer<armnn::PermuteLayer>(head->GetInputSlot(0), armnn::PermuteDescriptor({ 0, 2, 3, 1 }),
30                                                      permuteLayerName.c_str());
31 
32     head->GetOutputHandler().SetTensorInfo(permuted);
33 
34     // Inserts layers that don't care about data format.
35     head = graph.InsertNewLayer<armnn::ActivationLayer>(head->GetInputSlot(0), armnn::ActivationDescriptor{}, "");
36     head->GetOutputHandler().SetTensorInfo(info);
37 
38     head = graph.InsertNewLayer<armnn::AdditionLayer>(head->GetInputSlot(0), "");
39     head->GetOutputHandler().SetTensorInfo(info);
40 
41     // Inserts input for 2nd input of Addition.
42     graph.InsertNewLayer<armnn::InputLayer>(head->GetInputSlot(1), inputId++, "")
43         ->GetOutputHandler()
44         .SetTensorInfo(info);
45 
46     head = graph.InsertNewLayer<armnn::FakeQuantizationLayer>(head->GetInputSlot(0),
47                                                               armnn::FakeQuantizationDescriptor{}, "");
48     head->GetOutputHandler().SetTensorInfo(info);
49 
50     head = graph.InsertNewLayer<armnn::FloorLayer>(head->GetInputSlot(0), "");
51     head->GetOutputHandler().SetTensorInfo(info);
52 
53     head = graph.InsertNewLayer<armnn::MemCopyLayer>(head->GetInputSlot(0), "");
54     head->GetOutputHandler().SetTensorInfo(info);
55 
56     head = graph.InsertNewLayer<armnn::MultiplicationLayer>(head->GetInputSlot(0), "");
57     head->GetOutputHandler().SetTensorInfo(info);
58 
59     // Inserts input for 2nd input of Multiplication.
60     graph.InsertNewLayer<armnn::InputLayer>(head->GetInputSlot(1), inputId++, "")
61         ->GetOutputHandler()
62         .SetTensorInfo(info);
63 
64     // Inserts input.
65     graph.InsertNewLayer<armnn::InputLayer>(head->GetInputSlot(0), inputId++, "")
66         ->GetOutputHandler()
67         .SetTensorInfo(info);
68 
69     BOOST_TEST(CheckSequence(graph.cbegin(), graph.cend(), &IsLayerOfType<armnn::InputLayer>,
70                              &IsLayerOfType<armnn::InputLayer>, &IsLayerOfType<armnn::InputLayer>,
71                              &IsLayerOfType<armnn::MultiplicationLayer>, &IsLayerOfType<armnn::MemCopyLayer>,
72                              &IsLayerOfType<armnn::FloorLayer>, &IsLayerOfType<armnn::FakeQuantizationLayer>,
73                              &IsLayerOfType<armnn::AdditionLayer>, &IsLayerOfType<armnn::ActivationLayer>,
74                              &IsLayerOfType<armnn::PermuteLayer>, &IsLayerOfType<armnn::OutputLayer>));
75 
76     armnn::Optimizer::Pass(graph, armnn::MakeOptimizations(MovePermuteUp()));
77 
78     // The permute is moved to the top. New permutes for layers with multiple inputs.
79     BOOST_TEST(CheckSequence(graph.cbegin(), graph.cend(), &IsLayerOfType<armnn::InputLayer>,
80                              &IsLayerOfType<armnn::InputLayer>, &IsLayerOfType<armnn::InputLayer>,
81                              &IsLayerOfType<armnn::PermuteLayer>, &IsLayerOfType<armnn::PermuteLayer>,
82                              &IsLayerOfType<armnn::PermuteLayer>, &IsLayerOfType<armnn::MultiplicationLayer>,
83                              &IsLayerOfType<armnn::MemCopyLayer>, &IsLayerOfType<armnn::FloorLayer>,
84                              &IsLayerOfType<armnn::FakeQuantizationLayer>, &IsLayerOfType<armnn::AdditionLayer>,
85                              &IsLayerOfType<armnn::ActivationLayer>, &IsLayerOfType<armnn::OutputLayer>));
86 
87     std::list<std::string> testRelatedLayers = { permuteLayerName };
88 
89     BOOST_TEST(CheckRelatedLayers<armnn::PermuteLayer>(graph, testRelatedLayers));
90 }
91 
92 BOOST_AUTO_TEST_SUITE_END()