IVGCVSW-3361 Add end-to-end tests for Resize on CpuRef

Signed-off-by: Aron Virginas-Tar <Aron.Virginas-Tar@arm.com>
Change-Id: Ie89dc91a2fc0281d58c6f1ccef65ed1228d33ccb
diff --git a/include/armnn/Descriptors.hpp b/include/armnn/Descriptors.hpp
index 8f72c54..85e8b56 100644
--- a/include/armnn/Descriptors.hpp
+++ b/include/armnn/Descriptors.hpp
@@ -514,9 +514,9 @@
     {}
 
     /// Target width value.
-    uint32_t          m_TargetWidth;
+    uint32_t m_TargetWidth;
     /// Target height value.
-    uint32_t          m_TargetHeight;
+    uint32_t m_TargetHeight;
     /// The Interpolation method to use
     /// (Bilinear, NearestNeighbor).
     ResizeMethod m_Method;
diff --git a/src/backends/backendsCommon/test/CMakeLists.txt b/src/backends/backendsCommon/test/CMakeLists.txt
index caf2dd3..bc91bee 100644
--- a/src/backends/backendsCommon/test/CMakeLists.txt
+++ b/src/backends/backendsCommon/test/CMakeLists.txt
@@ -42,6 +42,7 @@
     Pooling2dTestImpl.hpp
     QuantizeHelper.hpp
     QuantizeTestImpl.hpp
+    ResizeEndToEndTestImpl.hpp
     RuntimeTestImpl.hpp
     SoftmaxTestImpl.hpp
     SpaceToDepthTestImpl.hpp
