diff options
author | Håvard Pettersen <havardpe@oath.com> | 2020-10-30 22:34:11 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@oath.com> | 2020-10-30 22:34:11 +0000 |
commit | ed503386849a167f57bb7023a80dd93d58c788e4 (patch) | |
tree | 12249ba56f5d4bdb7f7cf78481b1b4414fa7f3f5 /eval | |
parent | a912eaaa9f64cbd35cc405b26c41ff33c45e6314 (diff) |
ignore NaN values
Diffstat (limited to 'eval')
-rw-r--r-- | eval/src/tests/eval/aggr/aggr_test.cpp | 19 | ||||
-rw-r--r-- | eval/src/vespa/eval/eval/aggr.h | 13 |
2 files changed, 29 insertions, 3 deletions
diff --git a/eval/src/tests/eval/aggr/aggr_test.cpp b/eval/src/tests/eval/aggr/aggr_test.cpp index aa9875a2e9f..612fb0a7630 100644 --- a/eval/src/tests/eval/aggr/aggr_test.cpp +++ b/eval/src/tests/eval/aggr/aggr_test.cpp @@ -87,6 +87,23 @@ TEST("require that MEDIAN aggregator works as expected") { aggr.next(200.0), EXPECT_EQUAL(aggr.result(), 150.0); } +TEST("require that MEDIAN aggregator ignores NaN values") { + Stash stash; + Aggregator &aggr = Aggregator::create(Aggr::MEDIAN, stash); + double my_nan = std::numeric_limits<double>::quiet_NaN(); + aggr.first(my_nan); + aggr.next(my_nan); + aggr.next(my_nan); + EXPECT_TRUE(std::isnan(aggr.result())); + aggr.next(10.0); + EXPECT_EQUAL(aggr.result(), 10.0); + aggr.next(my_nan); + aggr.next(my_nan); + EXPECT_EQUAL(aggr.result(), 10.0); + aggr.next(20.0); + EXPECT_EQUAL(aggr.result(), 15.0); +} + TEST("require that MIN aggregator works as expected") { Stash stash; Aggregator &aggr = Aggregator::create(Aggr::MIN, stash); @@ -117,6 +134,7 @@ float aggr_merge(const std::vector<float> &a, const std::vector<float> &b) { } TEST("require that aggregator merge works") { + float my_nan = std::numeric_limits<float>::quiet_NaN(); EXPECT_EQUAL(aggr_merge<Avg>({1,2},{3,4}), 2.5); EXPECT_EQUAL(aggr_merge<Count>({1,2},{3,4}), 4.0); EXPECT_EQUAL(aggr_merge<Prod>({1,2},{3,4}), 24.0); @@ -125,6 +143,7 @@ TEST("require that aggregator merge works") { EXPECT_EQUAL(aggr_merge<Median>({1,2},{3,4}), 2.5); EXPECT_EQUAL(aggr_merge<Median>({1,2},{3,4,5}), 3); EXPECT_EQUAL(aggr_merge<Median>({0,1,2},{3,4}), 2); + EXPECT_EQUAL(aggr_merge<Median>({my_nan,2,my_nan},{my_nan,4}), 3); EXPECT_EQUAL(aggr_merge<Min>({1,2},{3,4}), 1.0); } diff --git a/eval/src/vespa/eval/eval/aggr.h b/eval/src/vespa/eval/eval/aggr.h index 25b0a899efd..2412008db61 100644 --- a/eval/src/vespa/eval/eval/aggr.h +++ b/eval/src/vespa/eval/eval/aggr.h @@ -8,6 +8,7 @@ #include <vector> #include <map> #include <algorithm> +#include <cmath> namespace vespalib { @@ -126,11 +127,17 @@ private: std::vector<T> _seen; public: constexpr Median() : _seen() {} - constexpr Median(T value) : _seen({value}) {} - constexpr void sample(T value) { _seen.push_back(value); } + constexpr Median(T value) : _seen() { + sample(value); + } + constexpr void sample(T value) { + if (!std::isnan(value)) { + _seen.push_back(value); + } + } constexpr void merge(const Median &rhs) { for (T value: rhs._seen) { - _seen.push_back(value); + sample(value); } }; constexpr T result() const { |