blob: 885773d5e914ee51d022cf2dca7804b57e58da69 [file] [log] [blame]
Aron Virginas-Tar70104002018-10-24 15:33:28 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00006#include <backendsCommon/test/EndToEndTestImpl.hpp>
Narumol Prangnawarat6d302bf2019-02-04 11:46:26 +00007
Narumol Prangnawarat8c7324d2019-05-31 16:42:11 +01008#include <backendsCommon/test/DequantizeEndToEndTestImpl.hpp>
Narumol Prangnawarat6d302bf2019-02-04 11:46:26 +00009#include <backendsCommon/test/DetectionPostProcessTestImpl.hpp>
narpra01db2b1602019-01-23 15:23:11 +000010#include <backendsCommon/test/GatherEndToEndTestImpl.hpp>
Jim Flynne242f2d2019-05-22 14:24:13 +010011#include <backendsCommon/test/ConcatTestImpl.hpp>
FrancisMurtagh2262bbd2018-12-20 16:09:45 +000012#include <backendsCommon/test/ArithmeticTestImpl.hpp>
Narumol Prangnawarat0be43382019-05-27 11:29:59 +010013#include <backendsCommon/test/SplitterEndToEndTestImpl.hpp>
Aron Virginas-Tar70104002018-10-24 15:33:28 +010014
15#include <boost/test/unit_test.hpp>
Éanna Ó Catháin20e58802018-12-04 10:29:06 +000016#include <boost/test/execution_monitor.hpp>
Aron Virginas-Tar70104002018-10-24 15:33:28 +010017
18BOOST_AUTO_TEST_SUITE(RefEndToEnd)
19
narpra01b9546cf2018-11-20 15:21:28 +000020std::vector<armnn::BackendId> defaultBackends = {armnn::Compute::CpuRef};
21
Aron Virginas-Tar70104002018-10-24 15:33:28 +010022BOOST_AUTO_TEST_CASE(ConstantUsage_Ref_Float32)
23{
narpra01b9546cf2018-11-20 15:21:28 +000024 BOOST_TEST(ConstantUsageFloat32Test(defaultBackends));
Aron Virginas-Tar70104002018-10-24 15:33:28 +010025}
26
27BOOST_AUTO_TEST_CASE(ConstantUsage_Ref_Uint8)
28{
narpra01b9546cf2018-11-20 15:21:28 +000029 BOOST_TEST(ConstantUsageUint8Test(defaultBackends));
Aron Virginas-Tar70104002018-10-24 15:33:28 +010030}
31
32BOOST_AUTO_TEST_CASE(Unsigned8)
33{
34 using namespace armnn;
35
36 // Create runtime in which test will run
37 armnn::IRuntime::CreationOptions options;
38 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
39
40 // Builds up the structure of the network.
41 armnn::INetworkPtr net(INetwork::Create());
42
43 IConnectableLayer* input = net->AddInputLayer(0, "input");
44 IConnectableLayer* softmax = net->AddSoftmaxLayer(SoftmaxDescriptor(), "softmax");
45 IConnectableLayer* output = net->AddOutputLayer(0, "output");
46
47 input->GetOutputSlot(0).Connect(softmax->GetInputSlot(0));
48 softmax->GetOutputSlot(0).Connect(output->GetInputSlot(0));
49
50 // Sets the tensors in the network.
51 TensorInfo inputTensorInfo(TensorShape({1, 5}), DataType::QuantisedAsymm8);
52 inputTensorInfo.SetQuantizationOffset(100);
53 inputTensorInfo.SetQuantizationScale(10000.0f);
54 input->GetOutputSlot(0).SetTensorInfo(inputTensorInfo);
55
56 TensorInfo outputTensorInfo(TensorShape({1, 5}), DataType::QuantisedAsymm8);
57 outputTensorInfo.SetQuantizationOffset(0);
58 outputTensorInfo.SetQuantizationScale(1.0f/255.0f);
59 softmax->GetOutputSlot(0).SetTensorInfo(outputTensorInfo);
60
61 // optimize the network
narpra01b9546cf2018-11-20 15:21:28 +000062 IOptimizedNetworkPtr optNet = Optimize(*net, defaultBackends, runtime->GetDeviceSpec());
Aron Virginas-Tar70104002018-10-24 15:33:28 +010063
64 // Loads it into the runtime.
65 NetworkId netId;
66 auto error = runtime->LoadNetwork(netId, std::move(optNet));
67 BOOST_TEST(error == Status::Success);
68
69 // Creates structures for input & output.
70 std::vector<uint8_t> inputData
71 {
72 1, 10, 3, 200, 5 // Some inputs - one of which is sufficiently larger than the others to saturate softmax.
73 };
74 std::vector<uint8_t> outputData(5);
75
76 armnn::InputTensors inputTensors
77 {
78 {0, armnn::ConstTensor(runtime->GetInputTensorInfo(netId, 0), inputData.data())}
79 };
80 armnn::OutputTensors outputTensors
81 {
82 {0, armnn::Tensor(runtime->GetOutputTensorInfo(netId, 0), outputData.data())}
83 };
84
85 // Does the inference.
86 runtime->EnqueueWorkload(netId, inputTensors, outputTensors);
87
88 // Checks the results.
89 BOOST_TEST(outputData[0] == 0);
90 BOOST_TEST(outputData[1] == 0);
91 BOOST_TEST(outputData[2] == 0);
92 BOOST_TEST(outputData[3] == 255); // softmax has been saturated.
93 BOOST_TEST(outputData[4] == 0);
94}
95
96BOOST_AUTO_TEST_CASE(TrivialAdd)
97{
98 // This test was designed to match "AddTwo" in android nn/runtime/test/TestTrivialModel.cpp.
99
100 using namespace armnn;
101
102 // Create runtime in which test will run
103 armnn::IRuntime::CreationOptions options;
104 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
105
106 // Builds up the structure of the network.
107 armnn::INetworkPtr net(INetwork::Create());
108
109 IConnectableLayer* input1 = net->AddInputLayer(0);
110 IConnectableLayer* input2 = net->AddInputLayer(1);
111 IConnectableLayer* add = net->AddAdditionLayer();
112 IConnectableLayer* output = net->AddOutputLayer(0);
113
114 input1->GetOutputSlot(0).Connect(add->GetInputSlot(0));
115 input2->GetOutputSlot(0).Connect(add->GetInputSlot(1));
116 add->GetOutputSlot(0).Connect(output->GetInputSlot(0));
117
118 // Sets the tensors in the network.
119 TensorInfo tensorInfo(TensorShape({3, 4}), DataType::Float32);
120 input1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
121 input2->GetOutputSlot(0).SetTensorInfo(tensorInfo);
122 add->GetOutputSlot(0).SetTensorInfo(tensorInfo);
123
124 // optimize the network
narpra01b9546cf2018-11-20 15:21:28 +0000125 IOptimizedNetworkPtr optNet = Optimize(*net, defaultBackends, runtime->GetDeviceSpec());
Aron Virginas-Tar70104002018-10-24 15:33:28 +0100126
127 // Loads it into the runtime.
128 NetworkId netId;
129 runtime->LoadNetwork(netId, std::move(optNet));
130
131 // Creates structures for input & output - matching android nn test.
132 std::vector<float> input1Data
133 {
134 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f, 10.f, 11.f, 12.f
135 };
136 std::vector<float> input2Data
137 {
138 100.f, 200.f, 300.f, 400.f, 500.f, 600.f, 700.f, 800.f, 900.f, 1000.f, 1100.f, 1200.f
139 };
140 std::vector<float> outputData(12);
141
142 InputTensors inputTensors
143 {
144 {0,armnn::ConstTensor(runtime->GetInputTensorInfo(netId, 0), input1Data.data())},
145 {1,armnn::ConstTensor(runtime->GetInputTensorInfo(netId, 0), input2Data.data())}
146 };
147 OutputTensors outputTensors
148 {
149 {0,armnn::Tensor(runtime->GetOutputTensorInfo(netId, 0), outputData.data())}
150 };
151
152 // Does the inference.
153 runtime->EnqueueWorkload(netId, inputTensors, outputTensors);
154
155 // Checks the results
156 BOOST_TEST(outputData[0] == 101);
157 BOOST_TEST(outputData[1] == 202);
158 BOOST_TEST(outputData[2] == 303);
159 BOOST_TEST(outputData[3] == 404);
160 BOOST_TEST(outputData[4] == 505);
161 BOOST_TEST(outputData[5] == 606);
162 BOOST_TEST(outputData[6] == 707);
163 BOOST_TEST(outputData[7] == 808);
164 BOOST_TEST(outputData[8] == 909);
165 BOOST_TEST(outputData[9] == 1010);
166 BOOST_TEST(outputData[10] == 1111);
167 BOOST_TEST(outputData[11] == 1212);
168}
169
170BOOST_AUTO_TEST_CASE(MultipleOutputs)
171{
172 using namespace armnn;
173
174 // Create runtime in which test will run
175 armnn::IRuntime::CreationOptions options;
176 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
177
178 // Builds up the structure of the network.
179 INetworkPtr net(INetwork::Create());
180
181 IConnectableLayer* input = net->AddInputLayer(0);
182
183 // ReLu1
184 ActivationDescriptor activation1Descriptor;
185 activation1Descriptor.m_Function = ActivationFunction::BoundedReLu;
186 activation1Descriptor.m_A = 1.f;
187 activation1Descriptor.m_B = -1.f;
188 IConnectableLayer* activation1 = net->AddActivationLayer(activation1Descriptor);
189
190 // ReLu6
191 ActivationDescriptor activation2Descriptor;
192 activation2Descriptor.m_Function = ActivationFunction::BoundedReLu;
193 activation2Descriptor.m_A = 6.0f;
194 IConnectableLayer* activation2 = net->AddActivationLayer(activation2Descriptor);
195
196 // BoundedReLu(min=2, max=5)
197 ActivationDescriptor activation3Descriptor;
198 activation3Descriptor.m_Function = ActivationFunction::BoundedReLu;
199 activation3Descriptor.m_A = 5.0f;
200 activation3Descriptor.m_B = 2.0f;
201 IConnectableLayer* activation3 = net->AddActivationLayer(activation3Descriptor);
202
203 IConnectableLayer* output1 = net->AddOutputLayer(0);
204 IConnectableLayer* output2 = net->AddOutputLayer(1);
205 IConnectableLayer* output3 = net->AddOutputLayer(2);
206
207 input->GetOutputSlot(0).Connect(activation1->GetInputSlot(0));
208 input->GetOutputSlot(0).Connect(activation2->GetInputSlot(0));
209 input->GetOutputSlot(0).Connect(activation3->GetInputSlot(0));
210
211 activation1->GetOutputSlot(0).Connect(output1->GetInputSlot(0));
212 activation2->GetOutputSlot(0).Connect(output2->GetInputSlot(0));
213 activation3->GetOutputSlot(0).Connect(output3->GetInputSlot(0));
214
215 // Sets the tensors in the network.
216 TensorInfo tensorInfo(TensorShape({ 10 }), DataType::Float32);
217 input->GetOutputSlot(0).SetTensorInfo(tensorInfo);
218 activation1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
219 activation2->GetOutputSlot(0).SetTensorInfo(tensorInfo);
220 activation3->GetOutputSlot(0).SetTensorInfo(tensorInfo);
221
222 // optimize the network
narpra01b9546cf2018-11-20 15:21:28 +0000223 IOptimizedNetworkPtr optNet = Optimize(*net, defaultBackends, runtime->GetDeviceSpec());
Aron Virginas-Tar70104002018-10-24 15:33:28 +0100224
225 // Loads it into the runtime.
226 NetworkId netId;
227 runtime->LoadNetwork(netId, std::move(optNet));
228
229 // Creates structures for input & output.
230 const std::vector<float> inputData{ 3.f, 5.f, 2.f, 3.f, 7.f, 0.f, -2.f, -1.f, 3.f, 3.f };
231
232 std::vector<float> output1Data(inputData.size());
233 std::vector<float> output2Data(inputData.size());
234 std::vector<float> output3Data(inputData.size());
235
236 InputTensors inputTensors
237 {
238 {0,armnn::ConstTensor(runtime->GetInputTensorInfo(netId, 0), inputData.data())}
239 };
240 OutputTensors outputTensors
241 {
242 {0,armnn::Tensor(runtime->GetOutputTensorInfo(netId, 0), output1Data.data())},
243 {1,armnn::Tensor(runtime->GetOutputTensorInfo(netId, 1), output2Data.data())},
244 {2,armnn::Tensor(runtime->GetOutputTensorInfo(netId, 2), output3Data.data())}
245 };
246
247 // Does the inference.
248 runtime->EnqueueWorkload(netId, inputTensors, outputTensors);
249
250 // Checks the results.
251 BOOST_TEST(output1Data == std::vector<float>({ 1.f, 1.f, 1.f, 1.f, 1.f, 0.f, -1.f, -1.f, 1.f, 1.f })); // ReLu1
252 BOOST_TEST(output2Data == std::vector<float>({ 3.f, 5.f, 2.f, 3.f, 6.f, 0.f, 0.f, 0.f, 3.f, 3.f })); // ReLu6
253 BOOST_TEST(output3Data == std::vector<float>({ 3.f, 5.f, 2.f, 3.f, 5.f, 2.f, 2.f, 2.f, 3.f, 3.f })); // [2, 5]
254}
255
Éanna Ó Catháin20e58802018-12-04 10:29:06 +0000256BOOST_AUTO_TEST_CASE(TrivialMin)
257{
258 using namespace armnn;
259
260 // Create runtime in which test will run
261 armnn::IRuntime::CreationOptions options;
262 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
263
264 // Builds up the structure of the network.
265 armnn::INetworkPtr net(INetwork::Create());
266
267 IConnectableLayer* input1 = net->AddInputLayer(0);
268 IConnectableLayer* input2 = net->AddInputLayer(1);
269 IConnectableLayer* min = net->AddMinimumLayer();
270 IConnectableLayer* output = net->AddOutputLayer(0);
271
272 input1->GetOutputSlot(0).Connect(min->GetInputSlot(0));
273 input2->GetOutputSlot(0).Connect(min->GetInputSlot(1));
274 min->GetOutputSlot(0).Connect(output->GetInputSlot(0));
275
276 // Sets the tensors in the network.
277 TensorInfo tensorInfo(TensorShape({1, 1, 1, 4}), DataType::Float32);
278 input1->GetOutputSlot(0).SetTensorInfo(tensorInfo);
279 input2->GetOutputSlot(0).SetTensorInfo(tensorInfo);
280 min->GetOutputSlot(0).SetTensorInfo(tensorInfo);
281
282 // optimize the network
283 IOptimizedNetworkPtr optNet = Optimize(*net, defaultBackends, runtime->GetDeviceSpec());
284
285 // Loads it into the runtime.
286 NetworkId netId;
287 runtime->LoadNetwork(netId, std::move(optNet));
288
289 // Creates structures for input & output - matching android nn test.
290 std::vector<float> input1Data
291 {
292 1.0f, 2.0f, 3.0f, 4.0f
293 };
294 std::vector<float> input2Data
295 {
296 2.0f, 1.0f, 5.0f, 2.0f
297 };
298 std::vector<float> outputData(4);
299
300 InputTensors inputTensors
301 {
302 {0,armnn::ConstTensor(runtime->GetInputTensorInfo(netId, 0), input1Data.data())},
303 {1,armnn::ConstTensor(runtime->GetInputTensorInfo(netId, 0), input2Data.data())}
304 };
305 OutputTensors outputTensors
306 {
307 {0,armnn::Tensor(runtime->GetOutputTensorInfo(netId, 0), outputData.data())}
308 };
309
310 // Does the inference.
311 runtime->EnqueueWorkload(netId, inputTensors, outputTensors);
312
313 // Checks the results
314 BOOST_TEST(outputData[0] == 1);
315 BOOST_TEST(outputData[1] == 1);
316 BOOST_TEST(outputData[2] == 3);
317 BOOST_TEST(outputData[3] == 2);
318}
319
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000320BOOST_AUTO_TEST_CASE(RefEqualSimpleEndToEndTest)
321{
kevmay012b4d88e2019-01-24 14:05:09 +0000322 const std::vector<uint8_t> expectedOutput({ 1, 1, 1, 1, 0, 0, 0, 0,
323 0, 0, 0, 0, 1, 1, 1, 1 });
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000324
kevmay012b4d88e2019-01-24 14:05:09 +0000325 ArithmeticSimpleEndToEnd<armnn::DataType::Float32, armnn::DataType::Boolean>(defaultBackends,
326 LayerType::Equal,
327 expectedOutput);
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000328}
329
330BOOST_AUTO_TEST_CASE(RefGreaterSimpleEndToEndTest)
331{
kevmay012b4d88e2019-01-24 14:05:09 +0000332 const std::vector<uint8_t> expectedOutput({ 0, 0, 0, 0, 1, 1, 1, 1,
333 0, 0, 0, 0, 0, 0, 0, 0 });
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000334
kevmay012b4d88e2019-01-24 14:05:09 +0000335 ArithmeticSimpleEndToEnd<armnn::DataType::Float32, armnn::DataType::Boolean>(defaultBackends,
336 LayerType::Greater,
337 expectedOutput);
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000338}
339
340BOOST_AUTO_TEST_CASE(RefEqualSimpleEndToEndUint8Test)
341{
342 const std::vector<uint8_t> expectedOutput({ 1, 1, 1, 1, 0, 0, 0, 0,
343 0, 0, 0, 0, 1, 1, 1, 1 });
344
kevmay012b4d88e2019-01-24 14:05:09 +0000345 ArithmeticSimpleEndToEnd<armnn::DataType::QuantisedAsymm8, armnn::DataType::Boolean>(defaultBackends,
346 LayerType::Equal,
347 expectedOutput);
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000348}
349
350BOOST_AUTO_TEST_CASE(RefGreaterSimpleEndToEndUint8Test)
351{
352 const std::vector<uint8_t> expectedOutput({ 0, 0, 0, 0, 1, 1, 1, 1,
353 0, 0, 0, 0, 0, 0, 0, 0 });
354
kevmay012b4d88e2019-01-24 14:05:09 +0000355 ArithmeticSimpleEndToEnd<armnn::DataType::QuantisedAsymm8, armnn::DataType::Boolean>(defaultBackends,
356 LayerType::Greater,
357 expectedOutput);
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000358}
359
360BOOST_AUTO_TEST_CASE(RefEqualBroadcastEndToEndTest)
361{
kevmay012b4d88e2019-01-24 14:05:09 +0000362 const std::vector<uint8_t> expectedOutput({ 1, 0, 1, 1, 0, 0,
363 0, 0, 0, 0, 0, 0 });
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000364
kevmay012b4d88e2019-01-24 14:05:09 +0000365 ArithmeticBroadcastEndToEnd<armnn::DataType::Float32, armnn::DataType::Boolean>(defaultBackends,
366 LayerType::Equal,
367 expectedOutput);
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000368}
369
370BOOST_AUTO_TEST_CASE(RefGreaterBroadcastEndToEndTest)
371{
kevmay012b4d88e2019-01-24 14:05:09 +0000372 const std::vector<uint8_t> expectedOutput({ 0, 1, 0, 0, 0, 1,
373 1, 1, 1, 1, 1, 1 });
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000374
kevmay012b4d88e2019-01-24 14:05:09 +0000375 ArithmeticBroadcastEndToEnd<armnn::DataType::Float32, armnn::DataType::Boolean>(defaultBackends,
376 LayerType::Greater,
377 expectedOutput);
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000378}
379
380BOOST_AUTO_TEST_CASE(RefEqualBroadcastEndToEndUint8Test)
381{
382 const std::vector<uint8_t > expectedOutput({ 1, 0, 1, 1, 0, 0,
383 0, 0, 0, 0, 0, 0 });
384
kevmay012b4d88e2019-01-24 14:05:09 +0000385 ArithmeticBroadcastEndToEnd<armnn::DataType::QuantisedAsymm8, armnn::DataType::Boolean>(defaultBackends,
386 LayerType::Equal,
387 expectedOutput);
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000388}
389
390BOOST_AUTO_TEST_CASE(RefGreaterBroadcastEndToEndUint8Test)
391{
392 const std::vector<uint8_t> expectedOutput({ 0, 1, 0, 0, 0, 1,
393 1, 1, 1, 1, 1, 1 });
394
kevmay012b4d88e2019-01-24 14:05:09 +0000395 ArithmeticBroadcastEndToEnd<armnn::DataType::QuantisedAsymm8, armnn::DataType::Boolean>(defaultBackends,
396 LayerType::Greater,
397 expectedOutput);
FrancisMurtagh2262bbd2018-12-20 16:09:45 +0000398}
Éanna Ó Catháin20e58802018-12-04 10:29:06 +0000399
Jim Flynne242f2d2019-05-22 14:24:13 +0100400BOOST_AUTO_TEST_CASE(RefConcatEndToEndDim0Test)
narpra01b9546cf2018-11-20 15:21:28 +0000401{
Jim Flynne242f2d2019-05-22 14:24:13 +0100402 ConcatDim0EndToEnd<armnn::DataType::Float32>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000403}
404
Jim Flynne242f2d2019-05-22 14:24:13 +0100405BOOST_AUTO_TEST_CASE(RefConcatEndToEndDim0Uint8Test)
narpra01b9546cf2018-11-20 15:21:28 +0000406{
Jim Flynne242f2d2019-05-22 14:24:13 +0100407 ConcatDim0EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000408}
409
Jim Flynne242f2d2019-05-22 14:24:13 +0100410BOOST_AUTO_TEST_CASE(RefConcatEndToEndDim1Test)
narpra01b9546cf2018-11-20 15:21:28 +0000411{
Jim Flynne242f2d2019-05-22 14:24:13 +0100412 ConcatDim1EndToEnd<armnn::DataType::Float32>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000413}
414
Jim Flynne242f2d2019-05-22 14:24:13 +0100415BOOST_AUTO_TEST_CASE(RefConcatEndToEndDim1Uint8Test)
narpra01b9546cf2018-11-20 15:21:28 +0000416{
Jim Flynne242f2d2019-05-22 14:24:13 +0100417 ConcatDim1EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000418}
419
Jim Flynne242f2d2019-05-22 14:24:13 +0100420BOOST_AUTO_TEST_CASE(RefConcatEndToEndDim2Test)
narpra01b9546cf2018-11-20 15:21:28 +0000421{
Jim Flynne242f2d2019-05-22 14:24:13 +0100422 ConcatDim2EndToEnd<armnn::DataType::Float32>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000423}
424
Jim Flynne242f2d2019-05-22 14:24:13 +0100425BOOST_AUTO_TEST_CASE(RefConcatEndToEndDim2Uint8Test)
narpra01b9546cf2018-11-20 15:21:28 +0000426{
Jim Flynne242f2d2019-05-22 14:24:13 +0100427 ConcatDim2EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000428}
429
Jim Flynne242f2d2019-05-22 14:24:13 +0100430BOOST_AUTO_TEST_CASE(RefConcatEndToEndDim3Test)
narpra01b9546cf2018-11-20 15:21:28 +0000431{
Jim Flynne242f2d2019-05-22 14:24:13 +0100432 ConcatDim3EndToEnd<armnn::DataType::Float32>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000433}
434
Jim Flynne242f2d2019-05-22 14:24:13 +0100435BOOST_AUTO_TEST_CASE(RefConcatEndToEndDim3Uint8Test)
narpra01b9546cf2018-11-20 15:21:28 +0000436{
Jim Flynne242f2d2019-05-22 14:24:13 +0100437 ConcatDim3EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000438}
439
narpra01db2b1602019-01-23 15:23:11 +0000440BOOST_AUTO_TEST_CASE(RefGatherFloatTest)
441{
442 GatherEndToEnd<armnn::DataType::Float32>(defaultBackends);
443}
444
445BOOST_AUTO_TEST_CASE(RefGatherUint8Test)
446{
447 GatherEndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
448}
449
450BOOST_AUTO_TEST_CASE(RefGatherMultiDimFloatTest)
451{
452 GatherMultiDimEndToEnd<armnn::DataType::Float32>(defaultBackends);
453}
454
455BOOST_AUTO_TEST_CASE(RefGatherMultiDimUint8Test)
456{
457 GatherMultiDimEndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
458}
459
Narumol Prangnawarat8c7324d2019-05-31 16:42:11 +0100460BOOST_AUTO_TEST_CASE(DequantizeEndToEndSimpleTest)
461{
462 DequantizeEndToEndSimple<armnn::DataType::QuantisedAsymm8>(defaultBackends);
463}
464
465BOOST_AUTO_TEST_CASE(DequantizeEndToEndOffsetTest)
466{
467 DequantizeEndToEndOffset<armnn::DataType::QuantisedAsymm8>(defaultBackends);
468}
469
Narumol Prangnawaratb6441e42019-06-04 11:22:00 +0100470BOOST_AUTO_TEST_CASE(DequantizeEndToEndSimpleInt16Test)
471{
472 DequantizeEndToEndSimple<armnn::DataType::QuantisedSymm16>(defaultBackends);
473}
474
475BOOST_AUTO_TEST_CASE(DequantizeEndToEndOffsetInt16Test)
476{
477 DequantizeEndToEndOffset<armnn::DataType::QuantisedSymm16>(defaultBackends);
478}
479
Narumol Prangnawarat6d302bf2019-02-04 11:46:26 +0000480BOOST_AUTO_TEST_CASE(RefDetectionPostProcessRegularNmsTest)
481{
482 std::vector<float> boxEncodings({
483 0.0f, 0.0f, 0.0f, 0.0f,
484 0.0f, 1.0f, 0.0f, 0.0f,
485 0.0f, -1.0f, 0.0f, 0.0f,
486 0.0f, 0.0f, 0.0f, 0.0f,
487 0.0f, 1.0f, 0.0f, 0.0f,
488 0.0f, 0.0f, 0.0f, 0.0f
489 });
490 std::vector<float> scores({
491 0.0f, 0.9f, 0.8f,
492 0.0f, 0.75f, 0.72f,
493 0.0f, 0.6f, 0.5f,
494 0.0f, 0.93f, 0.95f,
495 0.0f, 0.5f, 0.4f,
496 0.0f, 0.3f, 0.2f
497 });
498 std::vector<float> anchors({
499 0.5f, 0.5f, 1.0f, 1.0f,
500 0.5f, 0.5f, 1.0f, 1.0f,
501 0.5f, 0.5f, 1.0f, 1.0f,
502 0.5f, 10.5f, 1.0f, 1.0f,
503 0.5f, 10.5f, 1.0f, 1.0f,
504 0.5f, 100.5f, 1.0f, 1.0f
505 });
506 DetectionPostProcessRegularNmsEndToEnd<armnn::DataType::Float32>(defaultBackends, boxEncodings, scores, anchors);
507}
508
509inline void QuantizeData(uint8_t* quant, const float* dequant, const TensorInfo& info)
510{
511 for (size_t i = 0; i < info.GetNumElements(); i++)
512 {
513 quant[i] = armnn::Quantize<uint8_t>(dequant[i], info.GetQuantizationScale(), info.GetQuantizationOffset());
514 }
515}
516
517BOOST_AUTO_TEST_CASE(RefDetectionPostProcessRegularNmsUint8Test)
518{
519 armnn::TensorInfo boxEncodingsInfo({ 1, 6, 4 }, armnn::DataType::Float32);
520 armnn::TensorInfo scoresInfo({ 1, 6, 3 }, armnn::DataType::Float32);
521 armnn::TensorInfo anchorsInfo({ 6, 4 }, armnn::DataType::Float32);
522
523 boxEncodingsInfo.SetQuantizationScale(1.0f);
524 boxEncodingsInfo.SetQuantizationOffset(1);
525 scoresInfo.SetQuantizationScale(0.01f);
526 scoresInfo.SetQuantizationOffset(0);
527 anchorsInfo.SetQuantizationScale(0.5f);
528 anchorsInfo.SetQuantizationOffset(0);
529
530 std::vector<float> boxEncodings({
531 0.0f, 0.0f, 0.0f, 0.0f,
532 0.0f, 1.0f, 0.0f, 0.0f,
533 0.0f, -1.0f, 0.0f, 0.0f,
534 0.0f, 0.0f, 0.0f, 0.0f,
535 0.0f, 1.0f, 0.0f, 0.0f,
536 0.0f, 0.0f, 0.0f, 0.0f
537 });
538 std::vector<float> scores({
539 0.0f, 0.9f, 0.8f,
540 0.0f, 0.75f, 0.72f,
541 0.0f, 0.6f, 0.5f,
542 0.0f, 0.93f, 0.95f,
543 0.0f, 0.5f, 0.4f,
544 0.0f, 0.3f, 0.2f
545 });
546 std::vector<float> anchors({
547 0.5f, 0.5f, 1.0f, 1.0f,
548 0.5f, 0.5f, 1.0f, 1.0f,
549 0.5f, 0.5f, 1.0f, 1.0f,
550 0.5f, 10.5f, 1.0f, 1.0f,
551 0.5f, 10.5f, 1.0f, 1.0f,
552 0.5f, 100.5f, 1.0f, 1.0f
553 });
554
555 std::vector<uint8_t> qBoxEncodings(boxEncodings.size(), 0);
556 std::vector<uint8_t> qScores(scores.size(), 0);
557 std::vector<uint8_t> qAnchors(anchors.size(), 0);
558 QuantizeData(qBoxEncodings.data(), boxEncodings.data(), boxEncodingsInfo);
559 QuantizeData(qScores.data(), scores.data(), scoresInfo);
560 QuantizeData(qAnchors.data(), anchors.data(), anchorsInfo);
561 DetectionPostProcessRegularNmsEndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends, qBoxEncodings,
562 qScores, qAnchors,
563 1.0f, 1, 0.01f, 0, 0.5f, 0);
564}
565
566BOOST_AUTO_TEST_CASE(RefDetectionPostProcessFastNmsTest)
567{
568 std::vector<float> boxEncodings({
569 0.0f, 0.0f, 0.0f, 0.0f,
570 0.0f, 1.0f, 0.0f, 0.0f,
571 0.0f, -1.0f, 0.0f, 0.0f,
572 0.0f, 0.0f, 0.0f, 0.0f,
573 0.0f, 1.0f, 0.0f, 0.0f,
574 0.0f, 0.0f, 0.0f, 0.0f
575 });
576 std::vector<float> scores({
577 0.0f, 0.9f, 0.8f,
578 0.0f, 0.75f, 0.72f,
579 0.0f, 0.6f, 0.5f,
580 0.0f, 0.93f, 0.95f,
581 0.0f, 0.5f, 0.4f,
582 0.0f, 0.3f, 0.2f
583 });
584 std::vector<float> anchors({
585 0.5f, 0.5f, 1.0f, 1.0f,
586 0.5f, 0.5f, 1.0f, 1.0f,
587 0.5f, 0.5f, 1.0f, 1.0f,
588 0.5f, 10.5f, 1.0f, 1.0f,
589 0.5f, 10.5f, 1.0f, 1.0f,
590 0.5f, 100.5f, 1.0f, 1.0f
591 });
592 DetectionPostProcessFastNmsEndToEnd<armnn::DataType::Float32>(defaultBackends, boxEncodings, scores, anchors);
593}
594
595BOOST_AUTO_TEST_CASE(RefDetectionPostProcessFastNmsUint8Test)
596{
597 armnn::TensorInfo boxEncodingsInfo({ 1, 6, 4 }, armnn::DataType::Float32);
598 armnn::TensorInfo scoresInfo({ 1, 6, 3 }, armnn::DataType::Float32);
599 armnn::TensorInfo anchorsInfo({ 6, 4 }, armnn::DataType::Float32);
600
601 boxEncodingsInfo.SetQuantizationScale(1.0f);
602 boxEncodingsInfo.SetQuantizationOffset(1);
603 scoresInfo.SetQuantizationScale(0.01f);
604 scoresInfo.SetQuantizationOffset(0);
605 anchorsInfo.SetQuantizationScale(0.5f);
606 anchorsInfo.SetQuantizationOffset(0);
607
608 std::vector<float> boxEncodings({
609 0.0f, 0.0f, 0.0f, 0.0f,
610 0.0f, 1.0f, 0.0f, 0.0f,
611 0.0f, -1.0f, 0.0f, 0.0f,
612 0.0f, 0.0f, 0.0f, 0.0f,
613 0.0f, 1.0f, 0.0f, 0.0f,
614 0.0f, 0.0f, 0.0f, 0.0f
615 });
616 std::vector<float> scores({
617 0.0f, 0.9f, 0.8f,
618 0.0f, 0.75f, 0.72f,
619 0.0f, 0.6f, 0.5f,
620 0.0f, 0.93f, 0.95f,
621 0.0f, 0.5f, 0.4f,
622 0.0f, 0.3f, 0.2f
623 });
624 std::vector<float> anchors({
625 0.5f, 0.5f, 1.0f, 1.0f,
626 0.5f, 0.5f, 1.0f, 1.0f,
627 0.5f, 0.5f, 1.0f, 1.0f,
628 0.5f, 10.5f, 1.0f, 1.0f,
629 0.5f, 10.5f, 1.0f, 1.0f,
630 0.5f, 100.5f, 1.0f, 1.0f
631 });
632
633 std::vector<uint8_t> qBoxEncodings(boxEncodings.size(), 0);
634 std::vector<uint8_t> qScores(scores.size(), 0);
635 std::vector<uint8_t> qAnchors(anchors.size(), 0);
636 QuantizeData(qBoxEncodings.data(), boxEncodings.data(), boxEncodingsInfo);
637 QuantizeData(qScores.data(), scores.data(), scoresInfo);
638 QuantizeData(qAnchors.data(), anchors.data(), anchorsInfo);
639 DetectionPostProcessFastNmsEndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends, qBoxEncodings,
640 qScores, qAnchors,
641 1.0f, 1, 0.01f, 0, 0.5f, 0);
642}
643
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100644BOOST_AUTO_TEST_CASE(RefSplitter1dEndToEndTest)
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100645{
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100646 Splitter1dEndToEnd<armnn::DataType::Float32>(defaultBackends);
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100647}
648
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100649BOOST_AUTO_TEST_CASE(RefSplitter1dEndToEndUint8Test)
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100650{
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100651 Splitter1dEndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100652}
653
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100654BOOST_AUTO_TEST_CASE(RefSplitter2dDim0EndToEndTest)
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100655{
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100656 Splitter2dDim0EndToEnd<armnn::DataType::Float32>(defaultBackends);
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100657}
658
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100659BOOST_AUTO_TEST_CASE(RefSplitter2dDim1EndToEndTest)
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100660{
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100661 Splitter2dDim1EndToEnd<armnn::DataType::Float32>(defaultBackends);
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100662}
663
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100664BOOST_AUTO_TEST_CASE(RefSplitter2dDim0EndToEndUint8Test)
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100665{
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100666 Splitter2dDim0EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100667}
668
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100669BOOST_AUTO_TEST_CASE(RefSplitter2dDim1EndToEndUint8Test)
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100670{
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100671 Splitter2dDim1EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100672}
673
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100674BOOST_AUTO_TEST_CASE(RefSplitter3dDim0EndToEndTest)
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100675{
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100676 Splitter3dDim0EndToEnd<armnn::DataType::Float32>(defaultBackends);
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100677}
678
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100679BOOST_AUTO_TEST_CASE(RefSplitter3dDim1EndToEndTest)
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100680{
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100681 Splitter3dDim1EndToEnd<armnn::DataType::Float32>(defaultBackends);
682}
683
684BOOST_AUTO_TEST_CASE(RefSplitter3dDim2EndToEndTest)
685{
686 Splitter3dDim2EndToEnd<armnn::DataType::Float32>(defaultBackends);
687}
688
689BOOST_AUTO_TEST_CASE(RefSplitter3dDim0EndToEndUint8Test)
690{
691 Splitter3dDim0EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
692}
693
694BOOST_AUTO_TEST_CASE(RefSplitter3dDim1EndToEndUint8Test)
695{
696 Splitter3dDim1EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
697}
698
699BOOST_AUTO_TEST_CASE(RefSplitter3dDim2EndToEndUint8Test)
700{
701 Splitter3dDim2EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
702}
703
704BOOST_AUTO_TEST_CASE(RefSplitter4dDim0EndToEndTest)
705{
706 Splitter4dDim0EndToEnd<armnn::DataType::Float32>(defaultBackends);
707}
708
709BOOST_AUTO_TEST_CASE(RefSplitter4dDim1EndToEndTest)
710{
711 Splitter4dDim1EndToEnd<armnn::DataType::Float32>(defaultBackends);
712}
713
714BOOST_AUTO_TEST_CASE(RefSplitter4dDim2EndToEndTest)
715{
716 Splitter4dDim2EndToEnd<armnn::DataType::Float32>(defaultBackends);
717}
718
719BOOST_AUTO_TEST_CASE(RefSplitter4dDim3EndToEndTest)
720{
721 Splitter4dDim3EndToEnd<armnn::DataType::Float32>(defaultBackends);
722}
723
724BOOST_AUTO_TEST_CASE(RefSplitter4dDim0EndToEndUint8Test)
725{
726 Splitter4dDim0EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
727}
728
729BOOST_AUTO_TEST_CASE(RefSplitter4dDim1EndToEndUint8Test)
730{
731 Splitter4dDim1EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
732}
733
734BOOST_AUTO_TEST_CASE(RefSplitter4dDim2EndToEndUint8Test)
735{
736 Splitter4dDim2EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
737}
738
739BOOST_AUTO_TEST_CASE(RefSplitter4dDim3EndToEndUint8Test)
740{
741 Splitter4dDim3EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100742}
743
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000744BOOST_AUTO_TEST_SUITE_END()