diff options
author | Geir Storli <geirst@vespa.ai> | 2024-03-04 16:24:48 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-04 16:24:48 +0100 |
commit | 640c29d7f4b449626af04aafba7719824ebe3af0 (patch) | |
tree | fbbf0d24a67c9020bf95aa70c44e293969a1d63e | |
parent | 277650b0550123dfc541977a055c2e6ee39d5083 (diff) | |
parent | dcbc864d4f8209a66499b77b932efbea79613b28 (diff) |
Merge pull request #30471 from vespa-engine/toregge/factor-out-common-code-for-interpolated-lookup
Factor out common code for interpolated lookup.
4 files changed, 43 insertions, 17 deletions
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 <vespa/searchcommon/attribute/iattributecontext.h> #include <vespa/searchlib/common/converters.h> #include <vespa/vespalib/util/stringfmt.h> @@ -38,22 +39,6 @@ InterpolatedLookup & InterpolatedLookup::operator= (const InterpolatedLookup &rh namespace { -double -simpleInterpolate(const std::vector<double> & 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..a3f8d55dec1 --- /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<double>& v, double lookup) noexcept +{ + 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..92cc29904eb --- /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 <vector> + +namespace search::expression { + +/* + * Perform simple interpolation for interpolatedlookup function + * in grouping expression. + */ +double simple_interpolate(const std::vector<double>& v, double lookup) noexcept; + +} |