blob: 7e3a90feda97a5cbb43030698507d56fe94aa124 [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
5#include <boost/test/unit_test.hpp>
6#include <backends/CpuTensorHandle.hpp>
7#include <backends/Workload.hpp>
David Beckb4540be2018-09-24 13:18:27 +01008#include <backends/reference/workloads/RefWorkloads.hpp>
9#include <backends/reference/RefWorkloadFactory.hpp>
telsoa014fcda012018-03-09 14:13:49 +000010
11#include <armnn/Exceptions.hpp>
12
13#include "WorkloadTestUtils.hpp"
14
15using namespace armnn;
16
17BOOST_AUTO_TEST_SUITE(WorkloadInfoValidation)
18
19
20
21BOOST_AUTO_TEST_CASE(QueueDescriptor_Validate_WrongNumOfInputsOutputs)
22{
23 InputQueueDescriptor invalidData;
24 WorkloadInfo invalidInfo;
telsoa01c577f2c2018-08-31 09:22:23 +010025 //Invalid argument exception is expected, because no inputs and no outputs were defined.
telsoa014fcda012018-03-09 14:13:49 +000026 BOOST_CHECK_THROW(RefWorkloadFactory().CreateInput(invalidData, invalidInfo), armnn::InvalidArgumentException);
27}
28
29BOOST_AUTO_TEST_CASE(RefPooling2dFloat32Workload_Validate_WrongDimTensor)
30{
31 armnn::TensorInfo inputTensorInfo;
32 armnn::TensorInfo outputTensorInfo;
33
telsoa01c577f2c2018-08-31 09:22:23 +010034 unsigned int inputShape[] = {2, 3, 4}; // <- Invalid - input tensor has to be 4D.
telsoa014fcda012018-03-09 14:13:49 +000035 unsigned int outputShape[] = {2, 3, 4, 5};
36
37 outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
38 inputTensorInfo = armnn::TensorInfo(3, inputShape, armnn::DataType::Float32);
39
40 Pooling2dQueueDescriptor invalidData;
41 WorkloadInfo invalidInfo;
42
43 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo, nullptr);
44 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo, nullptr);
45
telsoa01c577f2c2018-08-31 09:22:23 +010046 // Invalid argument exception is expected, input tensor has to be 4D.
telsoa014fcda012018-03-09 14:13:49 +000047 BOOST_CHECK_THROW(RefPooling2dFloat32Workload(invalidData, invalidInfo), armnn::InvalidArgumentException);
48}
49
50BOOST_AUTO_TEST_CASE(SoftmaxQueueDescriptor_Validate_WrongInputHeight)
51{
52 unsigned int inputHeight = 1;
53 unsigned int inputWidth = 1;
54 unsigned int inputChannels = 4;
55 unsigned int inputNum = 2;
56
57 unsigned int outputChannels = inputChannels;
telsoa01c577f2c2018-08-31 09:22:23 +010058 unsigned int outputHeight = inputHeight + 1; //Makes data invalid - Softmax expects height and width to be 1.
telsoa014fcda012018-03-09 14:13:49 +000059 unsigned int outputWidth = inputWidth;
60 unsigned int outputNum = inputNum;
61
62 armnn::TensorInfo inputTensorInfo;
63 armnn::TensorInfo outputTensorInfo;
64
65 unsigned int inputShape[] = { inputNum, inputChannels, inputHeight, inputWidth };
66 unsigned int outputShape[] = { outputNum, outputChannels, outputHeight, outputWidth };
67
68 inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
69 outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
70
71 SoftmaxQueueDescriptor invalidData;
72 WorkloadInfo invalidInfo;
73
74 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo, nullptr);
75 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo, nullptr);
76
telsoa01c577f2c2018-08-31 09:22:23 +010077 //Invalid argument exception is expected, because height != 1.
telsoa014fcda012018-03-09 14:13:49 +000078 BOOST_CHECK_THROW(RefSoftmaxFloat32Workload(invalidData, invalidInfo), armnn::InvalidArgumentException);
79}
80
81BOOST_AUTO_TEST_CASE(FullyConnectedQueueDescriptor_Validate_RequiredDataMissing)
82{
83 unsigned int inputWidth = 1;
84 unsigned int inputHeight = 1;
85 unsigned int inputChannels = 5;
86 unsigned int inputNum = 2;
87
88 unsigned int outputWidth = 1;
89 unsigned int outputHeight = 1;
90 unsigned int outputChannels = 3;
91 unsigned int outputNum = 2;
92
telsoa01c577f2c2018-08-31 09:22:23 +010093 // Define the tensor descriptors.
telsoa014fcda012018-03-09 14:13:49 +000094 armnn::TensorInfo inputTensorInfo;
95 armnn::TensorInfo outputTensorInfo;
96 armnn::TensorInfo weightsDesc;
97 armnn::TensorInfo biasesDesc;
98
99 unsigned int inputShape[] = { inputNum, inputChannels, inputHeight, inputWidth };
100 unsigned int outputShape[] = { outputNum, outputChannels, outputHeight, outputWidth };
101 unsigned int weightsShape[] = { 1, 1, inputChannels, outputChannels };
102 unsigned int biasShape[] = { 1, outputChannels, outputHeight, outputWidth };
103
104 inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
105 outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
106 weightsDesc = armnn::TensorInfo(4, weightsShape, armnn::DataType::Float32);
107 biasesDesc = armnn::TensorInfo(4, biasShape, armnn::DataType::Float32);
108
109 FullyConnectedQueueDescriptor invalidData;
110 WorkloadInfo invalidInfo;
111
112 ScopedCpuTensorHandle weightTensor(weightsDesc);
113 ScopedCpuTensorHandle biasTensor(biasesDesc);
114
115 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo, nullptr);
116 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo, nullptr);
117 invalidData.m_Weight = &weightTensor;
118 invalidData.m_Bias = &biasTensor;
119 invalidData.m_Parameters.m_BiasEnabled = true;
120 invalidData.m_Parameters.m_TransposeWeightMatrix = false;
121
122
telsoa01c577f2c2018-08-31 09:22:23 +0100123 //Invalid argument exception is expected, because not all required fields have been provided.
124 //In particular inputsData[0], outputsData[0] and weightsData can not be null.
telsoa014fcda012018-03-09 14:13:49 +0000125 BOOST_CHECK_THROW(RefFullyConnectedFloat32Workload(invalidData, invalidInfo), armnn::InvalidArgumentException);
126}
127
128
129BOOST_AUTO_TEST_CASE(NormalizationQueueDescriptor_Validate_WrongInputHeight)
130{
131 constexpr unsigned int inputNum = 5;
132 constexpr unsigned int inputHeight = 32;
133 constexpr unsigned int inputWidth = 24;
134 constexpr unsigned int inputChannels = 3;
135
136 constexpr unsigned int outputNum = inputNum;
137 constexpr unsigned int outputChannels = inputChannels;
telsoa01c577f2c2018-08-31 09:22:23 +0100138 constexpr unsigned int outputHeight = inputHeight + 1; //Makes data invalid - normalization requires.
139 //Input and output to have the same dimensions.
telsoa014fcda012018-03-09 14:13:49 +0000140 constexpr unsigned int outputWidth = inputWidth;
141
142
143 armnn::TensorInfo inputTensorInfo;
144 armnn::TensorInfo outputTensorInfo;
145
146 unsigned int inputShape[] = {inputNum, inputChannels, inputHeight, inputWidth};
147 unsigned int outputShape[] = {outputNum, outputChannels, outputHeight, outputWidth};
148
149 inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
150 outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
151
152
153 armnn::NormalizationAlgorithmMethod normMethod = armnn::NormalizationAlgorithmMethod::LocalBrightness;
154 armnn::NormalizationAlgorithmChannel normChannel = armnn::NormalizationAlgorithmChannel::Across;
155 float alpha = 1.f;
156 float beta = 1.f;
157 float kappa = 1.f;
158 uint32_t normSize = 5;
159
160 NormalizationQueueDescriptor invalidData;
161 WorkloadInfo invalidInfo;
162
163 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo, nullptr);
164 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo, nullptr);
165 invalidData.m_Parameters.m_NormChannelType = normChannel;
166 invalidData.m_Parameters.m_NormMethodType = normMethod;
167 invalidData.m_Parameters.m_NormSize = normSize;
168 invalidData.m_Parameters.m_Alpha = alpha;
169 invalidData.m_Parameters.m_Beta = beta;
170 invalidData.m_Parameters.m_K = kappa;
171
telsoa01c577f2c2018-08-31 09:22:23 +0100172 //Invalid argument exception is expected, because input height != output height.
telsoa014fcda012018-03-09 14:13:49 +0000173 BOOST_CHECK_THROW(RefNormalizationFloat32Workload(invalidData, invalidInfo), armnn::InvalidArgumentException);
174}
175
176BOOST_AUTO_TEST_CASE(SplitterQueueDescriptor_Validate_WrongWindow)
177{
178 constexpr unsigned int inputNum = 1;
179 constexpr unsigned int inputHeight = 32;
180 constexpr unsigned int inputWidth = 24;
181 constexpr unsigned int inputChannels = 3;
182
183 constexpr unsigned int outputNum = inputNum;
184 constexpr unsigned int outputChannels = inputChannels;
185 constexpr unsigned int outputHeight = 18;
186 constexpr unsigned int outputWidth = inputWidth;
187
188
189 armnn::TensorInfo inputTensorInfo;
190 armnn::TensorInfo outputTensorInfo;
191
192 unsigned int inputShape[] = {inputNum, inputChannels, inputHeight, inputWidth};
193 unsigned int outputShape[] = {outputNum, outputChannels, outputHeight, outputWidth};
194
195 inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
196 outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
197
198 SplitterQueueDescriptor invalidData;
199 WorkloadInfo invalidInfo;
200
201 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo, nullptr);
202 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo, nullptr);
203
telsoa01c577f2c2018-08-31 09:22:23 +0100204 // Invalid, since it has only 3 dimensions while the input tensor is 4d.
telsoa014fcda012018-03-09 14:13:49 +0000205 std::vector<unsigned int> wOrigin = {0, 0, 0};
206 armnn::SplitterQueueDescriptor::ViewOrigin window(wOrigin);
207 invalidData.m_ViewOrigins.push_back(window);
208
209 BOOST_TEST_INFO("Invalid argument exception is expected, because split window dimensionality does not "
210 "match input.");
211 BOOST_CHECK_THROW(RefSplitterFloat32Workload(invalidData, invalidInfo), armnn::InvalidArgumentException);
212
telsoa01c577f2c2018-08-31 09:22:23 +0100213 // Invalid, since window extends past the boundary of input tensor.
telsoa014fcda012018-03-09 14:13:49 +0000214 std::vector<unsigned int> wOrigin3 = {0, 0, 15, 0};
215 armnn::SplitterQueueDescriptor::ViewOrigin window3(wOrigin3);
216 invalidData.m_ViewOrigins[0] = window3;
217 BOOST_TEST_INFO("Invalid argument exception is expected (wOrigin3[2]+ outputHeight > inputHeight");
218 BOOST_CHECK_THROW(RefSplitterFloat32Workload(invalidData, invalidInfo), armnn::InvalidArgumentException);
219
220
221 std::vector<unsigned int> wOrigin4 = {0, 0, 0, 0};
222 armnn::SplitterQueueDescriptor::ViewOrigin window4(wOrigin4);
223 invalidData.m_ViewOrigins[0] = window4;
224
225 std::vector<unsigned int> wOrigin5 = {1, 16, 20, 2};
226 armnn::SplitterQueueDescriptor::ViewOrigin window5(wOrigin4);
227 invalidData.m_ViewOrigins.push_back(window5);
228
229 BOOST_TEST_INFO("Invalid exception due to number of split windows not matching number of outputs.");
230 BOOST_CHECK_THROW(RefSplitterFloat32Workload(invalidData, invalidInfo), armnn::InvalidArgumentException);
231}
232
233
234BOOST_AUTO_TEST_CASE(MergerQueueDescriptor_Validate_WrongWindow)
235{
236 constexpr unsigned int inputNum = 1;
237 constexpr unsigned int inputChannels = 3;
238 constexpr unsigned int inputHeight = 32;
239 constexpr unsigned int inputWidth = 24;
240
241 constexpr unsigned int outputNum = 1;
242 constexpr unsigned int outputChannels = 3;
243 constexpr unsigned int outputHeight = 32;
244 constexpr unsigned int outputWidth = 24;
245
246
247 armnn::TensorInfo inputTensorInfo;
248 armnn::TensorInfo outputTensorInfo;
249
250 unsigned int inputShape[] = {inputNum, inputChannels, inputHeight, inputWidth};
251 unsigned int outputShape[] = {outputNum, outputChannels, outputHeight, outputWidth};
252
253 inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
254 outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
255
256 MergerQueueDescriptor invalidData;
257 WorkloadInfo invalidInfo;
258
259 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo, nullptr);
260 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo, nullptr);
261
telsoa01c577f2c2018-08-31 09:22:23 +0100262 // Invalid, since it has only 3 dimensions while the input tensor is 4d.
telsoa014fcda012018-03-09 14:13:49 +0000263 std::vector<unsigned int> wOrigin = {0, 0, 0};
264 armnn::MergerQueueDescriptor::ViewOrigin window(wOrigin);
265 invalidData.m_ViewOrigins.push_back(window);
266
267 BOOST_TEST_INFO("Invalid argument exception is expected, because merge window dimensionality does not "
268 "match input.");
269 BOOST_CHECK_THROW(RefMergerFloat32Workload(invalidData, invalidInfo), armnn::InvalidArgumentException);
270
telsoa01c577f2c2018-08-31 09:22:23 +0100271 // Invalid, since window extends past the boundary of output tensor.
telsoa014fcda012018-03-09 14:13:49 +0000272 std::vector<unsigned int> wOrigin3 = {0, 0, 15, 0};
273 armnn::MergerQueueDescriptor::ViewOrigin window3(wOrigin3);
274 invalidData.m_ViewOrigins[0] = window3;
275 BOOST_TEST_INFO("Invalid argument exception is expected (wOrigin3[2]+ inputHeight > outputHeight");
276 BOOST_CHECK_THROW(RefMergerFloat32Workload(invalidData, invalidInfo), armnn::InvalidArgumentException);
277
278
279 std::vector<unsigned int> wOrigin4 = {0, 0, 0, 0};
280 armnn::MergerQueueDescriptor::ViewOrigin window4(wOrigin4);
281 invalidData.m_ViewOrigins[0] = window4;
282
283 std::vector<unsigned int> wOrigin5 = {1, 16, 20, 2};
284 armnn::MergerQueueDescriptor::ViewOrigin window5(wOrigin4);
285 invalidData.m_ViewOrigins.push_back(window5);
286
287 BOOST_TEST_INFO("Invalid exception due to number of merge windows not matching number of inputs.");
288 BOOST_CHECK_THROW(RefMergerFloat32Workload(invalidData, invalidInfo), armnn::InvalidArgumentException);
289}
290
291BOOST_AUTO_TEST_CASE(AdditionQueueDescriptor_Validate_InputNumbers)
292{
293 armnn::TensorInfo input1TensorInfo;
294 armnn::TensorInfo input2TensorInfo;
295 armnn::TensorInfo input3TensorInfo;
296 armnn::TensorInfo outputTensorInfo;
297
298 unsigned int shape[] = {1, 1, 1, 1};
299
300 input1TensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
301 input2TensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
302 input3TensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
303 outputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
304
305 AdditionQueueDescriptor invalidData;
306 WorkloadInfo invalidInfo;
307
308 AddInputToWorkload(invalidData, invalidInfo, input1TensorInfo, nullptr);
309 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo, nullptr);
310
telsoa01c577f2c2018-08-31 09:22:23 +0100311 // Too few inputs.
telsoa014fcda012018-03-09 14:13:49 +0000312 BOOST_CHECK_THROW(RefAdditionFloat32Workload(invalidData, invalidInfo), armnn::InvalidArgumentException);
313
314 AddInputToWorkload(invalidData, invalidInfo, input2TensorInfo, nullptr);
315
telsoa01c577f2c2018-08-31 09:22:23 +0100316 // Correct.
telsoa014fcda012018-03-09 14:13:49 +0000317 BOOST_CHECK_NO_THROW(RefAdditionFloat32Workload(invalidData, invalidInfo));
318
319 AddInputToWorkload(invalidData, invalidInfo, input3TensorInfo, nullptr);
320
telsoa01c577f2c2018-08-31 09:22:23 +0100321 // Too many inputs.
telsoa014fcda012018-03-09 14:13:49 +0000322 BOOST_CHECK_THROW(RefAdditionFloat32Workload(invalidData, invalidInfo), armnn::InvalidArgumentException);
323}
324
325BOOST_AUTO_TEST_CASE(AdditionQueueDescriptor_Validate_InputShapes)
326{
327 armnn::TensorInfo input1TensorInfo;
328 armnn::TensorInfo input2TensorInfo;
329 armnn::TensorInfo outputTensorInfo;
330
331 unsigned int shape1[] = {1, 1, 2, 1};
332 unsigned int shape2[] = {1, 1, 3, 2};
333
telsoa01c577f2c2018-08-31 09:22:23 +0100334 // Incompatible shapes even with broadcasting.
telsoa014fcda012018-03-09 14:13:49 +0000335 {
336 input1TensorInfo = armnn::TensorInfo(4, shape1, armnn::DataType::Float32);
337 input2TensorInfo = armnn::TensorInfo(4, shape2, armnn::DataType::Float32);
338 outputTensorInfo = armnn::TensorInfo(4, shape1, armnn::DataType::Float32);
339
340 AdditionQueueDescriptor invalidData;
341 WorkloadInfo invalidInfo;
342
343 AddInputToWorkload(invalidData, invalidInfo, input1TensorInfo, nullptr);
344 AddInputToWorkload(invalidData, invalidInfo, input2TensorInfo, nullptr);
345 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo, nullptr);
346
347 BOOST_CHECK_THROW(RefAdditionFloat32Workload(invalidData, invalidInfo), armnn::InvalidArgumentException);
348 }
349
telsoa01c577f2c2018-08-31 09:22:23 +0100350 // Output size not compatible with input sizes.
telsoa014fcda012018-03-09 14:13:49 +0000351 {
352 input1TensorInfo = armnn::TensorInfo(4, shape1, armnn::DataType::Float32);
353 input2TensorInfo = armnn::TensorInfo(4, shape1, armnn::DataType::Float32);
354 outputTensorInfo = armnn::TensorInfo(4, shape2, armnn::DataType::Float32);
355
356 AdditionQueueDescriptor invalidData;
357 WorkloadInfo invalidInfo;
358
359 AddInputToWorkload(invalidData, invalidInfo, input1TensorInfo, nullptr);
360 AddInputToWorkload(invalidData, invalidInfo, input2TensorInfo, nullptr);
361 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo, nullptr);
362
telsoa01c577f2c2018-08-31 09:22:23 +0100363 // Output differs.
telsoa014fcda012018-03-09 14:13:49 +0000364 BOOST_CHECK_THROW(RefAdditionFloat32Workload(invalidData, invalidInfo), armnn::InvalidArgumentException);
365 }
366}
367
368BOOST_AUTO_TEST_CASE(MultiplicationQueueDescriptor_Validate_InputTensorDimensionMismatch)
369{
370 armnn::TensorInfo input0TensorInfo;
371 armnn::TensorInfo input1TensorInfo;
372 armnn::TensorInfo outputTensorInfo;
373
374 constexpr unsigned int input0Shape[] = { 2, 2, 4, 4 };
375 constexpr std::size_t dimensionCount = std::extent<decltype(input0Shape)>::value;
376
telsoa01c577f2c2018-08-31 09:22:23 +0100377 // Checks dimension consistency for input tensors.
telsoa014fcda012018-03-09 14:13:49 +0000378 for (unsigned int dimIndex = 0; dimIndex < dimensionCount; ++dimIndex)
379 {
380 unsigned int input1Shape[dimensionCount];
381 for (unsigned int i = 0; i < dimensionCount; ++i)
382 {
383 input1Shape[i] = input0Shape[i];
384 }
385
386 ++input1Shape[dimIndex];
387
388 input0TensorInfo = armnn::TensorInfo(dimensionCount, input0Shape, armnn::DataType::Float32);
389 input1TensorInfo = armnn::TensorInfo(dimensionCount, input1Shape, armnn::DataType::Float32);
390 outputTensorInfo = armnn::TensorInfo(dimensionCount, input0Shape, armnn::DataType::Float32);
391
392 MultiplicationQueueDescriptor invalidData;
393 WorkloadInfo invalidInfo;
394
395 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo, nullptr);
396 AddInputToWorkload(invalidData, invalidInfo, input0TensorInfo, nullptr);
397 AddInputToWorkload(invalidData, invalidInfo, input1TensorInfo, nullptr);
398
399 BOOST_CHECK_THROW(RefMultiplicationFloat32Workload(invalidData, invalidInfo), armnn::InvalidArgumentException);
400 }
401
telsoa01c577f2c2018-08-31 09:22:23 +0100402 // Checks dimension consistency for input and output tensors.
telsoa014fcda012018-03-09 14:13:49 +0000403 for (unsigned int dimIndex = 0; dimIndex < dimensionCount; ++dimIndex)
404 {
405 unsigned int outputShape[dimensionCount];
406 for (unsigned int i = 0; i < dimensionCount; ++i)
407 {
408 outputShape[i] = input0Shape[i];
409 }
410
411 ++outputShape[dimIndex];
412
413 input0TensorInfo = armnn::TensorInfo(dimensionCount, input0Shape, armnn::DataType::Float32);
414 input1TensorInfo = armnn::TensorInfo(dimensionCount, input0Shape, armnn::DataType::Float32);
415 outputTensorInfo = armnn::TensorInfo(dimensionCount, outputShape, armnn::DataType::Float32);
416
417 MultiplicationQueueDescriptor invalidData;
418 WorkloadInfo invalidInfo;
419
420 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo, nullptr);
421 AddInputToWorkload(invalidData, invalidInfo, input0TensorInfo, nullptr);
422 AddInputToWorkload(invalidData, invalidInfo, input1TensorInfo, nullptr);
423
424 BOOST_CHECK_THROW(RefMultiplicationFloat32Workload(invalidData, invalidInfo), armnn::InvalidArgumentException);
425 }
426}
427
428BOOST_AUTO_TEST_CASE(ReshapeQueueDescriptor_Validate_MismatchingNumElements)
429{
430 armnn::TensorInfo inputTensorInfo;
431 armnn::TensorInfo outputTensorInfo;
432
telsoa01c577f2c2018-08-31 09:22:23 +0100433 // The input and output shapes should have the same number of elements, but these don't.
telsoa014fcda012018-03-09 14:13:49 +0000434 unsigned int inputShape[] = { 1, 1, 2, 3 };
435 unsigned int outputShape[] = { 1, 1, 1, 2 };
436
437 inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::DataType::Float32);
438 outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::DataType::Float32);
439
440 ReshapeQueueDescriptor invalidData;
441 WorkloadInfo invalidInfo;
442
443 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo, nullptr);
444 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo, nullptr);
445
telsoa01c577f2c2018-08-31 09:22:23 +0100446 // InvalidArgumentException is expected, because the number of elements don't match.
telsoa014fcda012018-03-09 14:13:49 +0000447 BOOST_CHECK_THROW(RefReshapeFloat32Workload(invalidData, invalidInfo), armnn::InvalidArgumentException);
448}
449
telsoa01c577f2c2018-08-31 09:22:23 +0100450
451BOOST_AUTO_TEST_CASE(LstmQueueDescriptor_Validate)
452{
453 armnn::TensorInfo inputTensorInfo;
454 armnn::TensorInfo outputTensorInfo;
455
456 unsigned int inputShape[] = { 1, 2 };
457 unsigned int outputShape[] = { 1 };
458
459 inputTensorInfo = armnn::TensorInfo(2, inputShape, armnn::DataType::Float32);
460 outputTensorInfo = armnn::TensorInfo(1, outputShape, armnn::DataType::Float32);
461
462 LstmQueueDescriptor invalidData;
463 WorkloadInfo invalidInfo;
464
465 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo, nullptr);
466 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo, nullptr);
467
468 BOOST_CHECK_THROW(invalidData.Validate(invalidInfo), armnn::InvalidArgumentException);
469}
470
telsoa014fcda012018-03-09 14:13:49 +0000471BOOST_AUTO_TEST_SUITE_END()