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")
56 TEST_CASE(
"RefPooling2dFloat32Workload_Validate_WrongDimTensor")
61 unsigned int inputShape[] = {2, 3, 4};
62 unsigned int outputShape[] = {2, 3, 4, 5};
70 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
71 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
77 TEST_CASE(
"SoftmaxQueueDescriptor_Validate_WrongInputHeight")
79 unsigned int inputHeight = 1;
80 unsigned int inputWidth = 1;
81 unsigned int inputChannels = 4;
82 unsigned int inputNum = 2;
84 unsigned int outputChannels = inputChannels;
85 unsigned int outputHeight = inputHeight + 1;
86 unsigned int outputWidth = inputWidth;
87 unsigned int outputNum = inputNum;
92 unsigned int inputShape[] = { inputNum, inputChannels, inputHeight, inputWidth };
93 unsigned int outputShape[] = { outputNum, outputChannels, outputHeight, outputWidth };
101 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
102 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
108 TEST_CASE(
"FullyConnectedQueueDescriptor_Validate_RequiredDataMissing")
110 unsigned int inputWidth = 1;
111 unsigned int inputHeight = 1;
112 unsigned int inputChannels = 5;
113 unsigned int inputNum = 2;
115 unsigned int outputWidth = 1;
116 unsigned int outputHeight = 1;
117 unsigned int outputChannels = 3;
118 unsigned int outputNum = 2;
126 unsigned int inputShape[] = { inputNum, inputChannels, inputHeight, inputWidth };
127 unsigned int outputShape[] = { outputNum, outputChannels, outputHeight, outputWidth };
128 unsigned int weightsShape[] = { 1, 1, inputChannels, outputChannels };
129 unsigned int biasShape[] = { 1, outputChannels, outputHeight, outputWidth };
142 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
143 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
144 invalidData.
m_Weight = &weightTensor;
145 invalidData.
m_Bias = &biasTensor;
156 TEST_CASE(
"NormalizationQueueDescriptor_Validate_WrongInputHeight")
158 constexpr
unsigned int inputNum = 5;
159 constexpr
unsigned int inputHeight = 32;
160 constexpr
unsigned int inputWidth = 24;
161 constexpr
unsigned int inputChannels = 3;
163 constexpr
unsigned int outputNum = inputNum;
164 constexpr
unsigned int outputChannels = inputChannels;
165 constexpr
unsigned int outputHeight = inputHeight + 1;
167 constexpr
unsigned int outputWidth = inputWidth;
173 unsigned int inputShape[] = {inputNum, inputChannels, inputHeight, inputWidth};
174 unsigned int outputShape[] = {outputNum, outputChannels, outputHeight, outputWidth};
185 uint32_t normSize = 5;
190 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
191 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
203 TEST_CASE(
"SplitterQueueDescriptor_Validate_WrongWindow")
205 constexpr
unsigned int inputNum = 1;
206 constexpr
unsigned int inputHeight = 32;
207 constexpr
unsigned int inputWidth = 24;
208 constexpr
unsigned int inputChannels = 3;
210 constexpr
unsigned int outputNum = inputNum;
211 constexpr
unsigned int outputChannels = inputChannels;
212 constexpr
unsigned int outputHeight = 18;
213 constexpr
unsigned int outputWidth = inputWidth;
219 unsigned int inputShape[] = {inputNum, inputChannels, inputHeight, inputWidth};
220 unsigned int outputShape[] = {outputNum, outputChannels, outputHeight, outputWidth};
228 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
229 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
232 std::vector<unsigned int> wOrigin = {0, 0, 0};
236 INFO(
"Invalid argument exception is expected, because split window dimensionality does not match input.");
240 std::vector<unsigned int> wOrigin3 = {0, 0, 15, 0};
243 INFO(
"Invalid argument exception is expected (wOrigin3[2]+ outputHeight > inputHeight");
247 std::vector<unsigned int> wOrigin4 = {0, 0, 0, 0};
251 std::vector<unsigned int> wOrigin5 = {1, 16, 20, 2};
255 INFO(
"Invalid exception due to number of split windows not matching number of outputs.");
260 TEST_CASE(
"ConcatQueueDescriptor_Validate_WrongWindow")
262 constexpr
unsigned int inputNum = 1;
263 constexpr
unsigned int inputChannels = 3;
264 constexpr
unsigned int inputHeight = 32;
265 constexpr
unsigned int inputWidth = 24;
267 constexpr
unsigned int outputNum = 1;
268 constexpr
unsigned int outputChannels = 3;
269 constexpr
unsigned int outputHeight = 32;
270 constexpr
unsigned int outputWidth = 24;
276 unsigned int inputShape[] = {inputNum, inputChannels, inputHeight, inputWidth};
277 unsigned int outputShape[] = {outputNum, outputChannels, outputHeight, outputWidth};
285 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
286 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
289 std::vector<unsigned int> wOrigin = {0, 0, 0};
293 INFO(
"Invalid argument exception is expected, because merge window dimensionality does not match input.");
297 std::vector<unsigned int> wOrigin3 = {0, 0, 15, 0};
300 INFO(
"Invalid argument exception is expected (wOrigin3[2]+ inputHeight > outputHeight");
304 std::vector<unsigned int> wOrigin4 = {0, 0, 0, 0};
308 std::vector<unsigned int> wOrigin5 = {1, 16, 20, 2};
312 INFO(
"Invalid exception due to number of merge windows not matching number of inputs.");
316 TEST_CASE(
"AdditionQueueDescriptor_Validate_InputNumbers")
323 unsigned int shape[] = {1, 1, 1, 1};
333 AddInputToWorkload(invalidData, invalidInfo, input1TensorInfo,
nullptr);
334 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
339 AddInputToWorkload(invalidData, invalidInfo, input2TensorInfo,
nullptr);
344 AddInputToWorkload(invalidData, invalidInfo, input3TensorInfo,
nullptr);
350 TEST_CASE(
"AdditionQueueDescriptor_Validate_InputShapes")
356 unsigned int shape1[] = {1, 1, 2, 1};
357 unsigned int shape2[] = {1, 1, 3, 2};
368 AddInputToWorkload(invalidData, invalidInfo, input1TensorInfo,
nullptr);
369 AddInputToWorkload(invalidData, invalidInfo, input2TensorInfo,
nullptr);
370 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
384 AddInputToWorkload(invalidData, invalidInfo, input1TensorInfo,
nullptr);
385 AddInputToWorkload(invalidData, invalidInfo, input2TensorInfo,
nullptr);
386 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
393 TEST_CASE(
"MultiplicationQueueDescriptor_Validate_InputTensorDimensionMismatch")
399 constexpr
unsigned int input0Shape[] = { 2, 2, 4, 4 };
400 constexpr std::size_t dimensionCount = std::extent<decltype(input0Shape)>::value;
403 for (
unsigned int dimIndex = 0; dimIndex < dimensionCount; ++dimIndex)
405 unsigned int input1Shape[dimensionCount];
406 for (
unsigned int i = 0; i < dimensionCount; ++i)
408 input1Shape[i] = input0Shape[i];
411 ++input1Shape[dimIndex];
420 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
421 AddInputToWorkload(invalidData, invalidInfo, input0TensorInfo,
nullptr);
422 AddInputToWorkload(invalidData, invalidInfo, input1TensorInfo,
nullptr);
428 for (
unsigned int dimIndex = 0; dimIndex < dimensionCount; ++dimIndex)
430 unsigned int outputShape[dimensionCount];
431 for (
unsigned int i = 0; i < dimensionCount; ++i)
433 outputShape[i] = input0Shape[i];
436 ++outputShape[dimIndex];
445 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
446 AddInputToWorkload(invalidData, invalidInfo, input0TensorInfo,
nullptr);
447 AddInputToWorkload(invalidData, invalidInfo, input1TensorInfo,
nullptr);
453 TEST_CASE(
"ReshapeQueueDescriptor_Validate_MismatchingNumElements")
459 unsigned int inputShape[] = { 1, 1, 2, 3 };
460 unsigned int outputShape[] = { 1, 1, 1, 2 };
468 AddInputToWorkload(invalidData, invalidInfo, inputTensorInfo,
nullptr);
469 AddOutputToWorkload(invalidData, invalidInfo, outputTensorInfo,
nullptr);
476 TEST_CASE(
"LstmQueueDescriptor_Validate")
483 unsigned int batchSize = 2;
484 unsigned int outputSize = 3;
485 unsigned int inputSize = 5;
486 unsigned numUnits = 4;
488 armnn::TensorInfo inputTensorInfo({batchSize , inputSize}, dataType, qScale, qOffset );
489 armnn::TensorInfo outputStateInTensorInfo({batchSize , outputSize}, dataType, qScale, qOffset);
490 armnn::TensorInfo cellStateInTensorInfo({batchSize , numUnits}, dataType, qScale, qOffset);
493 armnn::TensorInfo scratchBufferTensorInfo({batchSize, numUnits * 4}, dataType, qScale, qOffset);
494 armnn::TensorInfo cellStateOutTensorInfo({batchSize, numUnits}, dataType, qScale, qOffset);
495 armnn::TensorInfo outputStateOutTensorInfo({batchSize, outputSize}, dataType, qScale, qOffset);
496 armnn::TensorInfo outputTensorInfo({batchSize, outputSize}, dataType, qScale, qOffset);
500 armnn::TensorInfo tensorInfo4x5({numUnits, inputSize}, dataType, qScale, qOffset);
501 armnn::TensorInfo tensorInfo4x3({numUnits, outputSize}, dataType, qScale, qOffset);
502 armnn::TensorInfo tensorInfo3x4({outputSize, numUnits}, dataType, qScale, qOffset);
507 AddInputToWorkload(data, info, inputTensorInfo,
nullptr);
508 AddInputToWorkload(data, info, outputStateInTensorInfo,
nullptr);
509 AddInputToWorkload(data, info, cellStateInTensorInfo,
nullptr);
511 AddOutputToWorkload(data, info, scratchBufferTensorInfo,
nullptr);
512 AddOutputToWorkload(data, info, outputStateOutTensorInfo,
nullptr);
513 AddOutputToWorkload(data, info, cellStateOutTensorInfo,
nullptr);
538 data.m_InputToInputWeights = &inputToInputWeightsTensor;
539 data.m_InputToForgetWeights = &inputToForgetWeightsTensor;
540 data.m_InputToCellWeights = &inputToCellWeightsTensor;
541 data.m_InputToOutputWeights = &inputToOutputWeightsTensor;
542 data.m_RecurrentToInputWeights = &recurrentToInputWeightsTensor;
543 data.m_RecurrentToForgetWeights = &recurrentToForgetWeightsTensor;
544 data.m_RecurrentToCellWeights = &recurrentToCellWeightsTensor;
545 data.m_RecurrentToOutputWeights = &recurrentToOutputWeightsTensor;
546 data.m_CellToInputWeights = &cellToInputWeightsTensor;
547 data.m_InputGateBias = &inputGateBiasTensor;
548 data.m_ForgetGateBias = &forgetGateBiasTensor;
549 data.m_CellBias = &cellBiasTensor;
550 data.m_OutputGateBias = &outputGateBiasTensor;
551 data.m_CellToForgetWeights = &cellToForgetWeightsTensor;
552 data.m_CellToOutputWeights = &cellToOutputWeightsTensor;
553 data.m_ProjectionWeights = &projectionWeightsTensor;
554 data.m_ProjectionBias = &projectionBiasTensor;
556 data.m_InputLayerNormWeights = &inputLayerNormWeightsTensor;
557 data.m_ForgetLayerNormWeights = &forgetLayerNormWeightsTensor;
558 data.m_CellLayerNormWeights = &cellLayerNormWeightsTensor;
559 data.m_OutputLayerNormWeights = &outputLayerNormWeightsTensor;
562 data.m_Parameters.m_ActivationFunc = 4;
563 data.m_Parameters.m_CifgEnabled =
false;
564 data.m_Parameters.m_PeepholeEnabled =
true;
565 data.m_Parameters.m_ProjectionEnabled =
true;
566 data.m_Parameters.m_LayerNormEnabled =
true;
570 AddOutputToWorkload(data, info, outputTensorInfo,
nullptr);
573 data.m_Parameters.m_CifgEnabled =
true;
574 armnn::TensorInfo scratchBufferTensorInfo2({batchSize, numUnits * 3}, dataType, qScale, qOffset);
575 SetWorkloadOutput(data, info, 0, scratchBufferTensorInfo2,
nullptr);
577 data.m_Parameters.m_CifgEnabled =
false;
578 SetWorkloadOutput(data, info, 0, scratchBufferTensorInfo,
nullptr);
581 data.m_InputGateBias =
nullptr;
583 data.m_InputGateBias = &inputGateBiasTensor;
586 data.m_Parameters.m_ProjectionEnabled =
false;
588 data.m_Parameters.m_ProjectionEnabled =
true;
589 data.m_ProjectionWeights =
nullptr;
591 data.m_ProjectionWeights = &projectionWeightsTensor;
594 data.m_InputLayerNormWeights =
nullptr;
596 data.m_InputLayerNormWeights = &inputLayerNormWeightsTensor;
599 data.m_Parameters.m_LayerNormEnabled =
false;
601 data.m_Parameters.m_LayerNormEnabled =
true;
604 armnn::TensorInfo incorrectOutputTensorInfo({batchSize, outputSize + 1}, dataType, qScale, qOffset);
605 SetWorkloadOutput(data, info, 3, incorrectOutputTensorInfo,
nullptr);
607 SetWorkloadOutput(data, info, 3, outputTensorInfo,
nullptr);
610 data.m_Parameters.m_ClippingThresCell = -1.0f;
612 data.m_Parameters.m_ClippingThresCell = 0.0f;
615 data.m_Parameters.m_ClippingThresProj = -1.0f;
617 data.m_Parameters.m_ClippingThresProj = 0.0f;
620 CHECK_NOTHROW(data.Validate(info));
623 TEST_CASE(
"BiasPerAxisQuantization_Validate")
625 constexpr
unsigned int nInput = 1u;
626 constexpr
unsigned int cInput = 3u;
627 constexpr
unsigned int hInput = 3u;
628 constexpr
unsigned int wInput = 3u;
630 constexpr
unsigned int nOutput = nInput;
631 constexpr
unsigned int cOutput = cInput;
632 constexpr
unsigned int hOutput = 1u;
633 constexpr
unsigned int wOutput = 1u;
635 const TensorShape inputShape { nInput, cInput, hInput, wInput };
636 const TensorShape outputShape{ nOutput, cOutput, hOutput, wOutput };
637 const TensorShape weightShape{ cOutput, cInput, hInput, wInput };
644 constexpr
float perTensorScale = 1.5f;
645 const TensorInfo inputInfo (inputShape, inputType, perTensorScale);
646 const TensorInfo outputInfo(outputShape, inputType, perTensorScale);
648 const std::vector<float> weightPerAxisScales = { 2.50f, 3.50f };
649 const TensorInfo weightInfo(weightShape, weightType, weightPerAxisScales, 0);
655 AddInputToWorkload(queueDescriptor, workloadInfo, inputInfo,
nullptr);
656 AddOutputToWorkload(queueDescriptor, workloadInfo, outputInfo,
nullptr);
659 queueDescriptor.
m_Weight = &weightTensor;
662 const std::vector<float> biasPerAxisScales1 = { 3.75f, 5.25f };
663 const TensorInfo biasInfo1(biasShape, biasType, biasPerAxisScales1, 0);
666 queueDescriptor.
m_Bias = &biasHandle1;
668 CHECK_NOTHROW(queueDescriptor.
Validate(workloadInfo));
671 const std::vector<float> biasPerAxisScales2 = { 4.00f, 5.00f };
672 const TensorInfo biasInfo2(biasShape, biasType, biasPerAxisScales2, 0);
675 queueDescriptor.
m_Bias = &biasHandle2;
677 CHECK_NOTHROW(queueDescriptor.
Validate(workloadInfo));
680 const std::vector<float> biasPerAxisScales3 = { 3.75f, 5.25f, 5.25f };
681 const TensorInfo biasInfo3(biasShape, biasType, biasPerAxisScales3, 0);
684 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.
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.