From 3248dfc8b16a3bb666f1409146f0039e55ac88dc Mon Sep 17 00:00:00 2001 From: Tor Egge Date: Mon, 4 Mar 2024 15:29:56 +0100 Subject: Factor out common code for interpolated lookup. --- .../src/vespa/searchlib/expression/CMakeLists.txt | 1 + .../expression/interpolatedlookupfunctionnode.cpp | 19 ++-------------- .../searchlib/expression/simple_interpolate.cpp | 25 ++++++++++++++++++++++ .../searchlib/expression/simple_interpolate.h | 15 +++++++++++++ 4 files changed, 43 insertions(+), 17 deletions(-) create mode 100644 searchlib/src/vespa/searchlib/expression/simple_interpolate.cpp create mode 100644 searchlib/src/vespa/searchlib/expression/simple_interpolate.h diff --git a/searchlib/src/vespa/searchlib/expression/CMakeLists.txt b/searchlib/src/vespa/searchlib/expression/CMakeLists.txt index 391cc3b96ef..11c0b478e23 100644 --- a/searchlib/src/vespa/searchlib/expression/CMakeLists.txt +++ b/searchlib/src/vespa/searchlib/expression/CMakeLists.txt @@ -31,6 +31,7 @@ vespa_add_library(searchlib_expression OBJECT arrayatlookupfunctionnode.cpp arrayoperationnode.cpp aggregationrefnode.cpp + simple_interpolate.cpp stringresultnode.cpp rawresultnode.cpp floatresultnode.cpp diff --git a/searchlib/src/vespa/searchlib/expression/interpolatedlookupfunctionnode.cpp b/searchlib/src/vespa/searchlib/expression/interpolatedlookupfunctionnode.cpp index c5a867151fe..fbc69a512d3 100644 --- a/searchlib/src/vespa/searchlib/expression/interpolatedlookupfunctionnode.cpp +++ b/searchlib/src/vespa/searchlib/expression/interpolatedlookupfunctionnode.cpp @@ -1,6 +1,7 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "interpolatedlookupfunctionnode.h" #include "floatresultnode.h" +#include "simple_interpolate.h" #include #include #include @@ -38,22 +39,6 @@ InterpolatedLookup & InterpolatedLookup::operator= (const InterpolatedLookup &rh namespace { -double -simpleInterpolate(const std::vector & v, double lookup) { - if (v.empty() || lookup < v[0]) - return 0; - for (size_t i = 1; i < v.size(); ++i) { - if (lookup < v[i]) { - double total = v[i] - v[i - 1]; - double above = lookup - v[i - 1]; - double result = i - 1; - result += (above / total); - return result; - } - } - return v.size() - 1; -} - class InterpolateHandler : public AttributeNode::Handler { public: InterpolateHandler(FloatResultNode & result, const ExpressionNode * lookupExpression) noexcept @@ -76,7 +61,7 @@ InterpolateHandler::handle(const AttributeResult &r) { size_t numValues = r.getAttribute()->getValueCount(r.getDocId()); _values.resize(numValues); r.getAttribute()->get(r.getDocId(), _values.data(), _values.size()); - _result.set(simpleInterpolate(_values, lookup)); + _result.set(simple_interpolate(_values, lookup)); } } diff --git a/searchlib/src/vespa/searchlib/expression/simple_interpolate.cpp b/searchlib/src/vespa/searchlib/expression/simple_interpolate.cpp new file mode 100644 index 00000000000..1d6ec2fbfdc --- /dev/null +++ b/searchlib/src/vespa/searchlib/expression/simple_interpolate.cpp @@ -0,0 +1,25 @@ +// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include "simple_interpolate.h" + +namespace search::expression { + +double +simple_interpolate(const std::vector& v, double lookup) +{ + if (v.empty() || lookup < v[0]) { + return 0; + } + for (size_t i = 1; i < v.size(); ++i) { + if (lookup < v[i]) { + double total = v[i] - v[i - 1]; + double above = lookup - v[i - 1]; + double result = i - 1; + result += (above / total); + return result; + } + } + return v.size() - 1; +} + +} diff --git a/searchlib/src/vespa/searchlib/expression/simple_interpolate.h b/searchlib/src/vespa/searchlib/expression/simple_interpolate.h new file mode 100644 index 00000000000..124daca6aa5 --- /dev/null +++ b/searchlib/src/vespa/searchlib/expression/simple_interpolate.h @@ -0,0 +1,15 @@ +// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +#include + +namespace search::expression { + +/* + * Perform simple interpolation for interpolatedlookup function + * in grouping expression. + */ +double simple_interpolate(const std::vector& v, double lookup); + +} -- cgit v1.2.3 From dcbc864d4f8209a66499b77b932efbea79613b28 Mon Sep 17 00:00:00 2001 From: Tor Egge Date: Mon, 4 Mar 2024 15:49:53 +0100 Subject: Add noexcept specifier for simple_interpolate function. --- searchlib/src/vespa/searchlib/expression/simple_interpolate.cpp | 2 +- searchlib/src/vespa/searchlib/expression/simple_interpolate.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/searchlib/src/vespa/searchlib/expression/simple_interpolate.cpp b/searchlib/src/vespa/searchlib/expression/simple_interpolate.cpp index 1d6ec2fbfdc..a3f8d55dec1 100644 --- a/searchlib/src/vespa/searchlib/expression/simple_interpolate.cpp +++ b/searchlib/src/vespa/searchlib/expression/simple_interpolate.cpp @@ -5,7 +5,7 @@ namespace search::expression { double -simple_interpolate(const std::vector& v, double lookup) +simple_interpolate(const std::vector& v, double lookup) noexcept { if (v.empty() || lookup < v[0]) { return 0; diff --git a/searchlib/src/vespa/searchlib/expression/simple_interpolate.h b/searchlib/src/vespa/searchlib/expression/simple_interpolate.h index 124daca6aa5..92cc29904eb 100644 --- a/searchlib/src/vespa/searchlib/expression/simple_interpolate.h +++ b/searchlib/src/vespa/searchlib/expression/simple_interpolate.h @@ -10,6 +10,6 @@ namespace search::expression { * Perform simple interpolation for interpolatedlookup function * in grouping expression. */ -double simple_interpolate(const std::vector& v, double lookup); +double simple_interpolate(const std::vector& v, double lookup) noexcept; } -- cgit v1.2.3