From 6727f12b7d5e29a98e42e846ca012a56e930fd33 Mon Sep 17 00:00:00 2001 From: Georgios Pinitas Date: Tue, 13 Mar 2018 10:29:13 +0000 Subject: Revert "COMPMID-959: Fix valid region for Scale by always setting full shape" This reverts commit 77fdc0420dfd3c5009370650f963748a73f0db58. Change-Id: I1440f56f29637821e20ad2edf1055196bb69a0e2 Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/124290 Tested-by: Jenkins Reviewed-by: Isabella Gottardi --- arm_compute/core/Helpers.h | 15 ++++++----- arm_compute/core/Helpers.inl | 33 +++++++++++++++++++++++++ arm_compute/core/utils/misc/utility.h | 8 ------ src/core/CL/kernels/CLScaleKernel.cpp | 2 +- src/core/GLES_COMPUTE/kernels/GCScaleKernel.cpp | 3 ++- src/core/Helpers.cpp | 12 --------- src/core/NEON/kernels/NEScaleKernel.cpp | 6 +---- tests/validation/CL/Scale.cpp | 18 +++++++------- tests/validation/GLES_COMPUTE/Scale.cpp | 6 ++--- tests/validation/NEON/Scale.cpp | 14 +++++------ 10 files changed, 63 insertions(+), 54 deletions(-) diff --git a/arm_compute/core/Helpers.h b/arm_compute/core/Helpers.h index c412d21447..24ba521d60 100644 --- a/arm_compute/core/Helpers.h +++ b/arm_compute/core/Helpers.h @@ -620,16 +620,15 @@ bool set_quantization_info_if_empty(ITensorInfo &info, QuantizationInfo quantiza /** Helper function to calculate the Valid Region for Scale. * - * @param[in] src_info Input tensor info used to check. - * @param[in] dst_shape Shape of the output. - * @param[in] interpolate_policy Interpolation policy. - * @param[in] sampling_policy Sampling policy. - * @param[in] border_undefined True if the border is undefined. + * @param[in] src_info Input tensor info used to check. + * @param[in] dst_shape Shape of the output. + * @param[in] policy Interpolation policy. + * @param[in] border_size Size of the border. + * @param[in] border_undefined True if the border is undefined. * - * @return The corresponding valid region + * @return The corrispondent valid region */ -ValidRegion calculate_valid_region_scale(const ITensorInfo &src_info, const TensorShape &dst_shape, - InterpolationPolicy interpolate_policy, SamplingPolicy sampling_policy, bool border_undefined); +ValidRegion calculate_valid_region_scale(const ITensorInfo &src_info, const TensorShape &dst_shape, InterpolationPolicy policy, BorderSize border_size, bool border_undefined); /** Convert a linear index into n-dimensional coordinates. * diff --git a/arm_compute/core/Helpers.inl b/arm_compute/core/Helpers.inl index b359811328..3db8369f08 100644 --- a/arm_compute/core/Helpers.inl +++ b/arm_compute/core/Helpers.inl @@ -300,6 +300,39 @@ inline bool set_quantization_info_if_empty(ITensorInfo &info, QuantizationInfo q return false; } +inline ValidRegion calculate_valid_region_scale(const ITensorInfo &src_info, const TensorShape &dst_shape, InterpolationPolicy policy, BorderSize border_size, bool border_undefined) +{ + const auto wr = static_cast(dst_shape[0]) / static_cast(src_info.tensor_shape()[0]); + const auto hr = static_cast(dst_shape[1]) / static_cast(src_info.tensor_shape()[1]); + + ValidRegion valid_region{ Coordinates(), dst_shape, src_info.tensor_shape().num_dimensions() }; + + Coordinates &anchor = valid_region.anchor; + TensorShape &shape = valid_region.shape; + + anchor.set(0, (policy == InterpolationPolicy::BILINEAR + && border_undefined) ? + ((static_cast(src_info.valid_region().anchor[0]) + border_size.left + 0.5f) * wr - 0.5f) : + ((static_cast(src_info.valid_region().anchor[0]) + 0.5f) * wr - 0.5f)); + anchor.set(1, (policy == InterpolationPolicy::BILINEAR + && border_undefined) ? + ((static_cast(src_info.valid_region().anchor[1]) + border_size.top + 0.5f) * hr - 0.5f) : + ((static_cast(src_info.valid_region().anchor[1]) + 0.5f) * hr - 0.5f)); + float shape_out_x = (policy == InterpolationPolicy::BILINEAR + && border_undefined) ? + ((static_cast(src_info.valid_region().anchor[0]) + static_cast(src_info.valid_region().shape[0]) - 1) - 1 + 0.5f) * wr - 0.5f : + ((static_cast(src_info.valid_region().anchor[0]) + static_cast(src_info.valid_region().shape[0])) + 0.5f) * wr - 0.5f; + float shape_out_y = (policy == InterpolationPolicy::BILINEAR + && border_undefined) ? + ((static_cast(src_info.valid_region().anchor[1]) + static_cast(src_info.valid_region().shape[1]) - 1) - 1 + 0.5f) * hr - 0.5f : + ((static_cast(src_info.valid_region().anchor[1]) + static_cast(src_info.valid_region().shape[1])) + 0.5f) * hr - 0.5f; + + shape.set(0, shape_out_x - anchor[0]); + shape.set(1, shape_out_y - anchor[1]); + + return valid_region; +} + inline Coordinates index2coords(const TensorShape &shape, int index) { int num_elements = shape.total_size(); diff --git a/arm_compute/core/utils/misc/utility.h b/arm_compute/core/utils/misc/utility.h index d6f555b5f3..8ba92310da 100644 --- a/arm_compute/core/utils/misc/utility.h +++ b/arm_compute/core/utils/misc/utility.h @@ -165,14 +165,6 @@ std::vector sort_indices(const std::vector &v) return idx; } -/** Ignores the given arguments - * - * @tparam T Arguments types - */ -template -inline void ignore_unused(T &&...) -{ -} } // namespace utility } // namespace arm_compute #endif /* __ARM_COMPUTE_MISC_UTILITY_H__ */ diff --git a/src/core/CL/kernels/CLScaleKernel.cpp b/src/core/CL/kernels/CLScaleKernel.cpp index 9b8a582349..f3d918514e 100644 --- a/src/core/CL/kernels/CLScaleKernel.cpp +++ b/src/core/CL/kernels/CLScaleKernel.cpp @@ -102,7 +102,7 @@ void CLScaleKernel::configure(const ICLTensor *input, ICLTensor *output, Interpo output_access.set_valid_region(win, calculate_valid_region_scale(*(input->info()), output->info()->tensor_shape(), policy, - sampling_policy, + border, border_undefined)); ICLKernel::configure(win); diff --git a/src/core/GLES_COMPUTE/kernels/GCScaleKernel.cpp b/src/core/GLES_COMPUTE/kernels/GCScaleKernel.cpp index f87615a27c..46d7ff9172 100644 --- a/src/core/GLES_COMPUTE/kernels/GCScaleKernel.cpp +++ b/src/core/GLES_COMPUTE/kernels/GCScaleKernel.cpp @@ -51,6 +51,7 @@ void GCScaleKernel::configure(const IGCTensor *input, IGCTensor *output, Interpo ARM_COMPUTE_ERROR_ON_MISMATCHING_DATA_TYPES(input, output); ARM_COMPUTE_ERROR_ON(output == input); ARM_COMPUTE_ERROR_ON(policy != InterpolationPolicy::NEAREST_NEIGHBOR); + ARM_COMPUTE_UNUSED(sampling_policy); _input = input; _output = output; @@ -122,7 +123,7 @@ void GCScaleKernel::configure(const IGCTensor *input, IGCTensor *output, Interpo output_access.set_valid_region(win, calculate_valid_region_scale(*(input->info()), output->info()->tensor_shape(), policy, - sampling_policy, + border, border_undefined)); IGCKernel::configure(win); diff --git a/src/core/Helpers.cpp b/src/core/Helpers.cpp index cbebf8a163..0e7cd99eab 100644 --- a/src/core/Helpers.cpp +++ b/src/core/Helpers.cpp @@ -173,15 +173,3 @@ Window arm_compute::calculate_max_window_horizontal(const ValidRegion &valid_reg return window; } - -ValidRegion arm_compute::calculate_valid_region_scale(const ITensorInfo &src_info, const TensorShape &dst_shape, - InterpolationPolicy interpolate_policy, SamplingPolicy sampling_policy, bool border_undefined) -{ - /* TODO (COMPMID-959) : Fix scale valid region */ - arm_compute::utility::ignore_unused(src_info, interpolate_policy, sampling_policy, border_undefined); - - // Setup output valid region - ValidRegion valid_region{ Coordinates(), dst_shape }; - - return valid_region; -} \ No newline at end of file diff --git a/src/core/NEON/kernels/NEScaleKernel.cpp b/src/core/NEON/kernels/NEScaleKernel.cpp index 852ec3e023..b5677dedac 100644 --- a/src/core/NEON/kernels/NEScaleKernel.cpp +++ b/src/core/NEON/kernels/NEScaleKernel.cpp @@ -142,11 +142,7 @@ void NEScaleKernel::configure(const ITensor *input, const ITensor *dx, const ITe dy_access, output_access); - output_access.set_valid_region(win, calculate_valid_region_scale(*(input->info()), - output->info()->tensor_shape(), - policy, - sampling_policy, - border_undefined)); + output_access.set_valid_region(win, calculate_valid_region_scale(*(input->info()), output->info()->tensor_shape(), policy, border_size(), border_undefined)); INEKernel::configure(win); } diff --git a/tests/validation/CL/Scale.cpp b/tests/validation/CL/Scale.cpp index f314ddd3d9..c7a8e2ab6e 100644 --- a/tests/validation/CL/Scale.cpp +++ b/tests/validation/CL/Scale.cpp @@ -98,7 +98,7 @@ DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(combi const BorderSize border_size(border_mode == BorderMode::UNDEFINED ? 0 : 1); // Validate valid region - const ValidRegion dst_valid_region = calculate_valid_region_scale(*(src.info()), shape_scaled, policy, sampling_policy, (border_mode == BorderMode::UNDEFINED)); + const ValidRegion dst_valid_region = calculate_valid_region_scale(*(src.info()), shape_scaled, policy, border_size, (border_mode == BorderMode::UNDEFINED)); validate(dst.info()->valid_region(), dst_valid_region); // Validate padding @@ -123,7 +123,7 @@ FIXTURE_DATA_TEST_CASE(RunSmall, CLScaleFixture, framework::DatasetMode:: { //Create valid region TensorInfo src_info(_shape, 1, _data_type); - const ValidRegion valid_region = shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(1)); + const ValidRegion valid_region = calculate_valid_region_scale(src_info, _reference.shape(), _policy, BorderSize(1), (_border_mode == BorderMode::UNDEFINED)); // Validate output validate(CLAccessor(_target), _reference, valid_region, tolerance_f32, tolerance_num_f32); @@ -135,7 +135,7 @@ FIXTURE_DATA_TEST_CASE(RunLarge, CLScaleFixture, framework::DatasetMode:: { //Create valid region TensorInfo src_info(_shape, 1, _data_type); - const ValidRegion valid_region = shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(1)); + const ValidRegion valid_region = calculate_valid_region_scale(src_info, _reference.shape(), _policy, BorderSize(1), (_border_mode == BorderMode::UNDEFINED)); // Validate output validate(CLAccessor(_target), _reference, valid_region, tolerance_f32, tolerance_num_f32); @@ -149,7 +149,7 @@ FIXTURE_DATA_TEST_CASE(RunSmall, CLScaleFixture, framework::DatasetMode::A { //Create valid region TensorInfo src_info(_shape, 1, _data_type); - const ValidRegion valid_region = shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(1)); + const ValidRegion valid_region = calculate_valid_region_scale(src_info, _reference.shape(), _policy, BorderSize(1), (_border_mode == BorderMode::UNDEFINED)); // Validate output validate(CLAccessor(_target), _reference, valid_region, tolerance_f16); @@ -162,7 +162,7 @@ FIXTURE_DATA_TEST_CASE(RunLarge, CLScaleFixture, framework::DatasetMode::N { //Create valid region TensorInfo src_info(_shape, 1, _data_type); - const ValidRegion valid_region = shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(1)); + const ValidRegion valid_region = calculate_valid_region_scale(src_info, _reference.shape(), _policy, BorderSize(1), (_border_mode == BorderMode::UNDEFINED)); // Validate output validate(CLAccessor(_target), _reference, valid_region, tolerance_f16); @@ -179,7 +179,7 @@ FIXTURE_DATA_TEST_CASE(RunSmall, CLScaleFixture, framework::DatasetMode { //Create valid region TensorInfo src_info(_shape, 1, _data_type); - const ValidRegion valid_region = shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(1)); + const ValidRegion valid_region = calculate_valid_region_scale(src_info, _reference.shape(), _policy, BorderSize(1), (_border_mode == BorderMode::UNDEFINED)); // Validate output validate(CLAccessor(_target), _reference, valid_region, tolerance_u8); @@ -191,7 +191,7 @@ FIXTURE_DATA_TEST_CASE(RunLarge, CLScaleFixture, framework::DatasetMode { //Create valid region TensorInfo src_info(_shape, 1, _data_type); - const ValidRegion valid_region = shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(1)); + const ValidRegion valid_region = calculate_valid_region_scale(src_info, _reference.shape(), _policy, BorderSize(1), (_border_mode == BorderMode::UNDEFINED)); // Validate output validate(CLAccessor(_target), _reference, valid_region, tolerance_u8); @@ -205,7 +205,7 @@ FIXTURE_DATA_TEST_CASE(RunSmall, CLScaleFixture, framework::DatasetMode { //Create valid region TensorInfo src_info(_shape, 1, _data_type); - const ValidRegion valid_region = shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(1)); + const ValidRegion valid_region = calculate_valid_region_scale(src_info, _reference.shape(), _policy, BorderSize(1), (_border_mode == BorderMode::UNDEFINED)); // Validate output validate(CLAccessor(_target), _reference, valid_region, tolerance_s16); @@ -218,7 +218,7 @@ FIXTURE_DATA_TEST_CASE(RunLarge, CLScaleFixture, framework::DatasetMode { //Create valid region TensorInfo src_info(_shape, 1, _data_type); - const ValidRegion valid_region = shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(1)); + const ValidRegion valid_region = calculate_valid_region_scale(src_info, _reference.shape(), _policy, BorderSize(1), (_border_mode == BorderMode::UNDEFINED)); // Validate output validate(CLAccessor(_target), _reference, valid_region, tolerance_s16); diff --git a/tests/validation/GLES_COMPUTE/Scale.cpp b/tests/validation/GLES_COMPUTE/Scale.cpp index 369d7f5244..16280faf3e 100644 --- a/tests/validation/GLES_COMPUTE/Scale.cpp +++ b/tests/validation/GLES_COMPUTE/Scale.cpp @@ -90,7 +90,7 @@ DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(combi const BorderSize border_size(border_mode == BorderMode::UNDEFINED ? 0 : 1); // Validate valid region - const ValidRegion dst_valid_region = calculate_valid_region_scale(*(src.info()), shape_scaled, policy, sampling_policy, (border_mode == BorderMode::UNDEFINED)); + const ValidRegion dst_valid_region = calculate_valid_region_scale(*(src.info()), shape_scaled, policy, border_size, (border_mode == BorderMode::UNDEFINED)); validate(dst.info()->valid_region(), dst_valid_region); // Validate padding @@ -115,7 +115,7 @@ FIXTURE_DATA_TEST_CASE(RunSmall, GCScaleFixture, framework::DatasetMode::A { //Create valid region TensorInfo src_info(_shape, 1, _data_type); - const ValidRegion valid_region = shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(1)); + const ValidRegion valid_region = calculate_valid_region_scale(src_info, _reference.shape(), _policy, BorderSize(1), (_border_mode == BorderMode::UNDEFINED)); // Validate output validate(GCAccessor(_target), _reference, valid_region, tolerance_f16); @@ -128,7 +128,7 @@ FIXTURE_DATA_TEST_CASE(RunLarge, GCScaleFixture, framework::DatasetMode::N { //Create valid region TensorInfo src_info(_shape, 1, _data_type); - const ValidRegion valid_region = shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(1)); + const ValidRegion valid_region = calculate_valid_region_scale(src_info, _reference.shape(), _policy, BorderSize(1), (_border_mode == BorderMode::UNDEFINED)); // Validate output validate(GCAccessor(_target), _reference, valid_region, tolerance_f16); diff --git a/tests/validation/NEON/Scale.cpp b/tests/validation/NEON/Scale.cpp index b5c36cd9d7..d860823430 100644 --- a/tests/validation/NEON/Scale.cpp +++ b/tests/validation/NEON/Scale.cpp @@ -99,7 +99,7 @@ DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(combi nescale.configure(&src, &dst, policy, border_mode, constant_border_value, sampling_policy); // Validate valid region - const ValidRegion dst_valid_region = calculate_valid_region_scale(*(src.info()), shape_scaled, policy, sampling_policy, (border_mode == BorderMode::UNDEFINED)); + const ValidRegion dst_valid_region = calculate_valid_region_scale(*(src.info()), shape_scaled, policy, BorderSize(1), (border_mode == BorderMode::UNDEFINED)); validate(dst.info()->valid_region(), dst_valid_region); @@ -126,7 +126,7 @@ FIXTURE_DATA_TEST_CASE(RunSmall, NEScaleFixture, framework::DatasetMode:: { //Create valid region TensorInfo src_info(_shape, 1, _data_type); - ValidRegion valid_region = shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(1)); + ValidRegion valid_region = calculate_valid_region_scale(src_info, _reference.shape(), _policy, BorderSize(1), (_border_mode == BorderMode::UNDEFINED)); // Validate output validate(Accessor(_target), _reference, valid_region, tolerance_f32, tolerance_num_f32); @@ -139,7 +139,7 @@ FIXTURE_DATA_TEST_CASE(RunLarge, NEScaleFixture, framework::DatasetMode:: { //Create valid region TensorInfo src_info(_shape, 1, _data_type); - ValidRegion valid_region = shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(1)); + ValidRegion valid_region = calculate_valid_region_scale(src_info, _reference.shape(), _policy, BorderSize(1), (_border_mode == BorderMode::UNDEFINED)); // Validate output validate(Accessor(_target), _reference, valid_region, tolerance_f32, tolerance_num_f32); @@ -157,7 +157,7 @@ FIXTURE_DATA_TEST_CASE(RunSmall, NEScaleFixture, framework::DatasetMode { //Create valid region TensorInfo src_info(_shape, 1, _data_type); - ValidRegion valid_region = shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(1)); + ValidRegion valid_region = calculate_valid_region_scale(src_info, _reference.shape(), _policy, BorderSize(1), (_border_mode == BorderMode::UNDEFINED)); // Validate output validate(Accessor(_target), _reference, valid_region, tolerance_u8); @@ -170,7 +170,7 @@ FIXTURE_DATA_TEST_CASE(RunLarge, NEScaleFixture, framework::DatasetMode { //Create valid region TensorInfo src_info(_shape, 1, _data_type); - ValidRegion valid_region = shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(1)); + ValidRegion valid_region = calculate_valid_region_scale(src_info, _reference.shape(), _policy, BorderSize(1), (_border_mode == BorderMode::UNDEFINED)); // Validate output validate(Accessor(_target), _reference, valid_region, tolerance_u8); @@ -185,7 +185,7 @@ FIXTURE_DATA_TEST_CASE(RunSmall, NEScaleFixture, framework::DatasetMode { //Create valid region TensorInfo src_info(_shape, 1, _data_type); - ValidRegion valid_region = shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(1)); + ValidRegion valid_region = calculate_valid_region_scale(src_info, _reference.shape(), _policy, BorderSize(1), (_border_mode == BorderMode::UNDEFINED)); // Validate output validate(Accessor(_target), _reference, valid_region, tolerance_s16, tolerance_num_s16); @@ -198,7 +198,7 @@ FIXTURE_DATA_TEST_CASE(RunLarge, NEScaleFixture, framework::DatasetMode { //Create valid region TensorInfo src_info(_shape, 1, _data_type); - ValidRegion valid_region = shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(1)); + ValidRegion valid_region = calculate_valid_region_scale(src_info, _reference.shape(), _policy, BorderSize(1), (_border_mode == BorderMode::UNDEFINED)); // Validate output validate(Accessor(_target), _reference, valid_region, tolerance_s16, tolerance_num_s16); -- cgit v1.2.1