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()