COMPMID-3624: CTS failure on Resize quantized in Neon and CL

Allow computations with aligned corners when the tensors have
width/height equal to 1.

Change-Id: Ia01733f6c02e0740835b26a794b9a79fa35319b4
Signed-off-by: Michele Di Giorgio <michele.digiorgio@arm.com>
Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/3634
Tested-by: Arm Jenkins <bsgcomp@arm.com>
Reviewed-by: Sadik Armagan <sadik.armagan@arm.com>
Reviewed-by: Georgios Pinitas <georgios.pinitas@arm.com>
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
diff --git a/src/core/CL/kernels/CLScaleKernel.cpp b/src/core/CL/kernels/CLScaleKernel.cpp
index 108358b..2e7ee36 100644
--- a/src/core/CL/kernels/CLScaleKernel.cpp
+++ b/src/core/CL/kernels/CLScaleKernel.cpp
@@ -72,7 +72,7 @@
     ARM_COMPUTE_RETURN_ERROR_ON(output == input);
     ARM_COMPUTE_RETURN_ERROR_ON(info.align_corners && !arm_compute::scale_utils::is_align_corners_allowed_sampling_policy(info.sampling_policy));
 
-    const bool will_use_align_corners = info.align_corners && arm_compute::scale_utils::is_align_corners_allowed_output_shape(output->tensor_shape(), output->data_layout());
+    const bool will_use_align_corners = info.align_corners;
 
     float wr = 0.f;
     float hr = 0.f;
@@ -177,7 +177,7 @@
     _output               = output;
     _interpolation_policy = info.interpolation_policy;
     _data_layout          = input->info()->data_layout();
-    _align_corners        = info.align_corners && arm_compute::scale_utils::is_align_corners_allowed_output_shape(output->info()->tensor_shape(), _data_layout);
+    _align_corners        = info.align_corners;
 
     float wr = 0.f;
     float hr = 0.f;
diff --git a/src/core/NEON/kernels/NEScaleKernel.cpp b/src/core/NEON/kernels/NEScaleKernel.cpp
index 7ce1786..94fcfe2 100644
--- a/src/core/NEON/kernels/NEScaleKernel.cpp
+++ b/src/core/NEON/kernels/NEScaleKernel.cpp
@@ -369,7 +369,7 @@
     _border_mode           = info.border_mode;
     _constant_border_value = info.constant_border_value;
     _use_padding           = info.use_padding;
-    _align_corners         = info.align_corners && arm_compute::scale_utils::is_align_corners_allowed_output_shape(output->info()->tensor_shape(), data_layout);
+    _align_corners         = info.align_corners;
 
     if(info.sampling_policy == SamplingPolicy::CENTER)
     {
diff --git a/src/core/utils/ScaleUtils.cpp b/src/core/utils/ScaleUtils.cpp
index bf059f7..d46ca0e 100644
--- a/src/core/utils/ScaleUtils.cpp
+++ b/src/core/utils/ScaleUtils.cpp
@@ -26,7 +26,7 @@
 
 float arm_compute::scale_utils::calculate_resize_ratio(size_t input_size, size_t output_size, bool align_corners)
 {
-    const size_t offset = align_corners ? 1 : 0;
+    const size_t offset = (align_corners && output_size > 1) ? 1 : 0;
     const auto   in     = input_size - offset;
     const auto   out    = output_size - offset;
 
@@ -34,11 +34,4 @@
     ARM_COMPUTE_ERROR_ON(out == 0);
 
     return static_cast<float>(in) / static_cast<float>(out);
-}
-
-bool arm_compute::scale_utils::is_align_corners_allowed_output_shape(const TensorShape &output_shape, DataLayout layout)
-{
-    const size_t idx_width  = get_data_layout_dimension_index(layout, DataLayoutDimension::WIDTH);
-    const size_t idx_height = get_data_layout_dimension_index(layout, DataLayoutDimension::HEIGHT);
-    return (output_shape[idx_width] > 1) && (output_shape[idx_height] > 1);
 }
\ No newline at end of file
diff --git a/src/core/utils/ScaleUtils.h b/src/core/utils/ScaleUtils.h
index 894bd1e..3cc986b 100644
--- a/src/core/utils/ScaleUtils.h
+++ b/src/core/utils/ScaleUtils.h
@@ -53,15 +53,6 @@
 {
     return sampling_policy != SamplingPolicy::CENTER;
 }
-
-/** Returns if aligned corners are allowed for the given output shape
- *
- * @param[in] output_shape The shape of the scaled output tensor
- * @param[in] layout       The data layout of the output tensor
- *
- * @return True if aligned corners are allowed
- */
-bool is_align_corners_allowed_output_shape(const TensorShape &output_shape, DataLayout layout);
 } // namespace scale_utils
 } // namespace arm_compute
 #endif /* UTILS_CORE_SCALEUTILS_H */
\ No newline at end of file
diff --git a/src/runtime/NEON/functions/NEScale.cpp b/src/runtime/NEON/functions/NEScale.cpp
index 411f663..424049f 100644
--- a/src/runtime/NEON/functions/NEScale.cpp
+++ b/src/runtime/NEON/functions/NEScale.cpp
@@ -111,8 +111,7 @@
     ARM_COMPUTE_ERROR_THROW_ON(NEScale::validate(input->info(), output->info(), info));
 
     _use_padding                     = info.use_padding;
-    const bool is_align_corners_used = info.align_corners && arm_compute::scale_utils::is_align_corners_allowed_sampling_policy(info.sampling_policy)
-                                       && arm_compute::scale_utils::is_align_corners_allowed_output_shape(output->info()->tensor_shape(), output->info()->data_layout());
+    const bool is_align_corners_used = info.align_corners && arm_compute::scale_utils::is_align_corners_allowed_sampling_policy(info.sampling_policy);
 
     // Get data layout and width/height indices
     const DataLayout data_layout = input->info()->data_layout();
diff --git a/tests/validation/reference/Scale.cpp b/tests/validation/reference/Scale.cpp
index 0c8f5ba..aa265c2 100644
--- a/tests/validation/reference/Scale.cpp
+++ b/tests/validation/reference/Scale.cpp
@@ -48,8 +48,6 @@
     shape_scaled.set(1, (in.shape()[1] + round_value) * scale_y, /* apply_dim_correction = */ false);
     SimpleTensor<T> out(shape_scaled, in.data_type());
 
-    align_corners = align_corners && arm_compute::scale_utils::is_align_corners_allowed_output_shape(out.shape(), DataLayout::NCHW);
-
     // Compute the ratio between source width/height and destination width/height
     const auto wr = arm_compute::scale_utils::calculate_resize_ratio(in.shape()[0], out.shape()[0], align_corners);
     const auto hr = arm_compute::scale_utils::calculate_resize_ratio(in.shape()[1], out.shape()[1], align_corners);