IVGCVSW-3885 Add reference workload for DepthToSpace

Signed-off-by: Aron Virginas-Tar <Aron.Virginas-Tar@arm.com>
Change-Id: Id937dc4425884ad1985dcdfaae8bf3fb64f0c766
diff --git a/src/backends/backendsCommon/test/layerTests/DepthToSpaceTestImpl.cpp b/src/backends/backendsCommon/test/layerTests/DepthToSpaceTestImpl.cpp
new file mode 100644
index 0000000..9588f56
--- /dev/null
+++ b/src/backends/backendsCommon/test/layerTests/DepthToSpaceTestImpl.cpp
@@ -0,0 +1,342 @@
+//
+// Copyright © 2019 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include "DepthToSpaceTestImpl.hpp"
+
+#include <Permute.hpp>
+
+#include <armnn/ArmNN.hpp>
+
+#include <backendsCommon/test/TensorCopyUtils.hpp>
+#include <backendsCommon/test/WorkloadTestUtils.hpp>
+
+#include <test/TensorHelpers.hpp>
+
+namespace
+{
+
+template<typename T>
+LayerTestResult<T, 4> DepthToSpaceTestImpl(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    armnn::TensorInfo& inputInfo,
+    armnn::TensorInfo& outputInfo,
+    std::vector<float>& inputData,
+    std::vector<float>& expectedOutputData,
+    armnn::DepthToSpaceQueueDescriptor descriptor,
+    const float qScale = 1.0f,
+    const int32_t qOffset = 0)
+{
+    const armnn::PermutationVector permVector{0, 2, 3, 1};
+
+    if (descriptor.m_Parameters.m_DataLayout == armnn::DataLayout::NCHW)
+    {
+        inputInfo  = armnnUtils::Permuted(inputInfo, permVector);
+        outputInfo = armnnUtils::Permuted(outputInfo, permVector);
+
+        constexpr size_t typeSize = sizeof(float);
+
+        std::vector<float> inputTmp(inputData.size());
+        armnnUtils::Permute(inputInfo.GetShape(), permVector, inputData.data(), inputTmp.data(), typeSize);
+        inputData = inputTmp;
+
+        std::vector<float> outputTmp(expectedOutputData.size());
+        armnnUtils::Permute(outputInfo.GetShape(), permVector, expectedOutputData.data(), outputTmp.data(), typeSize);
+        expectedOutputData = outputTmp;
+    }
+
+    if(armnn::IsQuantizedType<T>())
+    {
+        inputInfo.SetQuantizationScale(qScale);
+        inputInfo.SetQuantizationOffset(qOffset);
+        outputInfo.SetQuantizationScale(qScale);
+        outputInfo.SetQuantizationOffset(qOffset);
+    }
+
+    boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputInfo, QuantizedVector<T>(qScale, qOffset, inputData));
+
+    LayerTestResult<T, 4> result(outputInfo);
+    result.outputExpected = MakeTensor<T, 4>(outputInfo, QuantizedVector<T>(qScale, qOffset, expectedOutputData));
+
+    std::unique_ptr<armnn::ITensorHandle> inputHandle  = workloadFactory.CreateTensorHandle(inputInfo);
+    std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputInfo);
+
+    armnn::WorkloadInfo info;
+    AddInputToWorkload(descriptor, info, inputInfo, inputHandle.get());
+    AddOutputToWorkload(descriptor, info, outputInfo, outputHandle.get());
+
+    std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateDepthToSpace(descriptor, info);
+
+    inputHandle->Allocate();
+    outputHandle->Allocate();
+
+    CopyDataToITensorHandle(inputHandle.get(), input.origin());
+
+    workload->Execute();
+
+    CopyDataFromITensorHandle(result.output.origin(), outputHandle.get());
+    return result;
+}
+
+} // anonymous namespace
+
+template<armnn::DataType ArmnnType, typename T>
+LayerTestResult<T, 4> 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<float> input          = { 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f };
+    std::vector<float> 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<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
+}
+
+template<armnn::DataType ArmnnType, typename T>
+LayerTestResult<T, 4> 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<float> 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<float> 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<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
+}
+
+template<armnn::DataType ArmnnType, typename T>
+LayerTestResult<T, 4> 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<float> input =
+    {
+        1.f, 2.f, 3.f, 4.f, // batch 0
+        5.f, 6.f, 7.f, 8.f  // batch 1
+    };
+
+    std::vector<float> 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<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
+}
+
+template<armnn::DataType ArmnnType, typename T>
+LayerTestResult<T, 4> 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<float> 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<float> 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<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
+}
+
+// Float32
+template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
+DepthToSpaceTest1<armnn::DataType::Float32>(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    armnn::DataLayout dataLayout);
+
+template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
+DepthToSpaceTest2<armnn::DataType::Float32>(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    armnn::DataLayout dataLayout);
+
+template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
+DepthToSpaceTest3<armnn::DataType::Float32>(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    armnn::DataLayout dataLayout);
+
+template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
+DepthToSpaceTest4<armnn::DataType::Float32>(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    armnn::DataLayout dataLayout);
+
+// Float16
+template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
+DepthToSpaceTest1<armnn::DataType::Float16>(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    armnn::DataLayout dataLayout);
+
+template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
+DepthToSpaceTest2<armnn::DataType::Float16>(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    armnn::DataLayout dataLayout);
+
+template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
+DepthToSpaceTest3<armnn::DataType::Float16>(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    armnn::DataLayout dataLayout);
+
+template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
+DepthToSpaceTest4<armnn::DataType::Float16>(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    armnn::DataLayout dataLayout);
+
+// QuantisedAsymm8
+template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
+DepthToSpaceTest1<armnn::DataType::QuantisedAsymm8>(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    armnn::DataLayout dataLayout);
+
+template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
+DepthToSpaceTest2<armnn::DataType::QuantisedAsymm8>(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    armnn::DataLayout dataLayout);
+
+template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
+DepthToSpaceTest3<armnn::DataType::QuantisedAsymm8>(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    armnn::DataLayout dataLayout);
+
+template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
+DepthToSpaceTest4<armnn::DataType::QuantisedAsymm8>(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    armnn::DataLayout dataLayout);
+
+// QuantisedSymm16
+template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
+DepthToSpaceTest1<armnn::DataType::QuantisedSymm16>(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    armnn::DataLayout dataLayout);
+
+template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
+DepthToSpaceTest2<armnn::DataType::QuantisedSymm16>(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    armnn::DataLayout dataLayout);
+
+template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
+DepthToSpaceTest3<armnn::DataType::QuantisedSymm16>(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    armnn::DataLayout dataLayout);
+
+template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
+DepthToSpaceTest4<armnn::DataType::QuantisedSymm16>(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    armnn::DataLayout dataLayout);