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 <doctest/doctest.h> 11 12 using namespace armnn; 13 14 TEST_SUITE("Optimizer") 15 { 16 using namespace armnn::optimizations; 17 18 TEST_CASE("OptimizeInversePermutesTest") 19 { 20 armnn::Graph graph; 21 22 auto output = graph.AddLayer<armnn::OutputLayer>(0, "output"); 23 24 graph.InsertNewLayer<armnn::InputLayer>(output->GetInputSlot(0), 0, "input"); 25 26 // Inserts two permutes, one the inverse of the other. 27 graph.InsertNewLayer<armnn::PermuteLayer>(output->GetInputSlot(0), armnn::PermuteDescriptor({ 0, 2, 3, 1 }), 28 "perm0231"); 29 graph.InsertNewLayer<armnn::PermuteLayer>(output->GetInputSlot(0), armnn::PermuteDescriptor({ 0, 3, 1, 2 }), 30 "perm0312"); 31 32 CHECK(CheckSequence(graph.cbegin(), graph.cend(), &IsLayerOfType<armnn::InputLayer>, 33 &IsLayerOfType<armnn::PermuteLayer>, &IsLayerOfType<armnn::PermuteLayer>, 34 &IsLayerOfType<armnn::OutputLayer>)); 35 36 armnn::Optimizer::Pass(graph, armnn::MakeOptimizations(OptimizeInversePermutes())); 37 38 // The permutes are removed. 39 CHECK(CheckSequence(graph.cbegin(), graph.cend(), &IsLayerOfType<armnn::InputLayer>, 40 &IsLayerOfType<armnn::OutputLayer>)); 41 } 42 43 TEST_CASE("OptimizeInverseTransposesTest") 44 { 45 armnn::Graph graph; 46 47 auto output = graph.AddLayer<armnn::OutputLayer>(0, "output"); 48 49 graph.InsertNewLayer<armnn::InputLayer>(output->GetInputSlot(0), 0, "input"); 50 51 // Inserts two permutes, one the inverse of the other. 52 graph.InsertNewLayer<armnn::TransposeLayer>(output->GetInputSlot(0), 53 armnn::TransposeDescriptor({ 0, 3, 1, 2 }), 54 "transpose0312"); 55 graph.InsertNewLayer<armnn::TransposeLayer>(output->GetInputSlot(0), 56 armnn::TransposeDescriptor({ 0, 2, 3, 1 }), 57 "transpose0231"); 58 59 CHECK(CheckSequence(graph.cbegin(), graph.cend(), &IsLayerOfType<armnn::InputLayer>, 60 &IsLayerOfType<armnn::TransposeLayer>, &IsLayerOfType<armnn::TransposeLayer>, 61 &IsLayerOfType<armnn::OutputLayer>)); 62 63 armnn::Optimizer::Pass(graph, armnn::MakeOptimizations(OptimizeInverseTransposes())); 64 65 // The permutes are removed. 66 CHECK(CheckSequence(graph.cbegin(), graph.cend(), &IsLayerOfType<armnn::InputLayer>, 67 &IsLayerOfType<armnn::OutputLayer>)); 68 } 69 70 }