diff options
author | John Richardson <john.richardson@arm.com> | 2017-08-24 12:03:42 +0100 |
---|---|---|
committer | Anthony Barbier <anthony.barbier@arm.com> | 2018-11-02 16:35:24 +0000 |
commit | 338b19559cf3f010d144687b2704777e12674c74 (patch) | |
tree | 01333de836a2fe6d6ac8f5b8624f99a220d03d67 | |
parent | d59e5b0f8b7e06517017fb9b3bd1aeb8116b1794 (diff) | |
download | ComputeLibrary-338b19559cf3f010d144687b2704777e12674c74.tar.gz |
COMPMID-502: Move MeanStdDev to new validation
Change-Id: I838dfccccaf65db7b9dc38cec20950e48445e474
Reviewed-on: http://mpd-gerrit.cambridge.arm.com/85358
Reviewed-by: Moritz Pflanzer <moritz.pflanzer@arm.com>
Reviewed-by: Anthony Barbier <anthony.barbier@arm.com>
Tested-by: Kaizen <jeremy.johnson+kaizengerrit@arm.com>
-rw-r--r-- | tests/validation/CL/MeanStdDev.cpp | 144 | ||||
-rw-r--r-- | tests/validation/NEON/MeanStdDev.cpp | 143 | ||||
-rw-r--r-- | tests/validation/Reference.cpp | 18 | ||||
-rw-r--r-- | tests/validation/Reference.h | 7 | ||||
-rw-r--r-- | tests/validation/ReferenceCPP.cpp | 8 | ||||
-rw-r--r-- | tests/validation/ReferenceCPP.h | 7 | ||||
-rw-r--r-- | tests/validation/TensorOperations.h | 23 | ||||
-rw-r--r-- | tests/validation_new/CL/MeanStdDev.cpp | 97 | ||||
-rw-r--r-- | tests/validation_new/CPP/MeanStdDev.cpp | 57 | ||||
-rw-r--r-- | tests/validation_new/CPP/MeanStdDev.h | 43 | ||||
-rw-r--r-- | tests/validation_new/NEON/MeanStdDev.cpp | 93 | ||||
-rw-r--r-- | tests/validation_new/Validation.h | 4 | ||||
-rw-r--r-- | tests/validation_new/fixtures/MeanStdDevFixture.h | 102 |
13 files changed, 394 insertions, 352 deletions
diff --git a/tests/validation/CL/MeanStdDev.cpp b/tests/validation/CL/MeanStdDev.cpp deleted file mode 100644 index 439d8f3259..0000000000 --- a/tests/validation/CL/MeanStdDev.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (c) 2017 ARM Limited. - * - * SPDX-License-Identifier: MIT - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -#include "AssetsLibrary.h" -#include "CL/CLAccessor.h" -#include "Globals.h" -#include "PaddingCalculator.h" -#include "TypePrinter.h" -#include "Utils.h" -#include "validation/Datasets.h" -#include "validation/Reference.h" -#include "validation/Validation.h" - -#include "arm_compute/core/Helpers.h" -#include "arm_compute/core/Types.h" -#include "arm_compute/runtime/CL/functions/CLMeanStdDev.h" -#include "arm_compute/runtime/Tensor.h" -#include "arm_compute/runtime/TensorAllocator.h" - -#include "boost_wrapper.h" - -#include <random> -#include <string> - -using namespace arm_compute; -using namespace arm_compute::test; -using namespace arm_compute::test::validation; - -namespace -{ -/** Compute CL mean and standard deviation function. - * - * @param[in] shape Shape of the input tensors. - * - * @return Computed mean and standard deviation. - */ -std::pair<float, float> compute_mean_and_standard_deviation(const TensorShape &shape) -{ - // Create tensor - CLTensor src = create_tensor<CLTensor>(shape, DataType::U8); - - // Create output variables - float mean = 0.f; - float std_dev = 0.f; - - // Create mean and standard deviation configure function - CLMeanStdDev mean_std_dev_image; - mean_std_dev_image.configure(&src, &mean, &std_dev); - - // Allocate tensors - src.allocator()->allocate(); - - BOOST_TEST(!src.info()->is_resizable()); - - // Fill tensor - library->fill_tensor_uniform(CLAccessor(src), 0); - - // Compute function - mean_std_dev_image.run(); - - return std::make_pair(mean, std_dev); -} -} // namespace - -#ifndef DOXYGEN_SKIP_THIS -BOOST_AUTO_TEST_SUITE(CL) -BOOST_AUTO_TEST_SUITE(MeanStdDev) - -BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit") * boost::unit_test::label("nightly")) -BOOST_DATA_TEST_CASE(Configuration, Small2DShapes() + Large2DShapes(), shape) -{ - // Create tensor - CLTensor src = create_tensor<CLTensor>(shape, DataType::U8); - - // Create output variables - float mean = 0.f; - float std_dev = 0.f; - - BOOST_TEST(src.info()->is_resizable()); - - // Create mean and standard deviation configure function - CLMeanStdDev mean_std_dev_image; - mean_std_dev_image.configure(&src, &mean, &std_dev); - - // Validate valid region - const ValidRegion valid_region = shape_to_valid_region(shape); - validate(src.info()->valid_region(), valid_region); - - // Validate padding - const PaddingSize padding = PaddingCalculator(shape.x(), 8).required_padding(); - validate(src.info()->padding(), padding); -} - -BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit")) -BOOST_DATA_TEST_CASE(RunSmall, Small2DShapes(), shape) -{ - // Compute function - std::pair<float, float> output = compute_mean_and_standard_deviation(shape); - - // Compute reference - std::pair<float, float> ref_output = Reference::compute_reference_mean_and_standard_deviation(shape); - - // Validate output - validate(output.first, ref_output.first); - validate(output.second, ref_output.second, 0.f, 0.05f); -} - -BOOST_TEST_DECORATOR(*boost::unit_test::label("nightly")) -BOOST_DATA_TEST_CASE(RunLarge, Large2DShapes(), shape) -{ - // Compute function - std::pair<float, float> output = compute_mean_and_standard_deviation(shape); - - // Compute reference - std::pair<float, float> ref_output = Reference::compute_reference_mean_and_standard_deviation(shape); - - // Validate output - validate(output.first, ref_output.first, 0.f, 0.0005f); - validate(output.second, ref_output.second, 0.f, 0.05f); -} - -BOOST_AUTO_TEST_SUITE_END() -BOOST_AUTO_TEST_SUITE_END() -#endif /* DOXYGEN_SKIP_THIS */ diff --git a/tests/validation/NEON/MeanStdDev.cpp b/tests/validation/NEON/MeanStdDev.cpp deleted file mode 100644 index d39435f2b3..0000000000 --- a/tests/validation/NEON/MeanStdDev.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (c) 2017 ARM Limited. - * - * SPDX-License-Identifier: MIT - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -#include "AssetsLibrary.h" -#include "Globals.h" -#include "NEON/Accessor.h" -#include "PaddingCalculator.h" -#include "TypePrinter.h" -#include "Utils.h" -#include "validation/Datasets.h" -#include "validation/Reference.h" -#include "validation/Validation.h" - -#include "arm_compute/core/Helpers.h" -#include "arm_compute/core/Types.h" -#include "arm_compute/runtime/NEON/functions/NEMeanStdDev.h" -#include "arm_compute/runtime/Tensor.h" -#include "arm_compute/runtime/TensorAllocator.h" - -#include "boost_wrapper.h" - -#include <random> -#include <string> - -using namespace arm_compute; -using namespace arm_compute::test; -using namespace arm_compute::test::validation; - -namespace -{ -/** Compute Neon mean and standard deviation function. - * - * @param[in] shape Shape of the input tensors. - * - * @return Computed mean and standard deviation. - */ -std::pair<float, float> compute_mean_and_standard_deviation(const TensorShape &shape) -{ - // Create tensor - Tensor src = create_tensor<Tensor>(shape, DataType::U8); - - // Create output variables - float mean = 0.f; - float std_dev = 0.f; - - // Create mean and standard deviation configure function - NEMeanStdDev mean_std_dev_image; - mean_std_dev_image.configure(&src, &mean, &std_dev); - - // Allocate tensors - src.allocator()->allocate(); - - BOOST_TEST(!src.info()->is_resizable()); - - // Fill tensor - library->fill_tensor_uniform(Accessor(src), 0); - - // Compute function - mean_std_dev_image.run(); - - return std::make_pair(mean, std_dev); -} -} // namespace - -#ifndef DOXYGEN_SKIP_THIS -BOOST_AUTO_TEST_SUITE(NEON) -BOOST_AUTO_TEST_SUITE(MeanStdDev) - -BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit") * boost::unit_test::label("nightly")) -BOOST_DATA_TEST_CASE(Configuration, Small2DShapes() + Large2DShapes(), shape) -{ - // Create tensor - Tensor src = create_tensor<Tensor>(shape, DataType::U8); - - // Create output variables - float mean = 0.f; - float std_dev = 0.f; - - BOOST_TEST(src.info()->is_resizable()); - - // Create mean and standard deviation configure function - NEMeanStdDev mean_std_dev_image; - mean_std_dev_image.configure(&src, &mean, &std_dev); - - // Validate valid region - const ValidRegion valid_region = shape_to_valid_region(shape); - validate(src.info()->valid_region(), valid_region); - - // Validate padding - validate(src.info()->padding(), PaddingCalculator(shape.x(), 16).required_padding()); -} - -BOOST_TEST_DECORATOR(*boost::unit_test::label("precommit")) -BOOST_DATA_TEST_CASE(RunSmall, Small2DShapes(), shape) -{ - // Compute function - std::pair<float, float> output = compute_mean_and_standard_deviation(shape); - - // Compute reference - std::pair<float, float> ref_output = Reference::compute_reference_mean_and_standard_deviation(shape); - - // Validate output - validate(output.first, ref_output.first); - validate(output.second, ref_output.second, 0.f, 0.001f); -} - -BOOST_TEST_DECORATOR(*boost::unit_test::label("nightly")) -BOOST_DATA_TEST_CASE(RunLarge, Large2DShapes(), shape) -{ - // Compute function - std::pair<float, float> output = compute_mean_and_standard_deviation(shape); - - // Compute reference - std::pair<float, float> ref_output = Reference::compute_reference_mean_and_standard_deviation(shape); - - // Validate output - validate(output.first, ref_output.first, 0.f, 0.0001f); - validate(output.second, ref_output.second, 0.f, 0.01f); -} - -BOOST_AUTO_TEST_SUITE_END() -BOOST_AUTO_TEST_SUITE_END() -#endif /* DOXYGEN_SKIP_THIS */ diff --git a/tests/validation/Reference.cpp b/tests/validation/Reference.cpp index 6da92116da..a621fea8a9 100644 --- a/tests/validation/Reference.cpp +++ b/tests/validation/Reference.cpp @@ -106,24 +106,6 @@ KeyPointArray Reference::compute_reference_harris_corners(const TensorShape &sha return corners; } -std::pair<float, float> Reference::compute_reference_mean_and_standard_deviation(const TensorShape &shape) -{ - // Create reference - RawTensor ref_src(shape, DataType::U8); - - // Create output variables - float mean; - float std_dev; - - // Fill reference - library->fill_tensor_uniform(ref_src, 0); - - // Compute reference - ReferenceCPP::mean_and_standard_deviation(ref_src, mean, std_dev); - - return std::make_pair(mean, std_dev); -} - RawTensor Reference::compute_reference_integral_image(const TensorShape &shape) { // Create reference diff --git a/tests/validation/Reference.h b/tests/validation/Reference.h index 430c42321f..698b60e96b 100644 --- a/tests/validation/Reference.h +++ b/tests/validation/Reference.h @@ -90,13 +90,6 @@ public: static void compute_reference_min_max_location(const TensorShape &shape, DataType dt_in, void *min, void *max, IArray<Coordinates2D> &min_loc, IArray<Coordinates2D> &max_loc, uint32_t &min_count, uint32_t &max_count); - /** Compute reference mean and standard deviation. - * - * @param[in] shape Shape of the input tensors. - * - * @return Computed mean and standard deviation. - */ - static std::pair<float, float> compute_reference_mean_and_standard_deviation(const TensorShape &shape); /** Compute reference integral image. * * @param[in] shape Shape of the input and output tensors. diff --git a/tests/validation/ReferenceCPP.cpp b/tests/validation/ReferenceCPP.cpp index 4c831ebe0a..029f6586f5 100644 --- a/tests/validation/ReferenceCPP.cpp +++ b/tests/validation/ReferenceCPP.cpp @@ -111,14 +111,6 @@ void ReferenceCPP::absolute_difference(const RawTensor &src1, const RawTensor &s boost::apply_visitor(absolute_difference_visitor(), s1, s2, d); } -// Mean and standard deviation -void ReferenceCPP::mean_and_standard_deviation(const RawTensor &src, float &mean, float &std_dev) -{ - ARM_COMPUTE_ERROR_ON(src.data_type() != DataType::U8); - const Tensor<uint8_t> s(src.shape(), src.data_type(), src.fixed_point_position(), reinterpret_cast<const uint8_t *>(src.data())); - tensor_operations::mean_and_standard_deviation(s, mean, std_dev); -} - // Integral image void ReferenceCPP::integral_image(const RawTensor &src, RawTensor &dst) { diff --git a/tests/validation/ReferenceCPP.h b/tests/validation/ReferenceCPP.h index 96aade9705..fcc4da471d 100644 --- a/tests/validation/ReferenceCPP.h +++ b/tests/validation/ReferenceCPP.h @@ -94,13 +94,6 @@ public: * @param[out] max_count Number of maximum values found */ static void min_max_location(const RawTensor &src, void *min, void *max, IArray<Coordinates2D> &min_loc, IArray<Coordinates2D> &max_loc, uint32_t &min_count, uint32_t &max_count); - /** Function to compute the mean and standard deviation of a tensor. - * - * @param[in] src Input tensor. - * @param[out] mean Mean of the tensor. - * @param[out] std_dev Standard deviation of the tensor - */ - static void mean_and_standard_deviation(const RawTensor &src, float &mean, float &std_dev); /** Function to compute the integral image of a tensor. * * @param[in] src Input tensor. diff --git a/tests/validation/TensorOperations.h b/tests/validation/TensorOperations.h index f157671c18..b9ffa49544 100644 --- a/tests/validation/TensorOperations.h +++ b/tests/validation/TensorOperations.h @@ -472,29 +472,6 @@ void min_max_location(const Tensor<T1> &in, void *min, void *max, IArray<Coordin } } -// Mean Standard Deviation -template <typename T1> -void mean_and_standard_deviation(const Tensor<T1> &in, float &mean, float &std_dev) -{ - int num_elements = in.num_elements(); - - // Calculate mean - mean = 0.f; - for(int i = 0; i < num_elements; ++i) - { - mean += in[i]; - } - mean /= num_elements; - - // Calculate standard deviation - std_dev = 0.f; - for(int i = 0; i < num_elements; ++i) - { - std_dev += (mean - in[i]) * (mean - in[i]); - } - std_dev = sqrt(std_dev / num_elements); -} - // Integral Image void integral_image(const Tensor<uint8_t> &in, Tensor<uint32_t> &out) { diff --git a/tests/validation_new/CL/MeanStdDev.cpp b/tests/validation_new/CL/MeanStdDev.cpp new file mode 100644 index 0000000000..494e1001bc --- /dev/null +++ b/tests/validation_new/CL/MeanStdDev.cpp @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2017 ARM Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#include "arm_compute/runtime/CL/functions/CLMeanStdDev.h" +#include "framework/Macros.h" +#include "tests/CL/CLAccessor.h" +#include "tests/PaddingCalculator.h" +#include "tests/datasets_new/ShapeDatasets.h" +#include "tests/validation_new/Validation.h" +#include "tests/validation_new/fixtures/MeanStdDevFixture.h" + +namespace arm_compute +{ +namespace test +{ +namespace validation +{ +namespace +{ +constexpr RelativeTolerance tolerance_rel_high_error(0.05f); +constexpr RelativeTolerance tolerance_rel_low_error(0.0005f); +} // namespace + +TEST_SUITE(CL) +TEST_SUITE(MeanStdDev) + +DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(concat(datasets::Small2DShapes(), datasets::Large2DShapes()), framework::dataset::make("DataType", DataType::U8)), shape, data_type) +{ + // Create tensors + CLTensor src = create_tensor<CLTensor>(shape, data_type); + + // Create output variables + float mean = 0.f; + float std_dev = 0.f; + + ARM_COMPUTE_EXPECT(src.info()->is_resizable(), framework::LogLevel::ERRORS); + + // Create configure function + CLMeanStdDev mean_std_dev_image; + mean_std_dev_image.configure(&src, &mean, &std_dev); + + // Validate valid region + const ValidRegion valid_region = shape_to_valid_region(shape); + validate(src.info()->valid_region(), valid_region); + + // Validate padding + const PaddingSize padding = PaddingCalculator(shape.x(), 8).required_padding(); + validate(src.info()->padding(), padding); +} + +template <typename T> +using CLMeanStdDevFixture = MeanStdDevValidationFixture<CLTensor, CLAccessor, CLMeanStdDev, T>; + +FIXTURE_DATA_TEST_CASE(RunSmall, CLMeanStdDevFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), framework::dataset::make("DataType", + DataType::U8))) +{ + // Validate mean output + validate(_target.first, _reference.first); + + // Validate std_dev output + validate(_target.second, _reference.second, tolerance_rel_high_error); +} +FIXTURE_DATA_TEST_CASE(RunLarge, CLMeanStdDevFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), framework::dataset::make("DataType", + DataType::U8))) +{ + // Validate mean output + validate(_target.first, _reference.first, tolerance_rel_low_error); + + // Validate std_dev output + validate(_target.second, _reference.second, tolerance_rel_high_error); +} + +TEST_SUITE_END() +TEST_SUITE_END() +} // namespace validation +} // namespace test +} // namespace arm_compute diff --git a/tests/validation_new/CPP/MeanStdDev.cpp b/tests/validation_new/CPP/MeanStdDev.cpp new file mode 100644 index 0000000000..4a39b13d56 --- /dev/null +++ b/tests/validation_new/CPP/MeanStdDev.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2017 ARM Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#include "MeanStdDev.h" + +namespace arm_compute +{ +namespace test +{ +namespace validation +{ +namespace reference +{ +template <typename T> +std::pair<float, float> mean_and_standard_deviation(const SimpleTensor<T> &in) +{ + const int num_elements = in.num_elements(); + + // Calculate mean + float mean = std::accumulate(in.data(), in.data() + num_elements, 0.f) / num_elements; + + // Calculate standard deviation + float std_dev = std::accumulate(in.data(), in.data() + num_elements, 0.f, [&mean](float a, float b) + { + return a + (mean - b) * (mean - b); + }); + + std_dev = std::sqrt(std_dev / num_elements); + + return std::make_pair(mean, std_dev); +} + +template std::pair<float, float> mean_and_standard_deviation(const SimpleTensor<uint8_t> &in); +} // namespace reference +} // namespace validation +} // namespace test +} // namespace arm_compute diff --git a/tests/validation_new/CPP/MeanStdDev.h b/tests/validation_new/CPP/MeanStdDev.h new file mode 100644 index 0000000000..6b89ae0656 --- /dev/null +++ b/tests/validation_new/CPP/MeanStdDev.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2017 ARM Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#ifndef __ARM_COMPUTE_TEST_STD_MEAN_DEV_H__ +#define __ARM_COMPUTE_TEST_STD_MEAN_DEV_H__ + +#include "tests/SimpleTensor.h" + +namespace arm_compute +{ +namespace test +{ +namespace validation +{ +namespace reference +{ +template <typename T> +std::pair<float, float> mean_and_standard_deviation(const SimpleTensor<T> &in); +} // namespace reference +} // namespace validation +} // namespace test +} // namespace arm_compute +#endif /* __ARM_COMPUTE_TEST_STD_MEAN_DEV_H__ */ diff --git a/tests/validation_new/NEON/MeanStdDev.cpp b/tests/validation_new/NEON/MeanStdDev.cpp new file mode 100644 index 0000000000..6214261afb --- /dev/null +++ b/tests/validation_new/NEON/MeanStdDev.cpp @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2017 ARM Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#include "arm_compute/runtime/NEON/functions/NEMeanStdDev.h" +#include "framework/Macros.h" +#include "tests/NEON/Accessor.h" +#include "tests/PaddingCalculator.h" +#include "tests/datasets_new/ShapeDatasets.h" +#include "tests/validation_new/Validation.h" +#include "tests/validation_new/fixtures/MeanStdDevFixture.h" + +namespace arm_compute +{ +namespace test +{ +namespace validation +{ +namespace +{ +constexpr RelativeTolerance tolerance_rel_high_error(0.05f); +constexpr RelativeTolerance tolerance_rel_low_error(0.0005f); +} // namespace + +TEST_SUITE(NEON) +TEST_SUITE(MeanStdDev) + +DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(concat(datasets::Small2DShapes(), datasets::Large2DShapes()), framework::dataset::make("DataType", DataType::U8)), shape, data_type) +{ + // Create tensors + Tensor src = create_tensor<Tensor>(shape, data_type); + + // Create output variables + float mean = 0.f; + float std_dev = 0.f; + + ARM_COMPUTE_EXPECT(src.info()->is_resizable(), framework::LogLevel::ERRORS); + + // Create configure function + NEMeanStdDev mean_std_dev_image; + mean_std_dev_image.configure(&src, &mean, &std_dev); + + // Validate padding + const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding(); + validate(src.info()->padding(), padding); +} + +template <typename T> +using NEMeanStdDevFixture = MeanStdDevValidationFixture<Tensor, Accessor, NEMeanStdDev, T>; + +FIXTURE_DATA_TEST_CASE(RunSmall, NEMeanStdDevFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::Small2DShapes(), framework::dataset::make("DataType", + DataType::U8))) +{ + // Validate mean output + validate(_target.first, _reference.first); + + // Validate std_dev output + validate(_target.second, _reference.second, tolerance_rel_high_error); +} +FIXTURE_DATA_TEST_CASE(RunLarge, NEMeanStdDevFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(datasets::Large2DShapes(), framework::dataset::make("DataType", + DataType::U8))) +{ + // Validate mean output + validate(_target.first, _reference.first, tolerance_rel_low_error); + + // Validate std_dev output + validate(_target.second, _reference.second, tolerance_rel_high_error); +} + +TEST_SUITE_END() +TEST_SUITE_END() +} // namespace validation +} // namespace test +} // namespace arm_compute diff --git a/tests/validation_new/Validation.h b/tests/validation_new/Validation.h index 2892fb3e42..d3c3541982 100644 --- a/tests/validation_new/Validation.h +++ b/tests/validation_new/Validation.h @@ -232,7 +232,7 @@ struct compare<AbsoluteTolerance<U>, U> : public compare_base<AbsoluteTolerance< { using compare_base<AbsoluteTolerance<U>>::compare_base; - operator bool() + operator bool() const { if(!std::isfinite(this->_target) || !std::isfinite(this->_reference)) { @@ -252,7 +252,7 @@ struct compare<RelativeTolerance, U> : public compare_base<RelativeTolerance> { using compare_base<RelativeTolerance>::compare_base; - operator bool() + operator bool() const { if(!std::isfinite(_target) || !std::isfinite(_reference)) { diff --git a/tests/validation_new/fixtures/MeanStdDevFixture.h b/tests/validation_new/fixtures/MeanStdDevFixture.h new file mode 100644 index 0000000000..65622fca07 --- /dev/null +++ b/tests/validation_new/fixtures/MeanStdDevFixture.h @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2017 ARM Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#ifndef ARM_COMPUTE_TEST_MEAN_STD_DEV_FIXTURE +#define ARM_COMPUTE_TEST_MEAN_STD_DEV_FIXTURE + +#include "framework/Asserts.h" +#include "framework/Fixture.h" +#include "tests/Globals.h" +#include "tests/validation_new/CPP/MeanStdDev.h" + +namespace arm_compute +{ +namespace test +{ +namespace validation +{ +template <typename TensorType, typename AccessorType, typename FunctionType, typename T> +class MeanStdDevValidationFixture : public framework::Fixture +{ +public: + template <typename...> + void setup(TensorShape shape, DataType data_type) + { + _target = compute_target(shape, data_type); + _reference = compute_reference(shape, data_type); + } + +protected: + template <typename U> + void fill(U &&tensor) + { + library->fill_tensor_uniform(tensor, 0); + } + + std::pair<float, float> compute_target(const TensorShape &shape, DataType data_type) + { + // Create tensors + TensorType src = create_tensor<TensorType>(shape, data_type); + + // Create output variables + float mean = 0.0f; + float std_dev = 0.0f; + + // Create and configure function + FunctionType mean_std_dev; + mean_std_dev.configure(&src, &mean, &std_dev); + + ARM_COMPUTE_EXPECT(src.info()->is_resizable(), framework::LogLevel::ERRORS); + + // Allocate tensors + src.allocator()->allocate(); + ARM_COMPUTE_EXPECT(!src.info()->is_resizable(), framework::LogLevel::ERRORS); + + // Fill tensors + fill(AccessorType(src)); + + // Compute function + mean_std_dev.run(); + + return std::make_pair(mean, std_dev); + } + + std::pair<float, float> compute_reference(const TensorShape &shape, DataType data_type) + { + // Create reference + SimpleTensor<T> src{ shape, data_type }; + + // Fill reference + fill(src); + + // Compute reference + return reference::mean_and_standard_deviation<T>(src); + } + + std::pair<float, float> _target{}; + std::pair<float, float> _reference{}; +}; +} // namespace validation +} // namespace test +} // namespace arm_compute +#endif /* ARM_COMPUTE_TEST_MEAN_STD_DEV_FIXTURE */ |