diff --git a/src/backends/backendsCommon/test/ResizeEndToEndTestImpl.hpp b/src/backends/backendsCommon/test/ResizeEndToEndTestImpl.hpp
new file mode 100644
index 0000000..4bf9d51
--- /dev/null
+++ b/src/backends/backendsCommon/test/ResizeEndToEndTestImpl.hpp
@@ -0,0 +1,147 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+#pragma once
+
+#include "QuantizeHelper.hpp"
+
+#include <armnn/ArmNN.hpp>
+
+#include <Permute.hpp>
+#include <ResolveType.hpp>
+
+#include <backendsCommon/test/CommonTestUtils.hpp>
+
+#include <boost/test/unit_test.hpp>
+
+#include <map>
+#include <vector>
+
+namespace
+{
+
+armnn::INetworkPtr CreateResizeNetwork(const armnn::ResizeDescriptor& descriptor,
+                                       const armnn::TensorInfo& inputInfo,
+                                       const armnn::TensorInfo& outputInfo)
+{
+    using namespace armnn;
+
+    INetworkPtr network(INetwork::Create());
+    IConnectableLayer* input  = network->AddInputLayer(0, "input");
+    IConnectableLayer* resize = network->AddResizeLayer(descriptor, "resize");
+    IConnectableLayer* output = network->AddOutputLayer(0, "output");
+
+    Connect(input, resize, inputInfo, 0, 0);
+    Connect(resize, output, outputInfo, 0, 0);
+
+    return network;
+}
+
+template<armnn::DataType ArmnnType>
+void ResizeEndToEnd(const std::vector<armnn::BackendId>& backends,
+                    armnn::DataLayout dataLayout,
+                    armnn::ResizeMethod resizeMethod)
+{
+    using namespace armnn;
+    using T = ResolveType<ArmnnType>;
+
+    constexpr unsigned int inputWidth  = 3u;
+    constexpr unsigned int inputHeight = inputWidth;
+
+    constexpr unsigned int outputWidth  = 5u;
+    constexpr unsigned int outputHeight = outputWidth;
+
+    TensorShape inputShape  = MakeTensorShape(1, 1, inputHeight, inputWidth, dataLayout);
+    TensorShape outputShape = MakeTensorShape(1, 1, outputHeight, outputWidth, dataLayout);
+
+    const float   qScale  = IsQuantizedType<T>() ? 0.25f : 1.0f;
+    const int32_t qOffset = IsQuantizedType<T>() ? 50    : 0;
+
+    TensorInfo inputInfo(inputShape, ArmnnType, qScale, qOffset);
+    TensorInfo outputInfo(outputShape, ArmnnType, qScale, qOffset);
+
+    std::vector<float> inputData =
+    {
+       1.f, 2.f, 3.f,
+       4.f, 5.f, 6.f,
+       7.f, 8.f, 9.f
+    };
+
+    std::vector<float> expectedOutputData;
+    switch(resizeMethod)
+    {
+        case ResizeMethod::Bilinear:
+        {
+            expectedOutputData =
+            {
+                1.0f, 1.6f, 2.2f, 2.8f, 3.0f,
+                2.8f, 3.4f, 4.0f, 4.6f, 4.8f,
+                4.6f, 5.2f, 5.8f, 6.4f, 6.6f,
+                6.4f, 7.0f, 7.6f, 8.2f, 8.4f,
+                7.0f, 7.6f, 8.2f, 8.8f, 9.0f
+            };
+            break;
+        }
+        case ResizeMethod::NearestNeighbor:
+        {
+            expectedOutputData =
+            {
+                1.f, 1.f, 2.f, 2.f, 3.f,
+                1.f, 1.f, 2.f, 2.f, 3.f,
+                4.f, 4.f, 5.f, 5.f, 6.f,
+                4.f, 4.f, 5.f, 5.f, 6.f,
+                7.f, 7.f, 8.f, 8.f, 9.f
+            };
+            break;
+        }
+        default:
+        {
+            throw InvalidArgumentException("Unrecognized resize method");
+        }
+    }
+
+    ResizeDescriptor descriptor;
+    descriptor.m_TargetWidth  = outputWidth;
+    descriptor.m_TargetHeight = outputHeight;
+    descriptor.m_Method       = resizeMethod;
+    descriptor.m_DataLayout   = dataLayout;
+
+    // swizzle data if needed
+    if (dataLayout == armnn::DataLayout::NHWC)
+    {
+        constexpr size_t dataTypeSize = sizeof(float);
+        const armnn::PermutationVector nchwToNhwc = { 0, 3, 1, 2 };
+
+        std::vector<float> tmp(inputData.size());
+        armnnUtils::Permute(inputInfo.GetShape(), nchwToNhwc, inputData.data(), tmp.data(), dataTypeSize);
+        inputData = tmp;
+    }
+
+    // quantize data
+    std::vector<T> qInputData          = QuantizedVector<T>(qScale, qOffset, inputData);
+    std::vector<T> qExpectedOutputData = QuantizedVector<T>(qScale, qOffset, expectedOutputData);
+
+    INetworkPtr network = CreateResizeNetwork(descriptor, inputInfo, outputInfo);
+
+    EndToEndLayerTestImpl<ArmnnType, ArmnnType>(std::move(network),
+                                                { { 0, qInputData } },
+                                                { { 0, qExpectedOutputData } },
+                                                backends);
+}
+
+} // anonymous namespace
+
+template<armnn::DataType ArmnnType>
+void ResizeBilinearEndToEnd(const std::vector<armnn::BackendId>& backends,
+                            armnn::DataLayout dataLayout)
+{
+    ResizeEndToEnd<ArmnnType>(backends, dataLayout, armnn::ResizeMethod::Bilinear);
+}
+
+template<armnn::DataType ArmnnType>
+void ResizeNearestNeighborEndToEnd(const std::vector<armnn::BackendId>& backends,
+                                   armnn::DataLayout dataLayout)
+{
+    ResizeEndToEnd<ArmnnType>(backends, dataLayout, armnn::ResizeMethod::NearestNeighbor);
+}
\ No newline at end of file
diff --git a/src/backends/reference/test/RefEndToEndTests.cpp b/src/backends/reference/test/RefEndToEndTests.cpp
index a528a54..58f1284 100644
--- a/src/backends/reference/test/RefEndToEndTests.cpp
+++ b/src/backends/reference/test/RefEndToEndTests.cpp
@@ -5,12 +5,13 @@
 
 #include <backendsCommon/test/EndToEndTestImpl.hpp>
 
+#include <backendsCommon/test/ArithmeticTestImpl.hpp>
 #include <backendsCommon/test/BatchToSpaceNdEndToEndTestImpl.hpp>
