summaryrefslogtreecommitdiffstats
path: root/eval
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@oath.com>2020-10-30 22:34:11 +0000
committerHåvard Pettersen <havardpe@oath.com>2020-10-30 22:34:11 +0000
commited503386849a167f57bb7023a80dd93d58c788e4 (patch)
tree12249ba56f5d4bdb7f7cf78481b1b4414fa7f3f5 /eval
parenta912eaaa9f64cbd35cc405b26c41ff33c45e6314 (diff)
ignore NaN values
Diffstat (limited to 'eval')
-rw-r--r--eval/src/tests/eval/aggr/aggr_test.cpp19
-rw-r--r--eval/src/vespa/eval/eval/aggr.h13
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 {