IVGCVSW-4707 - Add AlignCorners and HalfPixelCenters to Resize

 * Added AlignCorners and HalfPixelCenters Parameters to Resize
 * Added Unit Tests

Signed-off-by: David Monahan <david.monahan@arm.com>
Change-Id: I83420a9bcb7beec9073d201448f64eb53090e1f1
diff --git a/src/backends/backendsCommon/test/layerTests/ResizeTestImpl.cpp b/src/backends/backendsCommon/test/layerTests/ResizeTestImpl.cpp
index f12f53c..72507d3 100644
--- a/src/backends/backendsCommon/test/layerTests/ResizeTestImpl.cpp
+++ b/src/backends/backendsCommon/test/layerTests/ResizeTestImpl.cpp
@@ -29,7 +29,9 @@
         , m_InQuantScale(1.0f)
         , m_InQuantOffset(0)
         , m_OutQuantScale(1.0f)
-        , m_OutQuantOffset(0) {}
+        , m_OutQuantOffset(0)
+        , m_AlignCorners(false)
+        , m_HalfPixelCenters(false) {}
 
     armnn::ResizeMethod m_ResizeMethod;
     armnn::DataLayout   m_DataLayout;
@@ -46,6 +48,9 @@
     float               m_OutQuantScale;
     int32_t             m_OutQuantOffset;
 
+    bool m_AlignCorners;
+    bool m_HalfPixelCenters;
+
     void SetInQuantParams(float quantScale, int32_t quantOffset)
     {
         m_InQuantScale   = quantScale;
@@ -111,6 +116,8 @@
     armnn::ResizeQueueDescriptor descriptor;
     descriptor.m_Parameters.m_Method     = params.m_ResizeMethod;
     descriptor.m_Parameters.m_DataLayout = params.m_DataLayout;
+    descriptor.m_Parameters.m_AlignCorners = params.m_AlignCorners;
+    descriptor.m_Parameters.m_HalfPixelCenters = params.m_HalfPixelCenters;
 
     armnnUtils::DataLayoutIndexed dataLayoutIndexed(params.m_DataLayout);
     descriptor.m_Parameters.m_TargetWidth  = params.m_OutputShape[dataLayoutIndexed.GetWidthIndex()];
@@ -528,6 +535,129 @@
     return ResizeTestImpl<4, ArmnnType>(workloadFactory, memoryManager, testParams);
 }
 
+template<armnn::DataType ArmnnType, typename T>
+LayerTestResult<T, 4> HalfPixelCentersResizeBilinearTest(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    const armnn::DataLayout dataLayout)
+{
+    ResizeTestParams testParams;
+    testParams.m_ResizeMethod = armnn::ResizeMethod::Bilinear;
+    testParams.m_DataLayout   = dataLayout;
+    testParams.m_HalfPixelCenters = true;
+
+    testParams.m_InputShape  = { 2, 1, 2, 2 };
+    testParams.m_OutputShape = { 2, 1, 3, 3 };
+
+    testParams.m_InputData =
+    {
+          1.0f, 2.0f,
+          3.0f, 4.0f,
+
+          1.0f, 2.0f,
+          3.0f, 4.0f
+    };
+
+    testParams.m_ExpectedOutputData =
+    {
+          1.0f, 1.5f, 2.0f,
+          2.0f, 2.5f, 3.0f,
+          3.0f, 3.5f, 4.0f,
+
+          1.0f, 1.5f, 2.0f,
+          2.0f, 2.5f, 3.0f,
+          3.0f, 3.5f, 4.0f,
+    };
+
+    return ResizeTestImpl<4, ArmnnType>(workloadFactory, memoryManager, testParams);
+}
+
+template<armnn::DataType ArmnnType, typename T>
+LayerTestResult<T, 4> AlignCornersResizeBilinearTest(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    const armnn::DataLayout dataLayout)
+{
+    ResizeTestParams testParams;
+    testParams.m_ResizeMethod = armnn::ResizeMethod::Bilinear;
+    testParams.m_DataLayout   = dataLayout;
+    testParams.m_AlignCorners = true;
+
+    testParams.m_InputShape  = { 1, 1, 2, 2 };
+    testParams.m_OutputShape = { 1, 1, 1, 1 };
+
+    testParams.m_InputData =
+    {
+          1.0f, 2.0f,
+          3.0f, 4.0f,
+    };
+
+    testParams.m_ExpectedOutputData =
+    {
+          1.0f
+    };
+
+    return ResizeTestImpl<4, ArmnnType>(workloadFactory, memoryManager, testParams);
+}
+
+template<armnn::DataType ArmnnType, typename T>
+LayerTestResult<T, 4> HalfPixelCentersResizeNearestNeighbourTest(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    const armnn::DataLayout dataLayout)
+{
+    ResizeTestParams testParams;
+    testParams.m_ResizeMethod = armnn::ResizeMethod::NearestNeighbor;
+    testParams.m_DataLayout   = dataLayout;
+    testParams.m_HalfPixelCenters = true;
+
+    testParams.m_InputShape  = { 1, 1, 2, 5 };
+    testParams.m_OutputShape = { 1, 1, 2, 2 };
+
+    testParams.m_InputData =
+    {
+          1.0f, 2.0f, 3.0f, 4.0f, 5.0f,
+
+          1.0f, 2.0f, 3.0f, 4.0f, 5.0f
+    };
+
+    testParams.m_ExpectedOutputData =
+    {
+          2.0f, 4.0f,
+          2.0f, 4.0f
+    };
+
+    return ResizeTestImpl<4, ArmnnType>(workloadFactory, memoryManager, testParams);
+}
+
+template<armnn::DataType ArmnnType, typename T>
+LayerTestResult<T, 4> AlignCornersResizeNearestNeighbourTest(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    const armnn::DataLayout dataLayout)
+{
+    ResizeTestParams testParams;
+    testParams.m_ResizeMethod = armnn::ResizeMethod::NearestNeighbor;
+    testParams.m_DataLayout   = dataLayout;
+    testParams.m_AlignCorners = true;
+
+    testParams.m_InputShape  = { 1, 1, 2, 2 };
+    testParams.m_OutputShape = { 1, 1, 1, 1 };
+
+    testParams.m_InputData =
+    {
+          1.0f, 2.0f,
+          3.0f, 4.0f,
+    };
+
+    testParams.m_ExpectedOutputData =
+    {
+          1.0f
+    };
+
+    return ResizeTestImpl<4, ArmnnType>(workloadFactory, memoryManager, testParams);
+}
+
 //
 // Explicit template instantiations
 //
@@ -597,6 +727,30 @@
     float outQuantScale,
     int32_t outQuantOffset);
 
+template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
+HalfPixelCentersResizeBilinearTest<armnn::DataType::Float32>(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    const armnn::DataLayout dataLayout);
+
+template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
+AlignCornersResizeBilinearTest<armnn::DataType::Float32>(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    const armnn::DataLayout dataLayout);
+
+template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
+HalfPixelCentersResizeNearestNeighbourTest<armnn::DataType::Float32>(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    const armnn::DataLayout dataLayout);
+
+template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
+AlignCornersResizeNearestNeighbourTest<armnn::DataType::Float32>(
+    armnn::IWorkloadFactory& workloadFactory,
+    const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
+    const armnn::DataLayout dataLayout);
+
 // Float16
 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
 ResizeBilinearNopTest<armnn::DataType::Float16>(