diff options
author | Arne Juul <arnej@verizonmedia.com> | 2019-11-29 10:42:53 +0000 |
---|---|---|
committer | Arne Juul <arnej@verizonmedia.com> | 2019-11-29 12:03:04 +0000 |
commit | f45a69b8b8f56a0d7818963541a48519608679e2 (patch) | |
tree | 4e27473c6ba8b923ced234b099f6d3a25d9af525 | |
parent | 69001649f409038c48827faf1c51e02d200b54b4 (diff) |
do early exit from computeSum
-rw-r--r-- | searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_iterator.cpp | 10 |
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; |