diff options
-rw-r--r-- | tests/AssetsLibrary.cpp | 44 | ||||
-rw-r--r-- | tests/AssetsLibrary.h | 43 | ||||
-rw-r--r-- | tests/framework/Framework.cpp | 8 | ||||
-rw-r--r-- | tests/framework/Framework.h | 7 |
4 files changed, 62 insertions, 40 deletions
diff --git a/tests/AssetsLibrary.cpp b/tests/AssetsLibrary.cpp index c6d86d1c1a..eafa6314b1 100644 --- a/tests/AssetsLibrary.cpp +++ b/tests/AssetsLibrary.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018 ARM Limited. + * Copyright (c) 2017-2020 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -28,6 +28,11 @@ #include "arm_compute/core/ITensor.h" +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-parameter" +#include "libnpy/npy.hpp" +#pragma GCC diagnostic pop + #include <cctype> #include <fstream> #include <limits> @@ -511,5 +516,42 @@ RawTensor AssetsLibrary::get(const std::string &name, Format format, Channel cha { return RawTensor(find_or_create_raw_tensor(name, format, channel)); } + +namespace detail +{ +inline void validate_npy_header(std::ifstream &stream, const std::string &expect_typestr, const TensorShape &expect_shape) +{ + ARM_COMPUTE_UNUSED(expect_typestr); + ARM_COMPUTE_UNUSED(expect_shape); + + std::string header = npy::read_header(stream); + + // Parse header + std::vector<unsigned long> shape; + bool fortran_order = false; + std::string typestr; + npy::parse_header(header, typestr, fortran_order, shape); + + // Check if the typestring matches the given one + ARM_COMPUTE_ERROR_ON_MSG(typestr != expect_typestr, "Typestrings mismatch"); + + // Validate tensor shape + ARM_COMPUTE_ERROR_ON_MSG(shape.size() != expect_shape.num_dimensions(), "Tensor ranks mismatch"); + if(fortran_order) + { + for(size_t i = 0; i < shape.size(); ++i) + { + ARM_COMPUTE_ERROR_ON_MSG(expect_shape[i] != shape[i], "Tensor dimensions mismatch"); + } + } + else + { + for(size_t i = 0; i < shape.size(); ++i) + { + ARM_COMPUTE_ERROR_ON_MSG(expect_shape[i] != shape[shape.size() - i - 1], "Tensor dimensions mismatch"); + } + } +} +} // namespace detail } // namespace test } // namespace arm_compute diff --git a/tests/AssetsLibrary.h b/tests/AssetsLibrary.h index e625c37505..84653ed089 100644 --- a/tests/AssetsLibrary.h +++ b/tests/AssetsLibrary.h @@ -32,10 +32,6 @@ #include "arm_compute/core/Types.h" #include "arm_compute/core/Window.h" #include "arm_compute/core/utils/misc/Random.h" -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-parameter" -#include "libnpy/npy.hpp" -#pragma GCC diagnostic pop #include "tests/RawTensor.h" #include "tests/TensorCache.h" #include "tests/Utils.h" @@ -469,6 +465,16 @@ inline std::vector<std::pair<T, T>> convert_range_pair(const std::vector<AssetsL }); return converted; } + +/* Read npy header and check the payload is suitable for the specified type and shape + * + * @param[in] stream ifstream of the npy file + * @param[in] expect_typestr Expected typestr + * @param[in] expect_shape Shape of tensor expected to receive the data + * + * @note Advances stream to the beginning of the data payload + */ +void validate_npy_header(std::ifstream &stream, const std::string &expect_typestr, const TensorShape &expect_shape); } // namespace detail template <typename T, typename D> @@ -959,41 +965,14 @@ void AssetsLibrary::fill_layer_data(T &&tensor, std::string name) const #endif /* _WIN32 */ const std::string path = _library_path + path_separator + name; - std::vector<unsigned long> shape; - // Open file std::ifstream stream(path, std::ios::in | std::ios::binary); if(!stream.good()) { throw framework::FileNotFound("Could not load npy file: " + path); } - std::string header = npy::read_header(stream); - - // Parse header - bool fortran_order = false; - std::string typestr; - npy::parse_header(header, typestr, fortran_order, shape); - // Check if the typestring matches the given one - std::string expect_typestr = get_typestring(tensor.data_type()); - ARM_COMPUTE_ERROR_ON_MSG(typestr != expect_typestr, "Typestrings mismatch"); - - // Validate tensor shape - ARM_COMPUTE_ERROR_ON_MSG(shape.size() != tensor.shape().num_dimensions(), "Tensor ranks mismatch"); - if(fortran_order) - { - for(size_t i = 0; i < shape.size(); ++i) - { - ARM_COMPUTE_ERROR_ON_MSG(tensor.shape()[i] != shape[i], "Tensor dimensions mismatch"); - } - } - else - { - for(size_t i = 0; i < shape.size(); ++i) - { - ARM_COMPUTE_ERROR_ON_MSG(tensor.shape()[i] != shape[shape.size() - i - 1], "Tensor dimensions mismatch"); - } - } + validate_npy_header(stream, tensor.data_type(), tensor.shape()); // Read data if(tensor.padding().empty()) diff --git a/tests/framework/Framework.cpp b/tests/framework/Framework.cpp index c6aaad0586..dff280dc8c 100644 --- a/tests/framework/Framework.cpp +++ b/tests/framework/Framework.cpp @@ -26,6 +26,7 @@ #include "arm_compute/runtime/Scheduler.h" #include "support/MemorySupport.h" #include "tests/framework/ParametersLibrary.h" +#include "tests/framework/TestFilter.h" #ifdef ARM_COMPUTE_CL #include "arm_compute/runtime/CL/CLRuntimeContext.h" @@ -49,6 +50,7 @@ namespace framework std::unique_ptr<InstrumentsInfo> instruments_info; Framework::Framework() + : _test_filter(nullptr) { _available_instruments.emplace(std::pair<InstrumentType, ScaleFactor>(InstrumentType::WALL_CLOCK_TIMESTAMPS, ScaleFactor::NONE), Instrument::make_instrument<WallClockTimestamps, ScaleFactor::NONE>); _available_instruments.emplace(std::pair<InstrumentType, ScaleFactor>(InstrumentType::WALL_CLOCK_TIMESTAMPS, ScaleFactor::TIME_MS), @@ -127,7 +129,7 @@ Framework &Framework::get() void Framework::init(const FrameworkConfig &config) { - _test_filter = TestFilter(config.mode, config.name_filter, config.id_filter); + _test_filter.reset(new TestFilter(config.mode, config.name_filter, config.id_filter)); _num_iterations = config.num_iterations; _log_level = config.log_level; _cooldown_sec = config.cooldown_sec; @@ -558,7 +560,7 @@ bool Framework::run() const std::string test_case_name = test_factory->name(); const TestInfo test_info{ id, test_case_name, test_factory->mode(), test_factory->status() }; - if(_test_filter.is_selected(test_info)) + if(_test_filter->is_selected(test_info)) { #ifdef ARM_COMPUTE_CL // Every 100 tests, reset the OpenCL context to release the allocated memory @@ -678,7 +680,7 @@ std::vector<TestInfo> Framework::test_infos() const { TestInfo test_info{ id, factory->name(), factory->mode(), factory->status() }; - if(_test_filter.is_selected(test_info)) + if(_test_filter->is_selected(test_info)) { ids.emplace_back(std::move(test_info)); } diff --git a/tests/framework/Framework.h b/tests/framework/Framework.h index fb52fd8ffe..11dedfe89f 100644 --- a/tests/framework/Framework.h +++ b/tests/framework/Framework.h @@ -29,7 +29,6 @@ #include "Profiler.h" #include "TestCase.h" #include "TestCaseFactory.h" -#include "TestFilter.h" #include "TestResult.h" #include "Utils.h" #include "instruments/Instruments.h" @@ -41,11 +40,9 @@ #include <memory> #include <numeric> #include <ostream> -#include <regex> #include <set> #include <sstream> #include <string> -#include <tuple> #include <vector> namespace arm_compute @@ -54,6 +51,8 @@ namespace test { namespace framework { +class TestFilter; + /** Framework configuration structure */ struct FrameworkConfig { @@ -346,7 +345,7 @@ private: std::map<InstrumentsDescription, create_function *> _available_instruments{}; std::set<framework::InstrumentsDescription> _instruments{ std::pair<InstrumentType, ScaleFactor>(InstrumentType::NONE, ScaleFactor::NONE) }; - TestFilter _test_filter{}; + std::unique_ptr<TestFilter> _test_filter; LogLevel _log_level{ LogLevel::ALL }; const TestInfo *_current_test_info{ nullptr }; TestResult *_current_test_result{ nullptr }; |