From 59c6f9191059039abad80e3c406ec14a0b56686c Mon Sep 17 00:00:00 2001 From: HÃ¥vard Pettersen Date: Wed, 26 Jan 2022 14:49:59 +0000 Subject: also handle -inf and inf values --- eval/src/tests/eval/tensor_spec/tensor_spec_test.cpp | 8 +++++--- eval/src/vespa/eval/eval/tensor_spec.cpp | 11 +++++++++-- 2 files changed, 14 insertions(+), 5 deletions(-) (limited to 'eval/src') diff --git a/eval/src/tests/eval/tensor_spec/tensor_spec_test.cpp b/eval/src/tests/eval/tensor_spec/tensor_spec_test.cpp index b51faa35c4f..6023d472d13 100644 --- a/eval/src/tests/eval/tensor_spec/tensor_spec_test.cpp +++ b/eval/src/tests/eval/tensor_spec/tensor_spec_test.cpp @@ -8,6 +8,8 @@ using vespalib::Slime; using vespalib::eval::TensorSpec; auto my_nan = std::numeric_limits::quiet_NaN(); +auto my_neg_inf = (-1.0/0.0); +auto my_inf = (1.0/0.0); TEST("require that a tensor spec can be converted to and from slime") { TensorSpec spec("tensor(x[2],y{})"); @@ -32,12 +34,12 @@ TEST("require that a tensor spec can be converted to and from an expression") { EXPECT_EQUAL(TensorSpec::from_expr(expr), spec); } -TEST("require that nan cells get converted to valid expressions") { +TEST("require that nan/inf/-inf cells get converted to valid expressions") { TensorSpec spec("tensor(x[2],y{})"); spec.add({{"x", 0}, {"y", "xxx"}}, my_nan) .add({{"x", 0}, {"y", "yyy"}}, my_nan) - .add({{"x", 1}, {"y", "xxx"}}, 3.0) - .add({{"x", 1}, {"y", "yyy"}}, 4.0); + .add({{"x", 1}, {"y", "xxx"}}, my_neg_inf) + .add({{"x", 1}, {"y", "yyy"}}, my_inf); vespalib::string expr = spec.to_expr(); fprintf(stderr, "expr: \n%s\n", expr.c_str()); EXPECT_EQUAL(TensorSpec::from_expr(expr), spec); diff --git a/eval/src/vespa/eval/eval/tensor_spec.cpp b/eval/src/vespa/eval/eval/tensor_spec.cpp index 2dee819674e..223e32ce04f 100644 --- a/eval/src/vespa/eval/eval/tensor_spec.cpp +++ b/eval/src/vespa/eval/eval/tensor_spec.cpp @@ -20,10 +20,17 @@ namespace eval { namespace { vespalib::string number_to_expr(double value) { - if (std::isnan(value)) { + if (std::isfinite(value)) { + return make_string("%g", value); + } else if (std::isnan(value)) { return {"(0/0)"}; + } else { // -inf or inf + if (value < 0) { + return {"(-1/0)"}; + } else { + return {"(1/0)"}; + } } - return make_string("%g", value); } TensorSpec::Address extract_address(const slime::Inspector &address) { -- cgit v1.2.3