+#include <backendsCommon/test/ConcatTestImpl.hpp>
 #include <backendsCommon/test/DequantizeEndToEndTestImpl.hpp>
 #include <backendsCommon/test/DetectionPostProcessTestImpl.hpp>
 #include <backendsCommon/test/GatherEndToEndTestImpl.hpp>
-#include <backendsCommon/test/ConcatTestImpl.hpp>
-#include <backendsCommon/test/ArithmeticTestImpl.hpp>
+#include <backendsCommon/test/ResizeEndToEndTestImpl.hpp>
 #include <backendsCommon/test/SpaceToDepthEndToEndTestImpl.hpp>
 #include <backendsCommon/test/SplitterEndToEndTestImpl.hpp>
 #include <backendsCommon/test/TransposeConvolution2dEndToEndTestImpl.hpp>
@@ -968,4 +969,66 @@
         defaultBackends, armnn::DataLayout::NHWC);
 }
 
-BOOST_AUTO_TEST_SUITE_END()
+// Resize Bilinear
+BOOST_AUTO_TEST_CASE(RefResizeBilinearEndToEndFloatNchwTest)
+{
+    ResizeBilinearEndToEnd<armnn::DataType::Float32>(defaultBackends, armnn::DataLayout::NCHW);
+}
+
+BOOST_AUTO_TEST_CASE(RefResizeBilinearEndToEndUint8NchwTest)
+{
+    ResizeBilinearEndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends, armnn::DataLayout::NCHW);
+}
+
+BOOST_AUTO_TEST_CASE(RefResizeBilinearEndToEndInt16NchwTest)
+{
+    ResizeBilinearEndToEnd<armnn::DataType::QuantisedSymm16>(defaultBackends, armnn::DataLayout::NCHW);
+}
+
+BOOST_AUTO_TEST_CASE(RefResizeBilinearEndToEndFloatNhwcTest)
+{
+    ResizeBilinearEndToEnd<armnn::DataType::Float32>(defaultBackends, armnn::DataLayout::NHWC);
+}
+
+BOOST_AUTO_TEST_CASE(RefResizeBilinearEndToEndUint8NhwcTest)
+{
+    ResizeBilinearEndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends, armnn::DataLayout::NHWC);
+}
+
+BOOST_AUTO_TEST_CASE(RefResizeBilinearEndToEndInt16NhwcTest)
+{
+    ResizeBilinearEndToEnd<armnn::DataType::QuantisedSymm16>(defaultBackends, armnn::DataLayout::NHWC);
+}
+
+// Resize NearestNeighbor
+BOOST_AUTO_TEST_CASE(RefResizeNearestNeighborEndToEndFloatNchwTest)
+{
+    ResizeNearestNeighborEndToEnd<armnn::DataType::Float32>(defaultBackends, armnn::DataLayout::NCHW);
+}
+
+BOOST_AUTO_TEST_CASE(RefResizeNearestNeighborEndToEndUint8NchwTest)
+{
+    ResizeNearestNeighborEndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends, armnn::DataLayout::NCHW);
+}
+
+BOOST_AUTO_TEST_CASE(RefResizeNearestNeighborEndToEndInt16NchwTest)
+{
+    ResizeNearestNeighborEndToEnd<armnn::DataType::QuantisedSymm16>(defaultBackends, armnn::DataLayout::NCHW);
+}
+
+BOOST_AUTO_TEST_CASE(RefResizeNearestNeighborEndToEndFloatNhwcTest)
+{
+    ResizeNearestNeighborEndToEnd<armnn::DataType::Float32>(defaultBackends, armnn::DataLayout::NHWC);
+}
+
+BOOST_AUTO_TEST_CASE(RefResizeNearestNeighborEndToEndUint8NhwcTest)
+{
+    ResizeNearestNeighborEndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends, armnn::DataLayout::NHWC);
+}
+
+BOOST_AUTO_TEST_CASE(RefResizeNearestNeighborEndToEndInt16NhwcTest)
+{
+    ResizeNearestNeighborEndToEnd<armnn::DataType::QuantisedSymm16>(defaultBackends, armnn::DataLayout::NHWC);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file