6 #include "../GraphUtils.hpp" 7 #include "../TestUtils.hpp" 11 #include <doctest/doctest.h> 13 using namespace armnn;
17 using namespace optimizations;
19 void AddBroadcastReshapeLayerOptimizerTest(
const TensorInfo& info0,
22 const std::string& reshapeLayerName,
41 &IsLayerOfType<InputLayer>,
42 &IsLayerOfType<InputLayer>,
43 &IsLayerOfType<AdditionLayer>,
44 &IsLayerOfType<OutputLayer>));
51 &IsLayerOfType<InputLayer>,
52 &IsLayerOfType<InputLayer>,
53 &IsLayerOfType<ReshapeLayer>,
54 &IsLayerOfType<AdditionLayer>,
55 &IsLayerOfType<OutputLayer>));
62 CHECK((addedReshapeTensorInfo.GetShape() == expectedReshapeShape));
63 CHECK((addedReshapeTensorInfo.GetDataType() == expectedDataType));
66 TEST_CASE(
"AddBroadcastReshapeLayerSimpleTest")
70 AddBroadcastReshapeLayerOptimizerTest(info0, info1, info0,
"Reshape_for:add-1",
75 TEST_CASE(
"AddBroadcastReshapeLayer1DTest")
80 AddBroadcastReshapeLayerOptimizerTest(info0, info1, outputInfo,
"Reshape_for:add-1",
85 TEST_CASE(
"AddBroadcastReshapeLayer2DTest")
90 AddBroadcastReshapeLayerOptimizerTest(info0, info1, outputInfo,
"Reshape_for:add-1",
95 TEST_CASE(
"AddBroadcastReshapeLayer3DTest")
100 AddBroadcastReshapeLayerOptimizerTest(info0, info1, outputInfo,
"Reshape_for:add-1",
105 TEST_CASE(
"AddBroadcastReshapeLayer3DMergedTest")
110 AddBroadcastReshapeLayerOptimizerTest(info0, info1, outputInfo,
"Reshape_for:add-1",
115 TEST_CASE(
"AddBroadcastReshapeLayerSubtractionTest")
135 &IsLayerOfType<InputLayer>,
136 &IsLayerOfType<InputLayer>,
137 &IsLayerOfType<SubtractionLayer>,
138 &IsLayerOfType<OutputLayer>));
145 &IsLayerOfType<InputLayer>,
146 &IsLayerOfType<InputLayer>,
147 &IsLayerOfType<ReshapeLayer>,
148 &IsLayerOfType<SubtractionLayer>,
149 &IsLayerOfType<OutputLayer>));
156 CHECK((addedReshapeTensorInfo.GetShape() ==
TensorShape({ 1, 1, 1, 5 })));
160 TEST_CASE(
"AddBroadcastReshapeLayerDivisionTest")
180 &IsLayerOfType<InputLayer>,
181 &IsLayerOfType<InputLayer>,
182 &IsLayerOfType<DivisionLayer>,
183 &IsLayerOfType<OutputLayer>));
190 &IsLayerOfType<InputLayer>,
191 &IsLayerOfType<InputLayer>,
192 &IsLayerOfType<ReshapeLayer>,
193 &IsLayerOfType<DivisionLayer>,
194 &IsLayerOfType<OutputLayer>));
201 CHECK((addedReshapeTensorInfo.GetShape() ==
TensorShape({ 1, 1, 4, 5 })));
205 TEST_CASE(
"AddBroadcastReshapeLayerMultiplicationTest")
225 &IsLayerOfType<InputLayer>,
226 &IsLayerOfType<InputLayer>,
227 &IsLayerOfType<MultiplicationLayer>,
228 &IsLayerOfType<OutputLayer>));
235 &IsLayerOfType<InputLayer>,
236 &IsLayerOfType<InputLayer>,
237 &IsLayerOfType<ReshapeLayer>,
238 &IsLayerOfType<MultiplicationLayer>,
239 &IsLayerOfType<OutputLayer>));
246 CHECK((addedReshapeTensorInfo.GetShape() ==
TensorShape({ 1, 1, 3, 5 })));
250 TEST_CASE(
"AddNoBroadcastReshapeLayerTest")
270 &IsLayerOfType<InputLayer>,
271 &IsLayerOfType<InputLayer>,
272 &IsLayerOfType<MultiplicationLayer>,
273 &IsLayerOfType<OutputLayer>));
280 &IsLayerOfType<InputLayer>,
281 &IsLayerOfType<InputLayer>,
282 &IsLayerOfType<MultiplicationLayer>,
283 &IsLayerOfType<OutputLayer>));
286 CHECK(!reshapeLayer);
289 TEST_CASE(
"ReshapeParentConstLayerTest")
301 uint8_t tensor[] = { 1, 1, 1, 1, 1 };
303 constant->m_LayerOutput = std::make_unique<ScopedTensorHandle>(
ConstTensor(info1, &tensor));
314 &IsLayerOfType<InputLayer>,
315 &IsLayerOfType<ConstantLayer>,
316 &IsLayerOfType<MultiplicationLayer>,
317 &IsLayerOfType<OutputLayer>));
324 &IsLayerOfType<InputLayer>,
325 &IsLayerOfType<ConstantLayer>,
326 &IsLayerOfType<MultiplicationLayer>,
327 &IsLayerOfType<OutputLayer>));
330 CHECK(constant->m_LayerOutput.get()->GetTensorInfo().GetShape() == expectedShape);
332 CHECK(constant->m_LayerOutput.get()->GetTensorInfo().GetNumDimensions() == info0.
GetNumDimensions());
335 CHECK(!reshapeLayer);
338 TEST_CASE(
"ReshapeParentConstAddLayerMultipleConnectionsTest")
360 float tensor[] = { 2.0f };
361 constant->m_LayerOutput = std::make_unique<ScopedTensorHandle>(
ConstTensor(constantTermInfo, &tensor));
372 &IsLayerOfType<InputLayer>,
373 &IsLayerOfType<ConstantLayer>,
374 &IsLayerOfType<AdditionLayer>,
375 &IsLayerOfType<AdditionLayer>,
376 &IsLayerOfType<OutputLayer>));
383 &IsLayerOfType<InputLayer>,
384 &IsLayerOfType<ConstantLayer>,
385 &IsLayerOfType<ReshapeLayer>,
386 &IsLayerOfType<ReshapeLayer>,
387 &IsLayerOfType<AdditionLayer>,
388 &IsLayerOfType<AdditionLayer>,
389 &IsLayerOfType<OutputLayer>));
392 CHECK(constant->m_LayerOutput.get()->GetTensorInfo().GetShape() == constantTermInfo.GetShape());
396 CHECK(reshapeLayer1);
397 CHECK(reshapeLayer2);
TEST_SUITE("TestConstTensorLayerVisitor")
A layer that the constant data can be bound to.
Optimizer::Optimizations MakeOptimizations(Args &&... args)
armnn::Layer * GetFirstLayerWithName(armnn::Graph &graph, const std::string &name)
LayerT * AddLayer(Args &&... args)
Adds a new layer, of type LayerType, to the graph constructed with the arguments passed.
ConstIterator cbegin() const
Returns const iterator pointing to the beginning of the list. Lowercase for range-based for loops...
int Connect(InputSlot &destination)
static void Pass(Graph &graph, const Optimizations &optimizations)
Copyright (c) 2021 ARM Limited and Contributors.
const InputSlot & GetInputSlot(unsigned int index) const override
Get a const input slot handle by slot index.
A layer user-provided data can be bound to (e.g. inputs, outputs).
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
This layer represents an addition operation.
This layer represents a subtraction operation.
bool CheckSequence(const armnn::Graph::ConstIterator first, const armnn::Graph::ConstIterator last)
void SetTensorInfo(const TensorInfo &tensorInfo) override
This layer represents a division operation.
const OutputSlot & GetOutputSlot(unsigned int index=0) const override
Get the const output slot handle by slot index.
ConstIterator cend() const
Returns const iterator pointing to the end of the list. Lowercase for range-based for loops...
OptimizeForType< Layer, AddBroadcastReshapeLayerImpl > AddBroadcastReshapeLayer
This layer represents a multiplication operation.
const TensorInfo & GetTensorInfo() const override
unsigned int GetNumDimensions() const