aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArne Juul <arnej@verizonmedia.com>2019-11-29 10:42:53 +0000
committerArne Juul <arnej@verizonmedia.com>2019-11-29 12:03:04 +0000
commitf45a69b8b8f56a0d7818963541a48519608679e2 (patch)
tree4e27473c6ba8b923ced234b099f6d3a25d9af525
parent69001649f409038c48827faf1c51e02d200b54b4 (diff)
do early exit from computeSum
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_iterator.cpp10
1 files changed, 5 insertions, 5 deletions
diff --git a/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_iterator.cpp b/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_iterator.cpp
index 4617bb0e374..dcf599daa6a 100644
--- a/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_iterator.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_iterator.cpp
@@ -37,7 +37,7 @@ public:
void doSeek(uint32_t docId) override {
double distanceLimit = params().distanceHeap.distanceLimit();
while (__builtin_expect((docId < getEndId()), true)) {
- double d = computeDistance(docId);
+ double d = computeDistance(docId, distanceLimit);
if (d <= distanceLimit) {
_lastScore = d;
setDocId(docId);
@@ -60,20 +60,20 @@ public:
Trinary is_strict() const override { return strict ? Trinary::True : Trinary::False ; }
private:
- static double computeSum(ConstArrayRef<LCT> lhs, ConstArrayRef<RCT> rhs) {
+ static double computeSum(ConstArrayRef<LCT> lhs, ConstArrayRef<RCT> rhs, double limit) {
double sum = 0.0;
size_t sz = lhs.size();
assert(sz == rhs.size());
- for (size_t i = 0; i < sz; ++i) {
+ for (size_t i = 0; i < sz && sum <= limit; ++i) {
double diff = lhs[i] - rhs[i];
sum += diff*diff;
}
return sum;
}
- double computeDistance(uint32_t docId) {
+ double computeDistance(uint32_t docId, double limit) {
params().tensorAttribute.getTensor(docId, _fieldTensor);
- return computeSum(_lhs, _fieldTensor.cellsRef().typify<RCT>());
+ return computeSum(_lhs, _fieldTensor.cellsRef().typify<RCT>(), limit);
}
ConstArrayRef<LCT> _lhs;