19 using namespace armnn;
27 const std::vector<TensorInfo> & inputTensorInfos,
28 unsigned int concatDim)
30 std::vector<TensorShape> shapes;
31 shapes.reserve(inputTensorInfos.size());
34 shapes.push_back(it.GetShape());
47 const std::vector<TensorInfo> & inputTensorInfos,
48 unsigned int concatDim)
52 unsigned int nDimensions = 0;
56 for (
auto && tensorInfo : inputTensorInfos)
60 nDimensions = tensorInfo.GetShape().GetNumDimensions();
65 "Input shapes must have the same number of dimensions");
69 return (nDimensions < 3 || (nDimensions == 3 && (nDimensions-concatDim) < 3 && (nDimensions-concatDim) != 1));
81 std::vector<unsigned int> newDims(
size_t(3), 1u);
82 unsigned int expandedBy = 3 - numDims;
83 for (
unsigned int i=0; i<numDims; ++i)
85 newDims[expandedBy+i] = inputShape[i];
91 unsigned int numDimensions,
92 unsigned int & concatDim,
93 std::pair<PermutationVector, PermutationVector> & permutations)
96 "Only dimensions 1,2 and 3 are supported by this helper");
97 unsigned int expandedBy = 3 - numDimensions;
98 unsigned int expandedConcatAxis = concatDim + expandedBy;
100 if (expandedConcatAxis == 2)
105 permutations = std::make_pair(forwardPermutation, reversePermutation);
107 else if (expandedConcatAxis == 1)
112 permutations = std::make_pair(forwardPermutation, reversePermutation);
128 std::vector<T>& outputData)
132 if (inputData ==
nullptr)
141 std::unique_ptr<ITensorHandle> inputHandle = tensorHandleFactory.
CreateTensorHandle(inputTensorInfo);
142 std::unique_ptr<ITensorHandle> outputHandle = tensorHandleFactory.
CreateTensorHandle(outputTensorInfo);
147 AddInputToWorkload(queueDescriptor, workloadInfo, inputTensorInfo, inputHandle.get());
148 AddOutputToWorkload(queueDescriptor, workloadInfo, outputTensorInfo, outputHandle.get());
154 inputHandle->Allocate();
155 outputHandle->Allocate();
159 workload->PostAllocationConfigure();
164 inputTensorInfo = outputTensorInfo;
177 std::vector<TensorInfo> & inputTensorInfos,
178 std::vector<T *> & inputData,
179 std::vector<std::vector<T>> & inputDataStorage,
181 unsigned int & concatDim,
186 "Expecting more than one tensor to be concatenated here");
188 unsigned int numDims = 0;
189 unsigned int nthInput = 0;
192 std::pair<PermutationVector, PermutationVector> permutations =
193 std::make_pair(identity, identity);
195 inputDataStorage.resize(inputData.size());
197 for (
auto && tensorInfo : inputTensorInfos)
201 numDims = tensorInfo.GetShape().GetNumDimensions();
205 permuteVector = permutations.second;
207 "Test logic error, we don't need permutation, so we shouldn't arrive here");
212 "All inputs must have the same number of dimensions");
218 PermuteTensorData<T>(workloadFactory,
224 inputDataStorage[nthInput]);
226 inputData[nthInput] = inputDataStorage[nthInput].data();
227 inputTensorInfos[nthInput] = newTensorInfo;
235 permutations.first));
249 std::unique_ptr<ITensorHandle> && inputDataHandle,
263 std::vector<T> outputData;
267 PermuteTensorData<T>(workloadFactory,
275 ::memcpy(data, &outputData[0],
sizeof(T)*outputData.size());
282 std::initializer_list<const TensorInfo> inputTensorInfosOrig,
283 std::initializer_list<T *> inputsOrig,
286 unsigned int concatDim,
290 if (output ==
nullptr)
299 std::vector<TensorInfo> inputTensorInfos(inputTensorInfosOrig.begin(), inputTensorInfosOrig.end());
300 std::vector<T *> inputs = inputsOrig;
301 TensorInfo outputTensorInfo = outputTensorInfoOrig;
306 std::vector<std::vector<T>> tmpInputDataStorage;
308 const size_t inputCount = inputTensorInfos.size();
312 if (needPermuteForConcat)
318 PermuteInputsForConcat<T>(workloadFactory,
331 std::vector<std::unique_ptr<ITensorHandle>> inputHandles;
332 inputHandles.reserve(inputCount);
334 std::unique_ptr<ITensorHandle> outputHandle = tensorHandleFactory.
CreateTensorHandle(outputTensorInfo);
343 for (
unsigned int i = 0; i < viewsDescriptor.
GetNumViews(); ++i)
352 for (
unsigned int i = 0; i < inputCount; ++i)
354 const TensorInfo& inputTensorInfo = inputTensorInfos[i];
356 std::unique_ptr<ITensorHandle> inputHandle =
357 subTensorsSupported ?
363 inputHandles.emplace_back(std::move(inputHandle));
370 for (
unsigned int i = 0; i < inputCount; ++i)
372 std::unique_ptr<ITensorHandle> inputHandle = tensorHandleFactory.
CreateTensorHandle(inputTensorInfos[i]);
373 inputHandles.emplace_back(std::move(inputHandle));
377 for (
unsigned int i = 0; i < inputCount; ++i)
379 AddInputToWorkload(queueDescriptor, workloadInfo, inputTensorInfos[i], inputHandles[i].
get());
382 AddOutputToWorkload(queueDescriptor, workloadInfo, outputTensorInfo, outputHandle.get());
384 std::unique_ptr<IWorkload> workload
387 for (
auto& inputHandle : inputHandles)
389 inputHandle->Allocate();
392 outputHandle->Allocate();
394 unsigned int nextInputId = 0;
395 for (
auto& inputHandle : inputHandles)
401 workload->PostAllocationConfigure();
404 if (needPermuteForConcat)
406 PermuteOutputForConcat<T>(workloadFactory,
411 std::move(outputHandle),
424 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
432 TensorInfo inputTensorInfo({ 3 }, ArmnnType, qScale, qOffset);
434 auto input0 = QuantizedVector<T>({ 1.0f, 2.0f, 3.0f }, qScale, qOffset);
435 auto input1 = QuantizedVector<T>({ 4.0f, 5.0f, 6.0f }, qScale, qOffset);
436 auto input2 = QuantizedVector<T>({ 7.0f, 8.0f, 9.0f }, qScale, qOffset);
438 TensorInfo outputTensorInfo({ 9 }, ArmnnType, qScale, qOffset);
442 std::vector<T> output;
443 output.resize(outputTensorInfo.GetNumElements());
444 Concatenate<T>(workloadFactory, memoryManager, tensorHandleFactory,
445 { inputTensorInfo, inputTensorInfo, inputTensorInfo },
446 { input0.data(), input1.data(), input2.data() },
452 result.m_ActualData = output;
453 result.m_ExpectedData = QuantizedVector<T>(
455 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f
462 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
468 unsigned int dimension,
470 const int32_t qOffset)
472 TensorInfo inputTensorInfo({ 2, 3 }, ArmnnType, qScale, qOffset);
474 auto input0 = QuantizedVector<T>(
484 auto input1 = QuantizedVector<T>(
494 auto input2 = QuantizedVector<T>(
506 std::vector<T> output;
508 Concatenate<T>(workloadFactory, memoryManager, tensorHandleFactory,
509 { inputTensorInfo, inputTensorInfo, inputTensorInfo },
510 { input0.data(), input1.data(), input2.data() },
516 result.m_ActualData = output;
520 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
528 TensorInfo outputTensorInfo({ 6, 3 }, ArmnnType, qScale, qOffset);
531 workloadFactory, memoryManager, tensorHandleFactory, outputTensorInfo, 0, qScale, qOffset);
558 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
566 TensorInfo outputTensorInfo({ 2, 9 }, ArmnnType, qScale, qOffset);
569 workloadFactory, memoryManager, tensorHandleFactory, outputTensorInfo, 1, qScale, qOffset);
574 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f,
577 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f
584 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
592 TensorInfo input0TensorInfo({ 2, 3 }, ArmnnType, qScale, qOffset);
593 auto input0 = QuantizedVector<T>(
603 TensorInfo input1TensorInfo({ 3, 3 }, ArmnnType, qScale, qOffset);
604 auto input1 = QuantizedVector<T>(
617 TensorInfo input2TensorInfo({ 1, 3 }, ArmnnType, qScale, qOffset);
618 auto input2 = QuantizedVector<T>(
625 TensorInfo outputTensorInfo({ 6, 3 }, ArmnnType, qScale, qOffset);
628 std::vector<T> output;
629 output.resize(outputTensorInfo.GetNumElements());
630 Concatenate<T>(workloadFactory, memoryManager, tensorHandleFactory,
631 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
632 { input0.data(), input1.data(), input2.data() },
638 result.m_ActualData = output;
639 result.m_ExpectedData = QuantizedVector<T>(
664 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
672 TensorInfo input0TensorInfo({ 2, 3 }, ArmnnType, qScale, qOffset);
673 auto input0 = QuantizedVector<T>(
683 TensorInfo input1TensorInfo({ 2, 5 }, ArmnnType, qScale, qOffset);
684 auto input1 = QuantizedVector<T>(
687 4.0f, 5.0f, 6.0f, 7.0f, 8.0f,
690 13.0f, 14.0f, 15.0f, 16.0f, 17.0f,
694 TensorInfo input2TensorInfo({ 2, 1 }, ArmnnType, qScale, qOffset);
695 auto input2 = QuantizedVector<T>(
705 TensorInfo outputTensorInfo({ 2, 9 }, ArmnnType, qScale, qOffset);
708 std::vector<T> output;
709 output.resize(outputTensorInfo.GetNumElements());
710 Concatenate<T>(workloadFactory, memoryManager, tensorHandleFactory,
711 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
712 { input0.data(), input1.data(), input2.data() },
718 result.m_ActualData = output;
719 result.m_ExpectedData = QuantizedVector<T>(
722 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f,
725 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f,
732 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
738 unsigned int dimension,
743 TensorInfo inputTensorInfo({ 2, 3, 2 }, ArmnnType, qScale, qOffset);
745 auto input0 = QuantizedVector<T>(
767 auto input1 = QuantizedVector<T>(
789 auto input2 = QuantizedVector<T>(
813 std::vector<T> output;
815 Concatenate<T>(workloadFactory, memoryManager, tensorHandleFactory,
816 { inputTensorInfo, inputTensorInfo, inputTensorInfo },
817 { input0.data(), input1.data(), input2.data() },
823 result.m_ActualData = output;
827 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
835 TensorInfo outputTensorInfo({ 6, 3, 2 }, ArmnnType, qScale, qOffset);
838 workloadFactory, memoryManager, tensorHandleFactory, outputTensorInfo, 0,
true, qScale, qOffset);
901 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
909 TensorInfo outputTensorInfo({ 2, 9, 2 }, ArmnnType, qScale, qOffset);
912 workloadFactory, memoryManager, tensorHandleFactory, outputTensorInfo, 1,
true, qScale, qOffset);
975 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
984 TensorInfo outputTensorInfo({ 2, 3, 6 }, ArmnnType, qScale, qOffset);
987 workloadFactory, memoryManager, tensorHandleFactory, outputTensorInfo, 2, useSubtensor, qScale, qOffset);
992 1.0f, 2.0f, 7.0f, 8.0f, 13.0f, 14.0f,
995 3.0f, 4.0f, 9.0f, 10.0f, 15.0f, 16.0f,
998 5.0f, 6.0f, 11.0f, 12.0f, 17.0f, 18.0f,
1001 19.0f, 20.0f, 25.0f, 26.0f, 31.0f, 32.0f,
1004 21.0f, 22.0f, 27.0f, 28.0f, 33.0f, 34.0f,
1007 23.0f, 24.0f, 29.0f, 30.0f, 35.0f, 36.0f,
1014 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
1022 TensorInfo input0TensorInfo({ 2, 3, 2 }, ArmnnType);
1023 auto input0 = QuantizedVector<T>(
1045 TensorInfo input1TensorInfo({ 1, 3, 2 }, ArmnnType);
1046 auto input1 = QuantizedVector<T>(
1059 TensorInfo input2TensorInfo({ 3, 3, 2 }, ArmnnType);
1060 auto input2 = QuantizedVector<T>(
1091 TensorInfo outputTensorInfo({ 6, 3, 2 }, ArmnnType);
1094 std::vector<T> output;
1095 output.resize(outputTensorInfo.GetNumElements());
1096 Concatenate<T>(workloadFactory, memoryManager, tensorHandleFactory,
1097 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
1098 { input0.data(), input1.data(), input2.data() },
1104 result.m_ActualData = output;
1105 result.m_ExpectedData = QuantizedVector<T>(
1166 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
1174 TensorInfo input0TensorInfo({ 2, 3, 2 }, ArmnnType, qScale, qOffset);
1175 auto input0 = QuantizedVector<T>(
1197 TensorInfo input1TensorInfo({ 2, 4, 2 }, ArmnnType, qScale, qOffset);
1198 auto input1 = QuantizedVector<T>(
1226 TensorInfo input2TensorInfo({ 2, 1, 2 }, ArmnnType, qScale, qOffset);
1227 auto input2 = QuantizedVector<T>(
1237 TensorInfo outputTensorInfo({ 2, 8, 2 }, ArmnnType, qScale, qOffset);
1240 std::vector<T> output;
1241 output.resize(outputTensorInfo.GetNumElements());
1242 Concatenate<T>(workloadFactory, memoryManager, tensorHandleFactory,
1243 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
1244 { input0.data(), input1.data(), input2.data() },
1250 result.m_ActualData = output;
1251 result.m_ExpectedData = QuantizedVector<T>(
1306 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
1315 TensorInfo input0TensorInfo({ 2, 3, 2 }, ArmnnType, qScale, qOffset);
1316 auto input0 = QuantizedVector<T>(
1338 TensorInfo input1TensorInfo({ 2, 3, 1 }, ArmnnType, qScale, qOffset);
1339 auto input1 = QuantizedVector<T>(
1361 TensorInfo input2TensorInfo({ 2, 3, 3 }, ArmnnType, qScale, qOffset);
1362 auto input2 = QuantizedVector<T>(
1365 13.0f, 14.0f, 50.0f,
1368 15.0f, 16.0f, 51.0f,
1371 17.0f, 18.0f, 52.0f,
1374 31.0f, 32.0f, 53.0f,
1377 33.0f, 34.0f, 54.0f,
1380 35.0f, 36.0f, 55.0f,
1384 TensorInfo outputTensorInfo({ 2, 3, 6 }, ArmnnType, qScale, qOffset);
1387 std::vector<T> output;
1388 output.resize(outputTensorInfo.GetNumElements());
1389 Concatenate<T>(workloadFactory, memoryManager, tensorHandleFactory,
1390 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
1391 { input0.data(), input1.data(), input2.data() },
1397 result.m_ActualData = output;
1398 result.m_ExpectedData = QuantizedVector<T>(
1401 1.0f, 2.0f, 7.0f, 13.0f, 14.0f, 50.0f,
1404 3.0f, 4.0f, 9.0f, 15.0f, 16.0f, 51.0f,
1407 5.0f, 6.0f, 11.0f, 17.0f, 18.0f, 52.0f,
1410 19.0f, 20.0f, 25.0f, 31.0f, 32.0f, 53.0f,
1413 21.0f, 22.0f, 27.0f, 33.0f, 34.0f, 54.0f,
1416 23.0f, 24.0f, 29.0f, 35.0f, 36.0f, 55.0f,
1423 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
1429 unsigned int dimension,
1434 TensorInfo inputTensorInfo({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
1436 auto input0 = QuantizedVector<T>(
1447 auto input1 = QuantizedVector<T>(
1458 auto input2 = QuantizedVector<T>(
1471 std::vector<T> output;
1474 Concatenate<T>(workloadFactory,
1476 tensorHandleFactory,
1477 {inputTensorInfo, inputTensorInfo, inputTensorInfo},
1478 {input0.data(), input1.data(), input2.data()},
1484 result.m_ActualData = output;
1488 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
1496 TensorInfo outputTensorInfo({ 3, 3, 2, 2 }, ArmnnType, qScale, qOffset);
1499 workloadFactory, memoryManager, tensorHandleFactory, outputTensorInfo, 0,
true, qScale, qOffset);
1529 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
1537 TensorInfo outputTensorInfo({ 1, 9, 2, 2 }, ArmnnType, qScale, qOffset);
1540 workloadFactory, memoryManager, tensorHandleFactory, outputTensorInfo, 1,
true, qScale, qOffset);
1570 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
1578 TensorInfo outputTensorInfo({ 1, 3, 6, 2 }, ArmnnType, qScale, qOffset);
1581 workloadFactory, memoryManager, tensorHandleFactory, outputTensorInfo, 2,
true, qScale, qOffset);
1611 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
1620 TensorInfo outputTensorInfo({ 1, 3, 2, 6 }, ArmnnType, qScale, qOffset);
1623 workloadFactory, memoryManager, tensorHandleFactory, outputTensorInfo, 3, useSubtensor, qScale, qOffset);
1653 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
1661 constexpr
unsigned int dimension = 0u;
1663 TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
1664 auto input0 = QuantizedVector<T>(
1675 TensorInfo inputTensorInfo1({ 2, 3, 2, 2 }, ArmnnType, qScale, qOffset);
1677 auto input1 = QuantizedVector<T>(
1695 TensorInfo outputTensorInfo({ 3, 3, 2, 2 }, ArmnnType, qScale, qOffset);
1699 std::vector<T> output;
1700 output.resize(outputTensorInfo.GetNumElements());
1701 Concatenate<T>(workloadFactory,
1703 tensorHandleFactory,
1704 {inputTensorInfo0, inputTensorInfo1},
1705 {input0.data(), input1.data()},
1711 result.m_ActualData = output;
1712 result.m_ExpectedData = QuantizedVector<T>(
1740 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
1748 constexpr
unsigned int dimension = 1u;
1750 TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
1751 auto input0 = QuantizedVector<T>(
1762 TensorInfo inputTensorInfo1({ 1, 2, 2, 2 }, ArmnnType, qScale, qOffset);
1764 auto input1 = QuantizedVector<T>(
1773 TensorInfo outputTensorInfo({ 1, 5, 2, 2 }, ArmnnType, qScale, qOffset);
1777 std::vector<T> output;
1778 output.resize(outputTensorInfo.GetNumElements());
1779 Concatenate<T>(workloadFactory,
1781 tensorHandleFactory,
1782 {inputTensorInfo0, inputTensorInfo1},
1783 {input0.data(), input1.data()},
1789 result.m_ActualData = output;
1790 result.m_ExpectedData = QuantizedVector<T>(
1808 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
1816 constexpr
unsigned int dimension = 2u;
1818 TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
1819 auto input0 = QuantizedVector<T>(
1830 TensorInfo inputTensorInfo1({ 1, 3, 3, 2 }, ArmnnType, qScale, qOffset);
1831 auto input1 = QuantizedVector<T>(
1845 TensorInfo outputTensorInfo({ 1, 3, 5, 2 }, ArmnnType, qScale, qOffset);
1848 std::vector<T> output;
1849 output.resize(outputTensorInfo.GetNumElements());
1850 Concatenate<T>(workloadFactory,
1852 tensorHandleFactory,
1853 {inputTensorInfo0, inputTensorInfo1},
1854 {input0.data(), input1.data()},
1860 result.m_ActualData = output;
1861 result.m_ExpectedData = QuantizedVector<T>(
1886 template<DataType ArmnnType,
typename T = ResolveType<ArmnnType>>
1895 constexpr
unsigned int dimension = 3u;
1897 TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
1898 auto input0 = QuantizedVector<T>(
1909 TensorInfo inputTensorInfo1({ 1, 3, 2, 3 }, ArmnnType, qScale, qOffset);
1910 auto input1 = QuantizedVector<T>(
1912 11.0f, 12.0f, 13.0f,
1913 14.0f, 15.0f, 16.0f,
1915 17.0f, 18.0f, 19.0f,
1916 20.0f, 21.0f, 22.0f,
1918 23.0f, 24.0f, 25.0f,
1923 TensorInfo outputTensorInfo({ 1, 3, 2, 5 }, ArmnnType, qScale, qOffset);
1927 std::vector<T> output;
1928 output.resize(outputTensorInfo.GetNumElements());
1929 Concatenate<T>(workloadFactory,
1931 tensorHandleFactory,
1932 {inputTensorInfo0, inputTensorInfo1},
1933 {input0.data(), input1.data()},
1939 result.m_ActualData = output;
1940 result.m_ExpectedData = QuantizedVector<T>(
1942 1.0f, 2.0f, 11.0f, 12.0f, 13.0f,
1943 3.0f, 4.0f, 14.0f, 15.0f, 16.0f,
1944 5.0f, 6.0f, 17.0f, 18.0f, 19.0f,
1945 7.0f, 8.0f, 20.0f, 21.0f, 22.0f,
1946 9.0f, 10.0f, 23.0f, 24.0f, 25.0f,
1947 11.0f, 12.0f, 26.0f, 27.0f, 28.0f
1954 template<DataType ArmnnType,
typename T>
1964 TensorInfo outputTensorInfo({ 3, 6, 3 }, ArmnnType);
1965 TensorInfo inputTensorInfo1({ 3, 6, 2 }, ArmnnType);
1966 TensorInfo inputTensorInfo2({ 3, 6, 1 }, ArmnnType);
1968 std::vector<TensorShape> inputTensorShapes({inputTensorInfo1.GetShape(), inputTensorInfo2.GetShape()});
1971 const float inputScale1 = 0.5f;
1972 const int32_t inputOffset1 = 5;
1974 std::vector<T> input1 =
1992 const float inputScale2 = 0.2f;
1993 const int32_t inputOffset2 = 10;
1995 std::vector<T> input2 =
2006 const float outputScale = 0.1f;
2007 const int32_t outputOffset = 20;
2009 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
2011 std::vector<T> expectedOutput =
2036 outputTensorInfo.SetQuantizationOffset(outputOffset);
2037 inputTensorInfo1.SetQuantizationScale(inputScale1);
2038 inputTensorInfo1.SetQuantizationOffset(inputOffset1);
2039 inputTensorInfo2.SetQuantizationScale(inputScale2);
2040 inputTensorInfo2.SetQuantizationOffset(inputOffset2);
2042 std::vector<unsigned int> wOrigin1 = { 0, 0, 0 };
2045 std::vector<unsigned int> wOrigin2 = { 0, 0, 2 };
2048 std::unique_ptr<ITensorHandle> outputHandle = tensorHandleFactory.
CreateTensorHandle(outputTensorInfo);
2052 std::unique_ptr<ITensorHandle> inputHandle1 =
2053 subTensorsSupported ?
2054 tensorHandleFactory.
CreateSubTensorHandle(*outputHandle, inputTensorInfo1.GetShape(), wOrigin1.data()) :
2057 std::unique_ptr<ITensorHandle> inputHandle2 =
2058 subTensorsSupported ?
2059 tensorHandleFactory.
CreateSubTensorHandle(*outputHandle, inputTensorInfo2.GetShape(), wOrigin2.data()) :
2064 inputTensorShapes.begin(),inputTensorShapes.end(), 2);
2068 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2069 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
2070 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2077 inputHandle1->Allocate();
2078 inputHandle2->Allocate();
2079 outputHandle->Allocate();
2084 workload->PostAllocationConfigure();
2085 workload->Execute();
2091 outputHandle->GetShape(),
2092 outputTensorInfo.GetShape());
2100 ConcatDifferentInputOutputQParamTest<DataType::QAsymmU8>(
2107 ConcatDifferentInputOutputQParamTest<DataType::QSymmS16>(
2124 unsigned int outputWidth = 3;
2125 unsigned int outputHeight = 6;
2126 unsigned int outputChannels = 3;
2128 unsigned int inputWidth1 = 3;
2129 unsigned int inputHeight1 = 6;
2130 unsigned int inputChannels1 = 2;
2132 unsigned int inputWidth2 = 3;
2133 unsigned int inputHeight2 = 6;
2134 unsigned int inputChannels2 = 1;
2141 std::vector<float> actualOutput(outputTensorInfo.GetNumElements());
2143 std::vector<float> expectedOutput =
2148 10.0f, 11.0f, 12.0f,
2149 13.0f, 14.0f, 15.0f,
2150 16.0f, 17.0f, 18.0f,
2152 19.0f, 20.0f, 21.0f,
2153 22.0f, 23.0f, 24.0f,
2154 25.0f, 26.0f, 27.0f,
2155 28.0f, 29.0f, 30.0f,
2156 31.0f, 32.0f, 33.0f,
2157 34.0f, 35.0f, 36.0f,
2159 37.0f, 38.0f, 39.0f,
2160 40.0f, 41.0f, 42.0f,
2161 43.0f, 44.0f, 45.0f,
2162 46.0f, 47.0f, 48.0f,
2163 49.0f, 50.0f, 51.0f,
2167 std::vector<float> input1 =
2172 10.0f, 11.0f, 12.0f,
2173 13.0f, 14.0f, 15.0f,
2174 16.0f, 17.0f, 18.0f,
2176 19.0f, 20.0f, 21.0f,
2177 22.0f, 23.0f, 24.0f,
2178 25.0f, 26.0f, 27.0f,
2179 28.0f, 29.0f, 30.0f,
2180 31.0f, 32.0f, 33.0f,
2184 std::vector<float> input2 =
2186 37.0f, 38.0f, 39.0f,
2187 40.0f, 41.0f, 42.0f,
2188 43.0f, 44.0f, 45.0f,
2189 46.0f, 47.0f, 48.0f,
2190 49.0f, 50.0f, 51.0f,
2191 52.0f, 53.0f, 54.0f,
2194 std::vector<unsigned int> wOrigin1 = {0, 0, 0};
2197 std::vector<unsigned int> wOrigin2 = {2, 0, 0};
2200 std::unique_ptr<ITensorHandle> outputHandle = tensorHandleFactory.
CreateTensorHandle(outputTensorInfo);
2204 std::unique_ptr<ITensorHandle> inputHandle1 =
2205 subTensorsSupported ?
2206 tensorHandleFactory.
CreateSubTensorHandle(*outputHandle, inputTensorInfo1.GetShape(), wOrigin1.data()) :
2209 std::unique_ptr<ITensorHandle> inputHandle2 =
2210 subTensorsSupported ?
2211 tensorHandleFactory.
CreateSubTensorHandle(*outputHandle, inputTensorInfo2.GetShape(), wOrigin2.data()) :
2216 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2217 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
2218 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2225 inputHandle1->Allocate();
2226 inputHandle2->Allocate();
2227 outputHandle->Allocate();
2232 workload->PostAllocationConfigure();
2233 workload->Execute();
2239 outputHandle->GetShape(),
2240 outputTensorInfo.GetShape());
2248 return Concat1dTestImpl<DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
2256 return Concat2dDim0TestImpl<DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
2264 return Concat2dDim1TestImpl<DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
2272 return Concat2dDim0DiffInputDimsTestImpl<DataType::Float32>(workloadFactory, memoryManager,
2273 tensorHandleFactory, 0.0f, 0);
2281 return Concat2dDim1DiffInputDimsTestImpl<DataType::Float32>(workloadFactory,
2283 tensorHandleFactory,
2293 return Concat3dDim0TestImpl<DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
2301 return Concat3dDim1TestImpl<DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
2310 return Concat3dDim2TestImpl<DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory,
2311 useSubtensor, 0.0f, 0);
2319 return Concat3dDim0DiffInputDimsTestImpl<DataType::Float32>(
2320 workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
2328 return Concat3dDim1DiffInputDimsTestImpl<DataType::Float32>(workloadFactory, memoryManager,
2329 tensorHandleFactory, 0.0f, 0);
2338 return Concat3dDim2DiffInputDimsTestImpl<DataType::Float32>(
2339 workloadFactory, memoryManager, tensorHandleFactory, useSubtensor, 0.0f, 0);
2347 return Concat4dDim0TestImpl<DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
2355 return Concat4dDim1TestImpl<DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
2363 return Concat4dDim2TestImpl<DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
2372 return Concat4dDim3TestImpl<DataType::Float32>(workloadFactory, memoryManager,
2373 tensorHandleFactory, 0.0f, 0, useSubtensor);
2381 return Concat4dDiffShapeDim0TestImpl<DataType::Float32>(workloadFactory, memoryManager,
2382 tensorHandleFactory, 0.0f, 0);
2390 return Concat4dDiffShapeDim1TestImpl<DataType::Float32>(
2391 workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
2399 return Concat4dDiffShapeDim2TestImpl<DataType::Float32>(workloadFactory, memoryManager,
2400 tensorHandleFactory, 0.0f, 0);
2409 return Concat4dDiffShapeDim3TestImpl<DataType::Float32>(
2410 workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0, useSubtensor);
2418 return Concat3dDim1TestImpl<DataType::Float16>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
2426 return Concat3dDim1TestImpl<DataType::BFloat16>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
2436 unsigned int outputWidth = 3;
2437 unsigned int outputHeight = 6;
2438 unsigned int outputChannels = 3;
2440 unsigned int inputWidth1 = 3;
2441 unsigned int inputHeight1 = 6;
2442 unsigned int inputChannels1 = 2;
2444 unsigned int inputWidth2 = 3;
2445 unsigned int inputHeight2 = 6;
2446 unsigned int inputChannels2 = 1;
2454 const float inputScale1 = 0.015686f;
2455 const int32_t inputOffset1 = 192;
2457 std::vector<uint8_t> input1 =
2475 const float inputScale2 = 0.019608f;
2476 const int32_t inputOffset2 = 50;
2478 std::vector<uint8_t> input2 =
2490 const float outputScale = 0.015686f;
2491 const int32_t outputOffset = 192;
2493 std::vector<uint8_t> actualOutput(outputTensorInfo.GetNumElements());
2495 std::vector<uint8_t> expectedOutput =
2520 outputTensorInfo.SetQuantizationOffset(outputOffset);
2521 inputTensorInfo1.SetQuantizationScale(inputScale1);
2522 inputTensorInfo1.SetQuantizationOffset(inputOffset1);
2523 inputTensorInfo2.SetQuantizationScale(inputScale2);
2524 inputTensorInfo2.SetQuantizationOffset(inputOffset2);
2526 std::vector<unsigned int> wOrigin1 = { 0, 0, 0 };
2529 std::vector<unsigned int> wOrigin2 = { 2, 0, 0 };
2532 std::unique_ptr<ITensorHandle> outputHandle = tensorHandleFactory.
CreateTensorHandle(outputTensorInfo);
2536 std::unique_ptr<ITensorHandle> inputHandle1 =
2537 subTensorsSupported ?
2538 tensorHandleFactory.
CreateSubTensorHandle(*outputHandle, inputTensorInfo1.GetShape(), wOrigin1.data()) :
2541 std::unique_ptr<ITensorHandle> inputHandle2 =
2542 subTensorsSupported ?
2543 tensorHandleFactory.
CreateSubTensorHandle(*outputHandle, inputTensorInfo2.GetShape(), wOrigin2.data()) :
2548 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2549 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
2550 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2557 inputHandle1->Allocate();
2558 inputHandle2->Allocate();
2559 outputHandle->Allocate();
2564 workload->PostAllocationConfigure();
2565 workload->Execute();
2571 outputHandle->GetShape(),
2572 outputTensorInfo.GetShape());
2582 unsigned int outputWidth = 3;
2583 unsigned int outputHeight = 6;
2584 unsigned int outputChannels = 3;
2586 unsigned int inputWidth1 = 3;
2587 unsigned int inputHeight1 = 6;
2588 unsigned int inputChannels1 = 2;
2590 unsigned int inputWidth2 = 3;
2591 unsigned int inputHeight2 = 6;
2592 unsigned int inputChannels2 = 1;
2600 const float scale = 0.13497836f;
2601 const int32_t offset = -7;
2604 outputTensorInfo.SetQuantizationOffset(offset);
2605 inputTensorInfo1.SetQuantizationScale(scale);
2606 inputTensorInfo1.SetQuantizationOffset(offset);
2607 inputTensorInfo2.SetQuantizationScale(scale);
2608 inputTensorInfo2.SetQuantizationOffset(offset);
2610 std::vector<uint8_t> actualOutput(outputTensorInfo.GetNumElements());
2612 std::vector<uint8_t> expectedOutput =
2636 std::vector<uint8_t> input1 =
2653 std::vector<uint8_t> input2 =
2663 std::vector<unsigned int> wOrigin1 = { 0, 0, 0 };
2666 std::vector<unsigned int> wOrigin2 = { 2, 0, 0 };
2669 std::unique_ptr<ITensorHandle> outputHandle = tensorHandleFactory.
CreateTensorHandle(outputTensorInfo);
2673 std::unique_ptr<ITensorHandle> inputHandle1 =
2674 subTensorsSupported ?
2675 tensorHandleFactory.
CreateSubTensorHandle(*outputHandle, inputTensorInfo1.GetShape(), wOrigin1.data()) :
2678 std::unique_ptr<ITensorHandle> inputHandle2 =
2679 subTensorsSupported ?
2680 tensorHandleFactory.
CreateSubTensorHandle(*outputHandle, inputTensorInfo2.GetShape(), wOrigin2.data()) :
2686 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2687 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
2688 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2695 inputHandle1->Allocate();
2696 inputHandle2->Allocate();
2697 outputHandle->Allocate();
2702 workload->PostAllocationConfigure();
2703 workload->Execute();
2709 outputHandle->GetShape(),
2710 outputTensorInfo.GetShape());
2720 unsigned int outputWidth = 3;
2721 unsigned int outputHeight = 6;
2722 unsigned int outputChannels = 3;
2724 unsigned int inputWidth1 = 3;
2725 unsigned int inputHeight1 = 6;
2726 unsigned int inputChannels1 = 2;
2728 unsigned int inputWidth2 = 3;
2729 unsigned int inputHeight2 = 6;
2730 unsigned int inputChannels2 = 1;
2738 const float scale = 0.13497836f;
2739 const int32_t offset = -7;
2742 outputTensorInfo.SetQuantizationOffset(offset);
2743 inputTensorInfo1.SetQuantizationScale(scale);
2744 inputTensorInfo1.SetQuantizationOffset(offset);
2745 inputTensorInfo2.SetQuantizationScale(scale);
2746 inputTensorInfo2.SetQuantizationOffset(offset);
2748 std::vector<uint16_t> actualOutput(outputTensorInfo.GetNumElements());
2750 std::vector<uint16_t> expectedOutput =
2774 std::vector<uint16_t> input1 =
2791 std::vector<uint16_t> input2 =
2801 std::vector<unsigned int> wOrigin1 = { 0, 0, 0 };
2804 std::vector<unsigned int> wOrigin2 = { 2, 0, 0 };
2808 std::unique_ptr<ITensorHandle> outputHandle = tensorHandleFactory.
CreateTensorHandle(outputTensorInfo);
2812 std::unique_ptr<ITensorHandle> inputHandle1 =
2813 subTensorsSupported ?
2814 tensorHandleFactory.
CreateSubTensorHandle(*outputHandle, inputTensorInfo1.GetShape(), wOrigin1.data()) :
2817 std::unique_ptr<ITensorHandle> inputHandle2 =
2818 subTensorsSupported ?
2819 tensorHandleFactory.
CreateSubTensorHandle(*outputHandle, inputTensorInfo2.GetShape(), wOrigin2.data()) :
2825 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2826 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
2827 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2834 inputHandle1->Allocate();
2835 inputHandle2->Allocate();
2836 outputHandle->Allocate();
2841 workload->PostAllocationConfigure();
2842 workload->Execute();
2848 outputHandle->GetShape(),
2849 outputTensorInfo.GetShape());
2857 return Concat1dTestImpl<DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.5f, -1);
2865 return Concat2dDim0TestImpl<DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.5f, -1);
2873 return Concat2dDim1TestImpl<DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.5f, -1);
2881 return Concat2dDim0DiffInputDimsTestImpl<DataType::QAsymmU8>(
2882 workloadFactory, memoryManager, tensorHandleFactory, 0.5f, -1);
2890 return Concat2dDim1DiffInputDimsTestImpl<DataType::QAsymmU8>(
2891 workloadFactory, memoryManager, tensorHandleFactory, 0.5f, -1);
2899 return Concat3dDim0TestImpl<DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.5f, -1);
2907 return Concat3dDim1TestImpl<DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.5f, -1);
2916 return Concat3dDim2TestImpl<DataType::QAsymmU8>(
2917 workloadFactory, memoryManager, tensorHandleFactory, useSubtensor, 0.5f, -1);
2925 return Concat3dDim0TestImpl<DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.5f, -1);
2933 return Concat3dDim1DiffInputDimsTestImpl<DataType::QAsymmU8>(
2934 workloadFactory, memoryManager, tensorHandleFactory, 0.5f, -1);
2943 return Concat3dDim2DiffInputDimsTestImpl<DataType::QAsymmU8>(
2944 workloadFactory, memoryManager, tensorHandleFactory, useSubtensor, 0.5f, -1);
2952 return Concat4dDim0TestImpl<DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.5f, -1);
2960 return Concat4dDim1TestImpl<DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.5f, -1);
2968 return Concat4dDim2TestImpl<DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.5f, -1);
2976 return Concat4dDim3TestImpl<DataType::QAsymmU8>(
2977 workloadFactory, memoryManager, tensorHandleFactory, 0.5f, -1, useSubtensor);
2985 return Concat4dDiffShapeDim0TestImpl<DataType::QAsymmU8>(
2986 workloadFactory, memoryManager, tensorHandleFactory, 0.5f, -1);
2994 return Concat4dDiffShapeDim1TestImpl<DataType::QAsymmU8>(
2995 workloadFactory, memoryManager, tensorHandleFactory, 0.5f, -1);
3003 return Concat4dDiffShapeDim2TestImpl<DataType::QAsymmU8>(
3004 workloadFactory, memoryManager, tensorHandleFactory, 0.5f, -1);
3013 return Concat4dDiffShapeDim3TestImpl<DataType::QAsymmU8>(
3014 workloadFactory, memoryManager, tensorHandleFactory, 0.5f, -1, useSubtensor);
LayerTestResult< uint16_t, 3 > ConcatUint16Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< uint8_t, 4 > Concat4dDiffShapeDim3Uint8Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, bool useSubtensor)
LayerTestResult< float, 3 > Concat3dDim0Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< float, 2 > Concat2dDim0Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< T, 2 > Concat2dDim1TestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, float qScale, int32_t qOffset)
LayerTestResult< float, 4 > Concat4dDim0Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< float, 3 > ConcatTest(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< T, 4 > Concat4dDim2TestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, float qScale, int32_t qOffset)
LayerTestResult< uint8_t, 3 > Concat3dDim0DiffInputDimsUint8Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
const TensorShape & GetShape() const
LayerTestResult< uint8_t, 4 > Concat4dDiffShapeDim1Uint8Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< T, 2 > Concat2dDim0DiffInputDimsTestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, float qScale, int32_t qOffset)
LayerTestResult< uint8_t, 2 > Concat2dDim0DiffInputDimsUint8Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< uint8_t, 3 > Concat3dDim1DiffInputDimsUint8Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< uint8_t, 3 > Concat3dDim2DiffInputDimsUint8Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, bool useSubtensor)
virtual std::unique_ptr< ITensorHandle > CreateSubTensorHandle(ITensorHandle &parent, TensorShape const &subTensorShape, unsigned int const *subTensorOrigin) const =0
LayerTestResult< float, 2 > Concat2dDim1Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< uint8_t, 4 > Concat4dDim1Uint8Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< uint8_t, 2 > Concat2dDim0Uint8Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< BFloat16, 3 > ConcatBFloat16Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< float, 4 > Concat4dDim2Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< uint8_t, 2 > Concat2dDim1DiffInputDimsUint8Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< float, 4 > Concat4dDiffShapeDim1Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< float, 3 > Concat3dDim1DiffInputDimsTest(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
Copyright (c) 2021 ARM Limited and Contributors.
void IgnoreUnused(Ts &&...)
LayerTestResult< float, 3 > Concat3dDim2DiffInputDimsTest(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, bool useSubtensor)
LayerDescriptor m_Parameters
void Generate3dPermuteVectorForConcat(unsigned int numDimensions, unsigned int &concatDim, std::pair< PermutationVector, PermutationVector > &permutations)
LayerTestResult< T, 4 > Concat4dDiffShapeDim2TestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, float qScale, int32_t qOffset)
LayerTestResult< uint8_t, 4 > Concat4dDim3Uint8Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, bool useSubtensor)
LayerTestResult< uint8_t, 2 > Concat2dDim1Uint8Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
void SetShape(const TensorShape &newShape)
LayerTestResult< T, 2 > Concat2dTestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, const TensorInfo &outputTensorInfo, unsigned int dimension, const float qScale, const int32_t qOffset)
LayerTestResult< T, 1 > Concat1dTestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, float qScale, int32_t qOffset)
const uint32_t * GetViewOrigin(uint32_t idx) const
Return the view origin at the int value idx.
LayerTestResult< float, 2 > Concat2dDim0DiffInputDimsTest(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
std::vector< ViewOrigin > m_ViewOrigins
#define ARMNN_ASSERT_MSG(COND, MSG)
LayerTestResult< float, 3 > Concat3dDim1Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
std::shared_ptr< IMemoryManager > IMemoryManagerSharedPtr
LayerTestResult< T, 3 > Concat3dDim0DiffInputDimsTestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, float qScale, int32_t qOffset)
void Concatenate(const ConcatQueueDescriptor &data, std::vector< ITensorHandle *> inputs, std::vector< ITensorHandle *> outputs)
An OriginsDescriptor for the ConcatLayer.
LayerTestResult< float, 4 > Concat4dDiffShapeDim0Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
std::vector< T > m_ExpectedData
void CopyDataFromITensorHandle(void *mem, const armnn::ITensorHandle *tensorHandle)
LayerTestResult< T, 4 > Concat4dDiffShapeDim1TestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, float qScale, int32_t qOffset)
LayerTestResult< uint8_t, 3 > ConcatUint8DifferentQParamsTest(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
void SetQuantizationScale(float scale)
#define ARMNN_ASSERT(COND)
LayerTestResult< uint8_t, 4 > Concat4dDiffShapeDim0Uint8Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< T, 4 > Concat4dTestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, const TensorInfo &outputTensorInfo, unsigned int dimension, bool useSubtensor, float qScale, int32_t qOffset)
LayerTestResult< Half, 3 > ConcatFloat16Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
OriginsDescriptor CreateDescriptorForConcat(const std::vector< TensorInfo > &inputTensorInfos, unsigned int concatDim)
LayerTestResult< uint8_t, 3 > Concat3dDim1Uint8Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
void PermuteInputsForConcat(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, std::vector< TensorInfo > &inputTensorInfos, std::vector< T *> &inputData, std::vector< std::vector< T >> &inputDataStorage, PermutationVector &permuteVector, unsigned int &concatDim, TensorInfo &outputTensorInfo)
LayerTestResult< T, 3 > Concat3dDim0TestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, float qScale, int32_t qOffset)
LayerTestResult< float, 3 > Concat3dDim2Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, bool useSubtensor)
LayerTestResult< T, 3 > Concat3dDim1TestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, float qScale, int32_t qOffset)
LayerTestResult< float, 4 > Concat4dDiffShapeDim2Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
TensorShape ExpandTensorShapeTo3dForPermute(const TensorShape &inputShape)
LayerTestResult< T, 2 > Concat2dDim1DiffInputDimsTestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, float qScale, int32_t qOffset)
LayerTestResult< T, 2 > Concat2dDim0TestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, float qScale, int32_t qOffset)
bool IsEqual(const PermutationVector &other) const
LayerTestResult< float, 4 > Concat4dDim1Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< uint8_t, 4 > Concat4dDiffShapeDim2Uint8Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< T, 3 > Concat3dDim2TestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, bool useSubtensor, float qScale, int32_t qOffset)
LayerTestResult< float, 3 > Concat3dDim0DiffInputDimsTest(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< T, 4 > Concat4dDim1TestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, float qScale, int32_t qOffset)
LayerTestResult< T, 4 > Concat4dDiffShapeDim3TestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, float qScale, int32_t qOffset, bool useSubtensor)
LayerTestResult< float, 4 > Concat4dDim3Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, bool useSubtensor)
void CopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)
unsigned int GetNumDimensions() const
Function that returns the tensor rank.
LayerTestResult< uint8_t, 3 > Concat3dDim0Uint8Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
uint32_t GetNumDimensions() const
Get the number of dimensions.
LayerTestResult< uint8_t, 3 > ConcatUint8Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< T, 3 > Concat3dTestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, const TensorInfo &outputTensorInfo, unsigned int dimension, bool useSubtensor, float qScale, int32_t qOffset)
LayerTestResult< uint8_t, 1 > Concat1dUint8Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< float, 2 > Concat2dDim1DiffInputDimsTest(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
void PermuteTensorData(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, const PermutationVector &mappings, TensorInfo &inputTensorInfo, const T *inputData, std::vector< T > &outputData)
Contains information about TensorInfos of a layer.
LayerTestResult< T, 3 > Concat3dDim2DiffInputDimsTestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, bool useSubtensor, float qScale, int32_t qOffset)
OriginsDescriptor CreateDescriptorForConcatenation(TensorShapeIt first, TensorShapeIt last, unsigned int concatenationDimension)
Convenience template to create an OriginsDescriptor to use when creating a ConcatLayer for performing...
uint32_t GetNumViews() const
Get the number of views.
LayerTestResult< T, 4 > Concat4dDim0TestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, float qScale, int32_t qOffset)
LayerTestResult< uint8_t, 4 > Concat4dDim2Uint8Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< uint8_t, 3 > Concat3dDim2Uint8Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, bool useSubtensor)
LayerTestResult< T, 3 > ConcatDifferentInputOutputQParamTest(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, bool useSubtensor)
LayerTestResult< T, 4 > Concat4dDim3TestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, float qScale, int32_t qOffset, bool useSubtensor)
virtual std::unique_ptr< IWorkload > CreateWorkload(LayerType type, const QueueDescriptor &descriptor, const WorkloadInfo &info) const
LayerTestResult< T, 3 > Concat3dDim1DiffInputDimsTestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, float qScale, int32_t qOffset)
armnn::TensorShape Permuted(const armnn::TensorShape &srcShape, const armnn::PermutationVector &mappings)
virtual std::unique_ptr< ITensorHandle > CreateTensorHandle(const TensorInfo &tensorInfo) const =0
LayerTestResult< float, 4 > Concat4dDiffShapeDim3Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, bool useSubtensor)
LayerTestResult< uint8_t, 4 > Concat4dDim0Uint8Test(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< float, 1 > Concat1dTest(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
unsigned int GetNumElements() const
bool NeedPermuteForConcat(const std::vector< TensorInfo > &inputTensorInfos, unsigned int concatDim)
void PermuteOutputForConcat(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, const TensorInfo &tensorInfo, const PermutationVector &permuteVector, std::unique_ptr< ITensorHandle > &&inputDataHandle, T *data)
A PermuteDescriptor for the PermuteLayer.
LayerTestResult< T, 4 > Concat4dDiffShapeDim0TestImpl(IWorkloadFactory &workloadFactory, const IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory, float qScale, int32_t qOffset)
virtual bool SupportsSubTensors() const =0