// // Copyright © 2019 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #include "DepthToSpaceTestImpl.hpp" #include #include #include #include #include namespace { template LayerTestResult DepthToSpaceTestImpl( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::TensorInfo& inputInfo, armnn::TensorInfo& outputInfo, std::vector& inputData, std::vector& expectedOutputData, armnn::DepthToSpaceQueueDescriptor descriptor, const float qScale = 1.0f, const int32_t qOffset = 0) { IgnoreUnused(memoryManager); if (descriptor.m_Parameters.m_DataLayout == armnn::DataLayout::NCHW) { PermuteTensorNhwcToNchw(inputInfo, inputData); PermuteTensorNhwcToNchw(outputInfo, expectedOutputData); } 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 actualOutput(outputInfo.GetNumElements()); std::vector expectedOutput = armnnUtils::QuantizedVector(expectedOutputData, qScale, qOffset); 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::DepthToSpace, descriptor, info); inputHandle->Allocate(); outputHandle->Allocate(); CopyDataToITensorHandle(inputHandle.get(), input.data()); workload->Execute(); CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get()); return LayerTestResult(actualOutput, expectedOutput, outputHandle->GetShape(), outputInfo.GetShape()); } } // anonymous namespace template LayerTestResult DepthToSpaceTest1( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout) { unsigned int inputShape[] = { 1, 1, 1, 8 }; unsigned int outputShape[] = { 1, 2, 2, 2 }; // in: // [[[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]]] // // out: // [[[[1, 2, 3], [4, 5, 6]], // [[7, 8, 9], [10, 11, 12]]]] std::vector input = { 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f }; std::vector expectedOutput = input; armnn::DepthToSpaceQueueDescriptor desc; desc.m_Parameters.m_DataLayout = dataLayout; desc.m_Parameters.m_BlockSize = 2; armnn::TensorInfo inputInfo(4, inputShape, ArmnnType); armnn::TensorInfo outputInfo(4, outputShape, ArmnnType); return DepthToSpaceTestImpl(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc); } template LayerTestResult DepthToSpaceTest2( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout) { unsigned int inputShape[] = { 1, 2, 2, 4 }; unsigned int outputShape[] = { 1, 4, 4, 1 }; // in: // [[[[1, 2, 3, 4], // [5, 6, 7, 8]], // [[9, 10, 11, 12], // [13, 14, 15, 16]]]] // // out: // [[[ [1], [2], [5], [6]], // [ [3], [4], [7], [8]], // [ [9], [10], [13], [14]], // [ [11], [12], [15], [16]]]] std::vector input = { 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 }; std::vector expectedOutput { 1.f, 2.f, 5.f, 6.f, 3.f, 4.f, 7.f, 8.f, 9.f, 10.f, 13.f, 14.f, 11.f, 12.f, 15.f, 16.f }; armnn::DepthToSpaceQueueDescriptor desc; desc.m_Parameters.m_DataLayout = dataLayout; desc.m_Parameters.m_BlockSize = 2; armnn::TensorInfo inputInfo(4, inputShape, ArmnnType); armnn::TensorInfo outputInfo(4, outputShape, ArmnnType); return DepthToSpaceTestImpl(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc); } template LayerTestResult DepthToSpaceTest3( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout) { unsigned int inputShape[] = { 2, 1, 1, 4 }; unsigned int outputShape[] = { 2, 2, 2, 1 }; std::vector input = { 1.f, 2.f, 3.f, 4.f, // batch 0 5.f, 6.f, 7.f, 8.f // batch 1 }; std::vector expectedOutput = input; armnn::DepthToSpaceQueueDescriptor desc; desc.m_Parameters.m_DataLayout = dataLayout; desc.m_Parameters.m_BlockSize = 2; armnn::TensorInfo inputInfo(4, inputShape, ArmnnType); armnn::TensorInfo outputInfo(4, outputShape, ArmnnType); return DepthToSpaceTestImpl(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc); } template LayerTestResult DepthToSpaceTest4( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout) { unsigned int inputShape[] = { 2, 2, 2, 4 }; unsigned int outputShape[] = { 2, 4, 4, 1 }; std::vector input = { 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 }; std::vector expectedOutput { 1.f, 2.f, 5.f, 6.f, 3.f, 4.f, 7.f, 8.f, 9.f, 10.f, 13.f, 14.f, 11.f, 12.f, 15.f, 16.f, 17.f, 18.f, 21.f, 22.f, 19.f, 20.f, 23.f, 24.f, 25.f, 26.f, 29.f, 30.f, 27.f, 28.f, 31.f, 32.f }; armnn::DepthToSpaceQueueDescriptor desc; desc.m_Parameters.m_DataLayout = dataLayout; desc.m_Parameters.m_BlockSize = 2; armnn::TensorInfo inputInfo(4, inputShape, ArmnnType); armnn::TensorInfo outputInfo(4, outputShape, ArmnnType); return DepthToSpaceTestImpl(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc); } // Float32 template LayerTestResult, 4> DepthToSpaceTest1( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout); template LayerTestResult, 4> DepthToSpaceTest2( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout); template LayerTestResult, 4> DepthToSpaceTest3( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout); template LayerTestResult, 4> DepthToSpaceTest4( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout); // Float16 template LayerTestResult, 4> DepthToSpaceTest1( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout); template LayerTestResult, 4> DepthToSpaceTest2( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout); template LayerTestResult, 4> DepthToSpaceTest3( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout); template LayerTestResult, 4> DepthToSpaceTest4( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout); // QuantisedAsymm8 template LayerTestResult, 4> DepthToSpaceTest1( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout); template LayerTestResult, 4> DepthToSpaceTest2( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout); template LayerTestResult, 4> DepthToSpaceTest3( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout); template LayerTestResult, 4> DepthToSpaceTest4( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout); // QuantisedAsymmS8 template LayerTestResult, 4> DepthToSpaceTest1( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout); template LayerTestResult, 4> DepthToSpaceTest2( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout); template LayerTestResult, 4> DepthToSpaceTest3( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout); template LayerTestResult, 4> DepthToSpaceTest4( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout); // QuantisedSymm16 template LayerTestResult, 4> DepthToSpaceTest1( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout); template LayerTestResult, 4> DepthToSpaceTest2( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout); template LayerTestResult, 4> DepthToSpaceTest3( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout); template LayerTestResult, 4> DepthToSpaceTest4( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout);