ArmNN
 22.05
MovePermuteUpTests.cpp File Reference
#include <TestUtils.hpp>
#include <Optimizer.hpp>
#include <doctest/doctest.h>

Go to the source code of this file.

Functions

 TEST_SUITE ("Optimizer")
 

Function Documentation

◆ TEST_SUITE()

TEST_SUITE ( "Optimizer"  )

Definition at line 12 of file MovePermuteUpTests.cpp.

References CheckSequence(), armnn::Float32, Layer::GetInputSlot(), Layer::GetOutputHandler(), armnn::MakeOptimizations(), Optimizer::Pass(), and OutputHandler::SetTensorInfo().

13 {
14 using namespace armnn::optimizations;
15 
16 TEST_CASE("MovePermuteUpTest")
17 {
18  const armnn::TensorInfo info({ 1, 5, 2, 3 }, armnn::DataType::Float32);
19  const armnn::TensorInfo permuted({ 1, 3, 5, 2 }, armnn::DataType::Float32);
20 
21  armnn::Graph graph;
22 
23  armnn::LayerBindingId inputId = 0;
24 
25  armnn::Layer* head = graph.AddLayer<armnn::OutputLayer>(0, "output");
26 
27  std::string permuteLayerName = "original_permute";
28 
29  // Insert permute
30  head = graph.InsertNewLayer<armnn::PermuteLayer>(head->GetInputSlot(0), armnn::PermuteDescriptor({ 0, 2, 3, 1 }),
31  permuteLayerName.c_str());
32 
33  head->GetOutputHandler().SetTensorInfo(permuted);
34 
35  // Inserts layers that don't care about data format.
36  head = graph.InsertNewLayer<armnn::ActivationLayer>(head->GetInputSlot(0), armnn::ActivationDescriptor{}, "");
37  head->GetOutputHandler().SetTensorInfo(info);
38 
39  head = graph.InsertNewLayer<armnn::AdditionLayer>(head->GetInputSlot(0), "");
40  head->GetOutputHandler().SetTensorInfo(info);
41 
42  // Inserts input for 2nd input of Addition.
43  graph.InsertNewLayer<armnn::InputLayer>(head->GetInputSlot(1), inputId++, "")
44  ->GetOutputHandler()
45  .SetTensorInfo(info);
46 
47  head = graph.InsertNewLayer<armnn::FakeQuantizationLayer>(head->GetInputSlot(0),
49  head->GetOutputHandler().SetTensorInfo(info);
50 
51  head = graph.InsertNewLayer<armnn::FloorLayer>(head->GetInputSlot(0), "");
52  head->GetOutputHandler().SetTensorInfo(info);
53 
54  head = graph.InsertNewLayer<armnn::MemCopyLayer>(head->GetInputSlot(0), "");
55  head->GetOutputHandler().SetTensorInfo(info);
56 
57  head = graph.InsertNewLayer<armnn::MultiplicationLayer>(head->GetInputSlot(0), "");
58  head->GetOutputHandler().SetTensorInfo(info);
59 
60  // Inserts input for 2nd input of Multiplication.
61  graph.InsertNewLayer<armnn::InputLayer>(head->GetInputSlot(1), inputId++, "")
62  ->GetOutputHandler()
63  .SetTensorInfo(info);
64 
65  // Inserts input.
66  graph.InsertNewLayer<armnn::InputLayer>(head->GetInputSlot(0), inputId++, "")
67  ->GetOutputHandler()
68  .SetTensorInfo(info);
69 
70  CHECK(CheckSequence(graph.cbegin(), graph.cend(), &IsLayerOfType<armnn::InputLayer>,
71  &IsLayerOfType<armnn::InputLayer>, &IsLayerOfType<armnn::InputLayer>,
72  &IsLayerOfType<armnn::MultiplicationLayer>, &IsLayerOfType<armnn::MemCopyLayer>,
73  &IsLayerOfType<armnn::FloorLayer>, &IsLayerOfType<armnn::FakeQuantizationLayer>,
74  &IsLayerOfType<armnn::AdditionLayer>, &IsLayerOfType<armnn::ActivationLayer>,
75  &IsLayerOfType<armnn::PermuteLayer>, &IsLayerOfType<armnn::OutputLayer>));
76 
78 
79  // The permute is moved to the top. New permutes for layers with multiple inputs.
80  CHECK(CheckSequence(graph.cbegin(), graph.cend(), &IsLayerOfType<armnn::InputLayer>,
81  &IsLayerOfType<armnn::InputLayer>, &IsLayerOfType<armnn::InputLayer>,
82  &IsLayerOfType<armnn::PermuteLayer>, &IsLayerOfType<armnn::PermuteLayer>,
83  &IsLayerOfType<armnn::PermuteLayer>, &IsLayerOfType<armnn::MultiplicationLayer>,
84  &IsLayerOfType<armnn::MemCopyLayer>, &IsLayerOfType<armnn::FloorLayer>,
85  &IsLayerOfType<armnn::FakeQuantizationLayer>, &IsLayerOfType<armnn::AdditionLayer>,
86  &IsLayerOfType<armnn::ActivationLayer>, &IsLayerOfType<armnn::OutputLayer>));
87 
88  std::list<std::string> testRelatedLayers = { permuteLayerName };
89 
90  CHECK(CheckRelatedLayers<armnn::PermuteLayer>(graph, testRelatedLayers));
91 }
92 
93 }
Optimizer::Optimizations MakeOptimizations(Args &&... args)
Definition: Optimizer.hpp:43
bool CheckSequence(const armnn::Graph::ConstIterator first, const armnn::Graph::ConstIterator last)
Definition: TestUtils.hpp:21
static void Pass(Graph &graph, const Optimizations &optimizations)
Definition: Optimizer.cpp:16
This layer represents an activation operation with the specified activation function.
This layer represents a permutation operation.
int LayerBindingId
Type of identifiers for bindable layers (inputs, outputs).
Definition: Types.hpp:290
const InputSlot & GetInputSlot(unsigned int index) const override
Get a const input slot handle by slot index.
Definition: Layer.hpp:322
OptimizeForConnection< Layer, PermuteLayer, MovePermuteUpImpl > MovePermuteUp
A layer user-provided data can be bound to (e.g. inputs, outputs).
Definition: OutputLayer.hpp:13
A FakeQuantizationDescriptor for the FakeQuantizationLayer.
This layer represents a memory copy operation.
An ActivationDescriptor for the ActivationLayer.
Definition: Descriptors.hpp:36
This layer represents a fake quantization operation.
This layer represents a floor operation.
Definition: FloorLayer.hpp:13
This layer represents an addition operation.
void SetTensorInfo(const TensorInfo &tensorInfo)
Sets the TensorInfo used by this output handler.
const OutputHandler & GetOutputHandler(unsigned int i=0) const
Definition: Layer.hpp:230
A layer user-provided data can be bound to (e.g. inputs, outputs).
Definition: InputLayer.hpp:13
This layer represents a multiplication operation.
A PermuteDescriptor for the PermuteLayer.