16 #include <doctest/doctest.h> 18 using namespace armnn;
22 TEST_CASE(
"BatchNormalizationQueueDescriptor_Validate_DifferentQuantizationData")
33 unsigned int sameShape[] = { 10 };
37 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
38 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
40 invalidData.
m_Mean = &sameTensor;
42 invalidData.
m_Beta= &sameTensor;
43 invalidData.
m_Gamma = &sameTensor;
48 TEST_CASE(
"QueueDescriptor_Validate_WrongNumOfInputsOutputs")
57 TEST_CASE(
"RefPooling2dFloat32Workload_Validate_WrongDimTensor")
62 unsigned int inputShape[] = {2, 3, 4};
63 unsigned int outputShape[] = {2, 3, 4, 5};
71 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
72 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
78 TEST_CASE(
"RefPooling3dFloat32Workload_Validate_WrongDimTensor")
83 unsigned int inputShape[] = {2, 3, 4, 5};
84 unsigned int outputShape[] = {2, 3, 4, 5, 6};
92 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
93 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
99 TEST_CASE(
"SoftmaxQueueDescriptor_Validate_WrongInputHeight")
101 unsigned int inputHeight = 1;
102 unsigned int inputWidth = 1;
103 unsigned int inputChannels = 4;
104 unsigned int inputNum = 2;
106 unsigned int outputChannels = inputChannels;
107 unsigned int outputHeight = inputHeight + 1;
108 unsigned int outputWidth = inputWidth;
109 unsigned int outputNum = inputNum;
114 unsigned int inputShape[] = { inputNum, inputChannels, inputHeight, inputWidth };
115 unsigned int outputShape[] = { outputNum, outputChannels, outputHeight, outputWidth };
123 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
124 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
130 TEST_CASE(
"FullyConnectedQueueDescriptor_Validate_RequiredDataMissing")
132 unsigned int inputWidth = 1;
133 unsigned int inputHeight = 1;
134 unsigned int inputChannels = 5;
135 unsigned int inputNum = 2;
137 unsigned int outputWidth = 1;
138 unsigned int outputHeight = 1;
139 unsigned int outputChannels = 3;
140 unsigned int outputNum = 2;
148 unsigned int inputShape[] = { inputNum, inputChannels, inputHeight, inputWidth };
149 unsigned int outputShape[] = { outputNum, outputChannels, outputHeight, outputWidth };
150 unsigned int weightsShape[] = { 1, 1, inputChannels, outputChannels };
151 unsigned int biasShape[] = { 1, outputChannels, outputHeight, outputWidth };
164 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
165 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
166 invalidData.
m_Weight = &weightTensor;
167 invalidData.
m_Bias = &biasTensor;
178 TEST_CASE(
"NormalizationQueueDescriptor_Validate_WrongInputHeight")
180 constexpr
unsigned int inputNum = 5;
181 constexpr
unsigned int inputHeight = 32;
182 constexpr
unsigned int inputWidth = 24;
183 constexpr
unsigned int inputChannels = 3;
185 constexpr
unsigned int outputNum = inputNum;
186 constexpr
unsigned int outputChannels = inputChannels;
187 constexpr
unsigned int outputHeight = inputHeight + 1;
189 constexpr
unsigned int outputWidth = inputWidth;
195 unsigned int inputShape[] = {inputNum, inputChannels, inputHeight, inputWidth};
196 unsigned int outputShape[] = {outputNum, outputChannels, outputHeight, outputWidth};
207 uint32_t normSize = 5;
212 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
213 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
225 TEST_CASE(
"SplitterQueueDescriptor_Validate_WrongWindow")
227 constexpr
unsigned int inputNum = 1;
228 constexpr
unsigned int inputHeight = 32;
229 constexpr
unsigned int inputWidth = 24;
230 constexpr
unsigned int inputChannels = 3;
232 constexpr
unsigned int outputNum = inputNum;
233 constexpr
unsigned int outputChannels = inputChannels;
234 constexpr
unsigned int outputHeight = 18;
235 constexpr
unsigned int outputWidth = inputWidth;
241 unsigned int inputShape[] = {inputNum, inputChannels, inputHeight, inputWidth};
242 unsigned int outputShape[] = {outputNum, outputChannels, outputHeight, outputWidth};
250 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
251 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
254 std::vector<unsigned int> wOrigin = {0, 0, 0};
258 INFO(
"Invalid argument exception is expected, because split window dimensionality does not match input.");
262 std::vector<unsigned int> wOrigin3 = {0, 0, 15, 0};
265 INFO(
"Invalid argument exception is expected (wOrigin3[2]+ outputHeight > inputHeight");
269 std::vector<unsigned int> wOrigin4 = {0, 0, 0, 0};
273 std::vector<unsigned int> wOrigin5 = {1, 16, 20, 2};
277 INFO(
"Invalid exception due to number of split windows not matching number of outputs.");
282 TEST_CASE(
"ConcatQueueDescriptor_Validate_WrongWindow")
284 constexpr
unsigned int inputNum = 1;
285 constexpr
unsigned int inputChannels = 3;
286 constexpr
unsigned int inputHeight = 32;
287 constexpr
unsigned int inputWidth = 24;
289 constexpr
unsigned int outputNum = 1;
290 constexpr
unsigned int outputChannels = 3;
291 constexpr
unsigned int outputHeight = 32;
292 constexpr
unsigned int outputWidth = 24;
298 unsigned int inputShape[] = {inputNum, inputChannels, inputHeight, inputWidth};
299 unsigned int outputShape[] = {outputNum, outputChannels, outputHeight, outputWidth};
307 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
308 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
311 std::vector<unsigned int> wOrigin = {0, 0, 0};
315 INFO(
"Invalid argument exception is expected, because merge window dimensionality does not match input.");
319 std::vector<unsigned int> wOrigin3 = {0, 0, 15, 0};
322 INFO(
"Invalid argument exception is expected (wOrigin3[2]+ inputHeight > outputHeight");
326 std::vector<unsigned int> wOrigin4 = {0, 0, 0, 0};
330 std::vector<unsigned int> wOrigin5 = {1, 16, 20, 2};
334 INFO(
"Invalid exception due to number of merge windows not matching number of inputs.");
338 TEST_CASE(
"AdditionQueueDescriptor_Validate_InputNumbers")
345 unsigned int shape[] = {1, 1, 1, 1};
355 AddInputToWorkload(invalidData, invalidInfo, input1TensorInfo,
nullptr);
356 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
361 AddInputToWorkload(invalidData, invalidInfo, input2TensorInfo,
nullptr);
366 AddInputToWorkload(invalidData, invalidInfo, input3TensorInfo,
nullptr);
372 TEST_CASE(
"AdditionQueueDescriptor_Validate_InputShapes")
378 unsigned int shape1[] = {1, 1, 2, 1};
379 unsigned int shape2[] = {1, 1, 3, 2};
390 AddInputToWorkload(invalidData, invalidInfo, input1TensorInfo,
nullptr);
391 AddInputToWorkload(invalidData, invalidInfo, input2TensorInfo,
nullptr);
392 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
406 AddInputToWorkload(invalidData, invalidInfo, input1TensorInfo,
nullptr);
407 AddInputToWorkload(invalidData, invalidInfo, input2TensorInfo,
nullptr);
408 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
415 TEST_CASE(
"MultiplicationQueueDescriptor_Validate_InputTensorDimensionMismatch")
421 constexpr
unsigned int input0Shape[] = { 2, 2, 4, 4 };
422 constexpr std::size_t dimensionCount = std::extent<decltype(input0Shape)>::value;
425 for (
unsigned int dimIndex = 0; dimIndex < dimensionCount; ++dimIndex)
427 unsigned int input1Shape[dimensionCount];
428 for (
unsigned int i = 0; i < dimensionCount; ++i)
430 input1Shape[i] = input0Shape[i];
433 ++input1Shape[dimIndex];
442 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
443 AddInputToWorkload(invalidData, invalidInfo, input0TensorInfo,
nullptr);
444 AddInputToWorkload(invalidData, invalidInfo, input1TensorInfo,
nullptr);
450 for (
unsigned int dimIndex = 0; dimIndex < dimensionCount; ++dimIndex)
452 unsigned int outputShape[dimensionCount];
453 for (
unsigned int i = 0; i < dimensionCount; ++i)
455 outputShape[i] = input0Shape[i];
458 ++outputShape[dimIndex];
467 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
468 AddInputToWorkload(invalidData, invalidInfo, input0TensorInfo,
nullptr);
469 AddInputToWorkload(invalidData, invalidInfo, input1TensorInfo,
nullptr);
475 TEST_CASE(
"ReshapeQueueDescriptor_Validate_MismatchingNumElements")
481 unsigned int inputShape[] = { 1, 1, 2, 3 };
482 unsigned int outputShape[] = { 1, 1, 1, 2 };
490 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
491 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
498 TEST_CASE(
"LstmQueueDescriptor_Validate")
505 unsigned int batchSize = 2;
506 unsigned int outputSize = 3;
507 unsigned int inputSize = 5;
508 unsigned numUnits = 4;
510 armnn::TensorInfo inputTensorInfo({batchSize , inputSize}, dataType, qScale, qOffset );
511 armnn::TensorInfo outputStateInTensorInfo({batchSize , outputSize}, dataType, qScale, qOffset);
512 armnn::TensorInfo cellStateInTensorInfo({batchSize , numUnits}, dataType, qScale, qOffset);
515 armnn::TensorInfo scratchBufferTensorInfo({batchSize, numUnits * 4}, dataType, qScale, qOffset);
516 armnn::TensorInfo cellStateOutTensorInfo({batchSize, numUnits}, dataType, qScale, qOffset);
517 armnn::TensorInfo outputStateOutTensorInfo({batchSize, outputSize}, dataType, qScale, qOffset);
518 armnn::TensorInfo outputTensorInfo({batchSize, outputSize}, dataType, qScale, qOffset);
522 armnn::TensorInfo tensorInfo4x5({numUnits, inputSize}, dataType, qScale, qOffset);
523 armnn::TensorInfo tensorInfo4x3({numUnits, outputSize}, dataType, qScale, qOffset);
524 armnn::TensorInfo tensorInfo3x4({outputSize, numUnits}, dataType, qScale, qOffset);
529 AddInputToWorkload(data, info, inputTensorInfo,
nullptr);
530 AddInputToWorkload(data, info, outputStateInTensorInfo,
nullptr);
531 AddInputToWorkload(data, info, cellStateInTensorInfo,
nullptr);
533 AddOutputToWorkload(data, info, scratchBufferTensorInfo,
nullptr);
534 AddOutputToWorkload(data, info, outputStateOutTensorInfo,
nullptr);
535 AddOutputToWorkload(data, info, cellStateOutTensorInfo,
nullptr);
560 data.m_InputToInputWeights = &inputToInputWeightsTensor;
561 data.m_InputToForgetWeights = &inputToForgetWeightsTensor;
562 data.m_InputToCellWeights = &inputToCellWeightsTensor;
563 data.m_InputToOutputWeights = &inputToOutputWeightsTensor;
564 data.m_RecurrentToInputWeights = &recurrentToInputWeightsTensor;
565 data.m_RecurrentToForgetWeights = &recurrentToForgetWeightsTensor;
566 data.m_RecurrentToCellWeights = &recurrentToCellWeightsTensor;
567 data.m_RecurrentToOutputWeights = &recurrentToOutputWeightsTensor;
568 data.m_CellToInputWeights = &cellToInputWeightsTensor;
569 data.m_InputGateBias = &inputGateBiasTensor;
570 data.m_ForgetGateBias = &forgetGateBiasTensor;
571 data.m_CellBias = &cellBiasTensor;
572 data.m_OutputGateBias = &outputGateBiasTensor;
573 data.m_CellToForgetWeights = &cellToForgetWeightsTensor;
574 data.m_CellToOutputWeights = &cellToOutputWeightsTensor;
575 data.m_ProjectionWeights = &projectionWeightsTensor;
576 data.m_ProjectionBias = &projectionBiasTensor;
578 data.m_InputLayerNormWeights = &inputLayerNormWeightsTensor;
579 data.m_ForgetLayerNormWeights = &forgetLayerNormWeightsTensor;
580 data.m_CellLayerNormWeights = &cellLayerNormWeightsTensor;
581 data.m_OutputLayerNormWeights = &outputLayerNormWeightsTensor;
584 data.m_Parameters.m_ActivationFunc = 4;
585 data.m_Parameters.m_CifgEnabled =
false;
586 data.m_Parameters.m_PeepholeEnabled =
true;
587 data.m_Parameters.m_ProjectionEnabled =
true;
588 data.m_Parameters.m_LayerNormEnabled =
true;
592 AddOutputToWorkload(data, info, outputTensorInfo,
nullptr);
595 data.m_Parameters.m_CifgEnabled =
true;
596 armnn::TensorInfo scratchBufferTensorInfo2({batchSize, numUnits * 3}, dataType, qScale, qOffset);
597 SetWorkloadOutput(data, info, 0, scratchBufferTensorInfo2,
nullptr);
599 data.m_Parameters.m_CifgEnabled =
false;
600 SetWorkloadOutput(data, info, 0, scratchBufferTensorInfo,
nullptr);
603 data.m_InputGateBias =
nullptr;
605 data.m_InputGateBias = &inputGateBiasTensor;
608 data.m_Parameters.m_ProjectionEnabled =
false;
610 data.m_Parameters.m_ProjectionEnabled =
true;
611 data.m_ProjectionWeights =
nullptr;
613 data.m_ProjectionWeights = &projectionWeightsTensor;
616 data.m_InputLayerNormWeights =
nullptr;
618 data.m_InputLayerNormWeights = &inputLayerNormWeightsTensor;
621 data.m_Parameters.m_LayerNormEnabled =
false;
623 data.m_Parameters.m_LayerNormEnabled =
true;
626 armnn::TensorInfo incorrectOutputTensorInfo({batchSize, outputSize + 1}, dataType, qScale, qOffset);
627 SetWorkloadOutput(data, info, 3, incorrectOutputTensorInfo,
nullptr);
629 SetWorkloadOutput(data, info, 3, outputTensorInfo,
nullptr);
632 data.m_Parameters.m_ClippingThresCell = -1.0f;
634 data.m_Parameters.m_ClippingThresCell = 0.0f;
637 data.m_Parameters.m_ClippingThresProj = -1.0f;
639 data.m_Parameters.m_ClippingThresProj = 0.0f;
642 CHECK_NOTHROW(data.Validate(info));
645 TEST_CASE(
"BiasPerAxisQuantization_Validate")
647 constexpr
unsigned int nInput = 1u;
648 constexpr
unsigned int cInput = 3u;
649 constexpr
unsigned int hInput = 3u;
650 constexpr
unsigned int wInput = 3u;
652 constexpr
unsigned int nOutput = nInput;
653 constexpr
unsigned int cOutput = cInput;
654 constexpr
unsigned int hOutput = 1u;
655 constexpr
unsigned int wOutput = 1u;
657 const TensorShape inputShape { nInput, cInput, hInput, wInput };
658 const TensorShape outputShape{ nOutput, cOutput, hOutput, wOutput };
659 const TensorShape weightShape{ cOutput, cInput, hInput, wInput };
666 constexpr
float perTensorScale = 1.5f;
667 const TensorInfo inputInfo (inputShape, inputType, perTensorScale);
668 const TensorInfo outputInfo(outputShape, inputType, perTensorScale);
670 const std::vector<float> weightPerAxisScales = { 2.50f, 3.50f };
671 const TensorInfo weightInfo(weightShape, weightType, weightPerAxisScales, 0);
677 AddInputToWorkload(queueDescriptor, workloadInfo, inputInfo,
nullptr);
678 AddOutputToWorkload(queueDescriptor, workloadInfo, outputInfo,
nullptr);
681 queueDescriptor.
m_Weight = &weightTensor;
684 const std::vector<float> biasPerAxisScales1 = { 3.75f, 5.25f };
685 const TensorInfo biasInfo1(biasShape, biasType, biasPerAxisScales1, 0);
688 queueDescriptor.
m_Bias = &biasHandle1;
690 CHECK_NOTHROW(queueDescriptor.
Validate(workloadInfo));
693 const std::vector<float> biasPerAxisScales2 = { 4.00f, 5.00f };
694 const TensorInfo biasInfo2(biasShape, biasType, biasPerAxisScales2, 0);
697 queueDescriptor.
m_Bias = &biasHandle2;
699 CHECK_NOTHROW(queueDescriptor.
Validate(workloadInfo));
702 const std::vector<float> biasPerAxisScales3 = { 3.75f, 5.25f, 5.25f };
703 const TensorInfo biasInfo3(biasShape, biasType, biasPerAxisScales3, 0);
706 queueDescriptor.
m_Bias = &biasHandle3;
TEST_SUITE("TestConstTensorLayerVisitor")
bool m_BiasEnabled
Enable/disable bias.
float m_K
Kappa value used for the across channel normalization equation.
std::unique_ptr< armnn::IWorkload > CreateWorkload(const armnn::IWorkloadFactory &workloadFactory, const armnn::WorkloadInfo &info, const DescriptorType &descriptor)
bool m_TransposeWeightMatrix
Enable/disable transpose weight matrix.
float m_Alpha
Alpha value for the normalization equation.
const ConstTensorHandle * m_Variance
NormalizationAlgorithmChannel
const ConstTensorHandle * m_Weight
const ConstTensorHandle * m_Bias
Copyright (c) 2021 ARM Limited and Contributors.
const ConstTensorHandle * m_Bias
LayerDescriptor m_Parameters
NormalizationAlgorithmMethod m_NormMethodType
Normalization method algorithm to use (LocalBrightness, LocalContrast).
std::vector< ViewOrigin > m_ViewOrigins
bool m_BiasEnabled
Enable/disable bias.
void Validate(const WorkloadInfo &workloadInfo) const
const ConstTensorHandle * m_Weight
std::vector< ViewOrigin > m_ViewOrigins
NormalizationAlgorithmChannel m_NormChannelType
Normalization channel algorithm to use (Across, Within).
const ConstTensorHandle * m_Gamma
Contains information about TensorInfos of a layer.
Krichevsky 2012: Local Brightness Normalization.
const ConstTensorHandle * m_Mean
NormalizationAlgorithmMethod
const ConstTensorHandle * m_Beta
float m_Beta
Beta value for the normalization equation.
uint32_t m_NormSize
Depth radius value.