// // Copyright © 2019 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #include "SliceTestImpl.hpp" #include #include #include #include #include namespace { template LayerTestResult SliceTestImpl( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::TensorInfo& inputInfo, armnn::TensorInfo& outputInfo, std::vector& inputData, std::vector& expectedOutputData, armnn::SliceQueueDescriptor descriptor, const float qScale = 1.0f, const int qOffset = 0) { IgnoreUnused(memoryManager); if(armnn::IsQuantizedType()) { inputInfo.SetQuantizationScale(qScale); inputInfo.SetQuantizationOffset(qOffset); outputInfo.SetQuantizationScale(qScale); outputInfo.SetQuantizationOffset(qOffset); } std::vector input = armnnUtils::QuantizedVector(inputData, qScale, qOffset); std::vector expectedOutput = armnnUtils::QuantizedVector(expectedOutputData, qScale, qOffset); std::vector actualOutput(outputInfo.GetNumElements()); ARMNN_NO_DEPRECATE_WARN_BEGIN std::unique_ptr inputHandle = workloadFactory.CreateTensorHandle(inputInfo); std::unique_ptr outputHandle = workloadFactory.CreateTensorHandle(outputInfo); ARMNN_NO_DEPRECATE_WARN_END armnn::WorkloadInfo info; AddInputToWorkload(descriptor, info, inputInfo, inputHandle.get()); AddOutputToWorkload(descriptor, info, outputInfo, outputHandle.get()); std::unique_ptr workload = workloadFactory.CreateWorkload(armnn::LayerType::Slice, descriptor, info); inputHandle->Allocate(); outputHandle->Allocate(); CopyDataToITensorHandle(inputHandle.get(), input.data()); ExecuteWorkload(*workload, memoryManager); CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get()); return LayerTestResult(actualOutput, expectedOutput, outputHandle->GetShape(), outputInfo.GetShape()); } template> LayerTestResult Slice4dTest(armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { armnn::TensorShape inputShape = { 3, 2, 3, 5 }; armnn::TensorShape outputShape = { 2, 1, 2, 3 }; armnn::SliceQueueDescriptor desc; desc.m_Parameters.m_Begin = { 1, 0, 1, 2 }; desc.m_Parameters.m_Size = { 2, 1, 2, 3 }; armnn::TensorInfo inputInfo(inputShape, ArmnnType); armnn::TensorInfo outputInfo(outputShape, ArmnnType); std::vector input = { 0.f, 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f, 10.f, 11.f, 12.f, 13.f, 14.f, 15.f, 16.f, 17.f, 18.f, 19.f, 20.f, 21.f, 22.f, 23.f, 24.f, 25.f, 26.f, 27.f, 28.f, 29.f, 30.f, 31.f, 32.f, 33.f, 34.f, 35.f, 36.f, 37.f, 38.f, 39.f, 40.f, 41.f, 42.f, 43.f, 44.f, 45.f, 46.f, 47.f, 48.f, 49.f, 50.f, 51.f, 52.f, 53.f, 54.f, 55.f, 56.f, 57.f, 58.f, 59.f, 60.f, 61.f, 62.f, 63.f, 64.f, 65.f, 66.f, 67.f, 68.f, 69.f, 70.f, 71.f, 72.f, 73.f, 74.f, 75.f, 76.f, 77.f, 78.f, 79.f, 80.f, 81.f, 82.f, 83.f, 84.f, 85.f, 86.f, 87.f, 88.f, 89.f }; std::vector expectedOutput = { 37.f, 38.f, 39.f, 42.f, 43.f, 44.f, 67.f, 68.f, 69.f, 72.f, 73.f, 74.f }; return SliceTestImpl(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc); } template> LayerTestResult Slice3dTest(armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { armnn::TensorShape inputShape = { 2, 3, 5 }; armnn::TensorShape outputShape = { 1, 2, 3 }; armnn::SliceQueueDescriptor desc; desc.m_Parameters.m_Begin = { 0, 1, 2 }; desc.m_Parameters.m_Size = { 1, 2, 3 }; armnn::TensorInfo inputInfo(inputShape, ArmnnType); armnn::TensorInfo outputInfo(outputShape, ArmnnType); std::vector input = { 0.f, 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f, 10.f, 11.f, 12.f, 13.f, 14.f, 15.f, 16.f, 17.f, 18.f, 19.f, 20.f, 21.f, 22.f, 23.f, 24.f, 25.f, 26.f, 27.f, 28.f, 29.f, }; std::vector expectedOutput = { 7.f, 8.f, 9.f, 12.f, 13.f, 14.f }; return SliceTestImpl(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc); } template> LayerTestResult Slice2dTest(armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { armnn::TensorShape inputShape = { 3, 5 }; armnn::TensorShape outputShape = { 2, 3 }; armnn::SliceQueueDescriptor desc; desc.m_Parameters.m_Begin = { 1, 2 }; desc.m_Parameters.m_Size = { 2, 3 }; armnn::TensorInfo inputInfo(inputShape, ArmnnType); armnn::TensorInfo outputInfo(outputShape, ArmnnType); std::vector input = { 0.f, 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f, 10.f, 11.f, 12.f, 13.f, 14.f }; std::vector expectedOutput = { 7.f, 8.f, 9.f, 12.f, 13.f, 14.f }; return SliceTestImpl(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc); } template> LayerTestResult Slice1dTest(armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { armnn::TensorShape inputShape = { 5 }; armnn::TensorShape outputShape = { 3 }; armnn::SliceQueueDescriptor desc; desc.m_Parameters.m_Begin = { 2 }; desc.m_Parameters.m_Size = { 3 }; armnn::TensorInfo inputInfo(inputShape, ArmnnType); armnn::TensorInfo outputInfo(outputShape, ArmnnType); std::vector input = { 0.f, 1.f, 2.f, 3.f, 4.f }; std::vector expectedOutput = { 2.f, 3.f, 4.f }; return SliceTestImpl(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc); } } // anonymous namespace // Float32 tests LayerTestResult Slice4dFloat32Test(armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { return Slice4dTest(workloadFactory, memoryManager); } LayerTestResult Slice3dFloat32Test(armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { return Slice3dTest(workloadFactory, memoryManager); } LayerTestResult Slice2dFloat32Test(armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { return Slice2dTest(workloadFactory, memoryManager); } LayerTestResult Slice1dFloat32Test(armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { return Slice1dTest(workloadFactory, memoryManager); } // Uint8 tests LayerTestResult Slice4dUint8Test(armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { return Slice4dTest(workloadFactory, memoryManager); } LayerTestResult Slice3dUint8Test(armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { return Slice3dTest(workloadFactory, memoryManager); } LayerTestResult Slice2dUint8Test(armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { return Slice2dTest(workloadFactory, memoryManager); } LayerTestResult Slice1dUint8Test(armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { return Slice1dTest(workloadFactory, memoryManager); } // Int16 tests LayerTestResult Slice4dInt16Test(armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { return Slice4dTest(workloadFactory, memoryManager); } LayerTestResult Slice3dInt16Test(armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { return Slice3dTest(workloadFactory, memoryManager); } LayerTestResult Slice2dInt16Test(armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { return Slice2dTest(workloadFactory, memoryManager); } LayerTestResult Slice1dInt16Test(armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { return Slice1dTest(workloadFactory, memoryManager); }