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 using namespace armnn;
13
14 BOOST_AUTO_TEST_SUITE(Optimizer)
15 using namespace armnn::optimizations;
16
BOOST_AUTO_TEST_CASE(SquashEqualSiblingsTest)17 BOOST_AUTO_TEST_CASE(SquashEqualSiblingsTest)
18 {
19 armnn::Graph graph;
20
21 armnn::LayerBindingId outputId = 0;
22
23 const armnn::TensorInfo info({ 1, 2, 3, 5 }, armnn::DataType::Float32);
24 const armnn::TensorInfo permuted({ 1, 5, 2, 3 }, armnn::DataType::Float32);
25
26 auto input = graph.AddLayer<armnn::InputLayer>(0, "input");
27 input->GetOutputSlot().SetTensorInfo(info);
28
29 // Inserts equal permutes, equal reshapes and something else.
30 const armnn::PermuteDescriptor permDesc({ 0, 2, 3, 1 });
31 const armnn::ReshapeDescriptor reshapeDesc{ { 1, 3, 1, 5 } };
32
33 armnn::Layer* layer;
34
35 layer = graph.AddLayer<armnn::PermuteLayer>(permDesc, "");
36 layer->GetOutputSlot().SetTensorInfo(permuted);
37 layer->GetOutputSlot().Connect(graph.AddLayer<armnn::OutputLayer>(outputId++, "")->GetInputSlot(0));
38 input->GetOutputSlot().Connect(layer->GetInputSlot(0));
39
40 layer = graph.AddLayer<armnn::ReshapeLayer>(reshapeDesc, "");
41 layer->GetOutputSlot().Connect(graph.AddLayer<armnn::OutputLayer>(outputId++, "")->GetInputSlot(0));
42 input->GetOutputSlot().Connect(layer->GetInputSlot(0));
43
44 layer = graph.AddLayer<armnn::FloorLayer>("");
45 layer->GetOutputSlot().Connect(graph.AddLayer<armnn::OutputLayer>(outputId++, "")->GetInputSlot(0));
46 input->GetOutputSlot().Connect(layer->GetInputSlot(0));
47
48 layer = graph.AddLayer<armnn::ReshapeLayer>(reshapeDesc, "");
49 layer->GetOutputSlot().Connect(graph.AddLayer<armnn::OutputLayer>(outputId++, "")->GetInputSlot(0));
50 input->GetOutputSlot().Connect(layer->GetInputSlot(0));
51
52 layer = graph.AddLayer<armnn::PermuteLayer>(permDesc, "");
53 layer->GetOutputSlot().SetTensorInfo(permuted);
54 layer->GetOutputSlot().Connect(graph.AddLayer<armnn::OutputLayer>(outputId++, "")->GetInputSlot(0));
55 input->GetOutputSlot().Connect(layer->GetInputSlot(0));
56
57 BOOST_TEST(CheckSequence(
58 graph.cbegin(), graph.cend(), &IsLayerOfType<armnn::InputLayer>, &IsLayerOfType<armnn::PermuteLayer>,
59 &IsLayerOfType<armnn::ReshapeLayer>, &IsLayerOfType<armnn::FloorLayer>, &IsLayerOfType<armnn::ReshapeLayer>,
60 &IsLayerOfType<armnn::PermuteLayer>, &IsLayerOfType<armnn::OutputLayer>, &IsLayerOfType<armnn::OutputLayer>,
61 &IsLayerOfType<armnn::OutputLayer>, &IsLayerOfType<armnn::OutputLayer>, &IsLayerOfType<armnn::OutputLayer>));
62
63 armnn::Optimizer::Pass(graph, armnn::MakeOptimizations(SquashEqualPermuteSiblings(), SquashEqualReshapeSiblings()));
64
65 // The permutes and reshapes are squashed.
66
67 BOOST_TEST(CheckSequence(graph.cbegin(), graph.cend(), &IsLayerOfType<armnn::InputLayer>,
68 &IsLayerOfType<armnn::PermuteLayer>, &IsLayerOfType<armnn::ReshapeLayer>,
69 &IsLayerOfType<armnn::FloorLayer>, &IsLayerOfType<armnn::OutputLayer>,
70 &IsLayerOfType<armnn::OutputLayer>, &IsLayerOfType<armnn::OutputLayer>,
71 &IsLayerOfType<armnn::OutputLayer>, &IsLayerOfType<armnn::OutputLayer>));
72 }
73
74 BOOST_AUTO_TEST_SUITE_END()