summaryrefslogtreecommitdiffstats
path: root/searchlib/src/tests/queryeval/nearest_neighbor/nearest_neighbor_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'searchlib/src/tests/queryeval/nearest_neighbor/nearest_neighbor_test.cpp')
-rw-r--r--searchlib/src/tests/queryeval/nearest_neighbor/nearest_neighbor_test.cpp117
1 files changed, 60 insertions, 57 deletions
diff --git a/searchlib/src/tests/queryeval/nearest_neighbor/nearest_neighbor_test.cpp b/searchlib/src/tests/queryeval/nearest_neighbor/nearest_neighbor_test.cpp
index 029b74ff914..1e341eab707 100644
--- a/searchlib/src/tests/queryeval/nearest_neighbor/nearest_neighbor_test.cpp
+++ b/searchlib/src/tests/queryeval/nearest_neighbor/nearest_neighbor_test.cpp
@@ -1,37 +1,38 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-#include <vespa/vespalib/testkit/test_kit.h>
-#include <vespa/vespalib/util/stringfmt.h>
-
#include <vespa/eval/eval/simple_value.h>
#include <vespa/eval/eval/tensor_spec.h>
+#include <vespa/searchcommon/attribute/config.h>
#include <vespa/searchlib/common/bitvector.h>
#include <vespa/searchlib/common/feature.h>
#include <vespa/searchlib/fef/matchdata.h>
#include <vespa/searchlib/queryeval/nearest_neighbor_iterator.h>
+#include <vespa/searchlib/queryeval/nns_index_iterator.h>
#include <vespa/searchlib/queryeval/simpleresult.h>
#include <vespa/searchlib/tensor/dense_tensor_attribute.h>
+#include <vespa/searchlib/tensor/distance_calculator.h>
#include <vespa/searchlib/tensor/distance_function_factory.h>
+#include <vespa/vespalib/gtest/gtest.h>
#include <vespa/vespalib/test/insertion_operators.h>
-#include <vespa/searchlib/queryeval/nns_index_iterator.h>
-#include <vespa/searchcommon/attribute/config.h>
+#include <vespa/vespalib/util/stringfmt.h>
#include <vespa/log/log.h>
LOG_SETUP("nearest_neighbor_test");
#define EPS 1.0e-6
-using search::feature_t;
-using search::tensor::DenseTensorAttribute;
using search::AttributeVector;
using search::BitVector;
-using vespalib::eval::Value;
-using vespalib::eval::ValueType;
+using search::attribute::DistanceMetric;
+using search::feature_t;
+using search::tensor::DenseTensorAttribute;
+using search::tensor::DistanceCalculator;
+using search::tensor::DistanceFunction;
using vespalib::eval::CellType;
-using vespalib::eval::TensorSpec;
using vespalib::eval::SimpleValue;
-using search::tensor::DistanceFunction;
-using search::attribute::DistanceMetric;
+using vespalib::eval::TensorSpec;
+using vespalib::eval::Value;
+using vespalib::eval::ValueType;
using namespace search::fef;
using namespace search::queryeval;
@@ -96,7 +97,7 @@ struct Fixture
uint32_t sz = _attr->getNumDocs();
_global_filter = BitVector::create(sz);
for (uint32_t id : docids) {
- EXPECT_LESS(id, sz);
+ EXPECT_LT(id, sz);
_global_filter->setBit(id);
}
}
@@ -112,11 +113,11 @@ struct Fixture
setTensor(docId, *t);
}
- const DistanceFunction *dist_fun() const {
+ const DistanceFunction &dist_fun() const {
if (_cfg.tensorType().cell_type() == CellType::FLOAT) {
- return euclid_f.get();
+ return *euclid_f;
} else {
- return euclid_d.get();
+ return *euclid_d;
}
}
};
@@ -126,10 +127,11 @@ SimpleResult find_matches(Fixture &env, const Value &qtv, double threshold = std
auto md = MatchData::makeTestInstance(2, 2);
auto &tfmd = *(md->resolveTermField(0));
auto &attr = *(env._tensorAttr);
+ DistanceCalculator dist_calc(attr, qtv, env.dist_fun());
NearestNeighborDistanceHeap dh(2);
- dh.set_distance_threshold(env.dist_fun()->convert_threshold(threshold));
+ dh.set_distance_threshold(env.dist_fun().convert_threshold(threshold));
const BitVector *filter = env._global_filter.get();
- auto search = NearestNeighborIterator::create(strict, tfmd, qtv, attr, dh, filter, env.dist_fun());
+ auto search = NearestNeighborIterator::create(strict, tfmd, dist_calc, dh, filter);
if (strict) {
return SimpleResult().searchStrict(*search, attr.getNumDocs());
} else {
@@ -152,33 +154,33 @@ verify_iterator_returns_expected_results(const vespalib::string& attribute_tenso
auto nullTensor = createTensor(query_tensor_type_spec, 0.0, 0.0);
SimpleResult result = find_matches<true>(fixture, *nullTensor);
SimpleResult nullExpect({1,2,4,6});
- EXPECT_EQUAL(result, nullExpect);
+ EXPECT_EQ(result, nullExpect);
result = find_matches<false>(fixture, *nullTensor);
- EXPECT_EQUAL(result, nullExpect);
+ EXPECT_EQ(result, nullExpect);
auto farTensor = createTensor(query_tensor_type_spec, 9.0, 9.0);
SimpleResult farExpect({1,2,3,5});
result = find_matches<true>(fixture, *farTensor);
- EXPECT_EQUAL(result, farExpect);
+ EXPECT_EQ(result, farExpect);
result = find_matches<false>(fixture, *farTensor);
- EXPECT_EQUAL(result, farExpect);
+ EXPECT_EQ(result, farExpect);
SimpleResult null_thr5_exp({1,4,6});
result = find_matches<true>(fixture, *nullTensor, 5.0);
- EXPECT_EQUAL(result, null_thr5_exp);
+ EXPECT_EQ(result, null_thr5_exp);
result = find_matches<false>(fixture, *nullTensor, 5.0);
- EXPECT_EQUAL(result, null_thr5_exp);
+ EXPECT_EQ(result, null_thr5_exp);
SimpleResult far_thr4_exp({2,5});
result = find_matches<true>(fixture, *farTensor, 4.0);
- EXPECT_EQUAL(result, far_thr4_exp);
+ EXPECT_EQ(result, far_thr4_exp);
result = find_matches<false>(fixture, *farTensor, 4.0);
- EXPECT_EQUAL(result, far_thr4_exp);
+ EXPECT_EQ(result, far_thr4_exp);
}
-TEST("require that NearestNeighborIterator returns expected results") {
- TEST_DO(verify_iterator_returns_expected_results(denseSpecDouble, denseSpecDouble));
- TEST_DO(verify_iterator_returns_expected_results(denseSpecFloat, denseSpecFloat));
+TEST(NnsIndexIteratorTest, require_that_iterator_returns_expected_results) {
+ verify_iterator_returns_expected_results(denseSpecDouble, denseSpecDouble);
+ verify_iterator_returns_expected_results(denseSpecFloat, denseSpecFloat);
}
void
@@ -197,20 +199,20 @@ verify_iterator_returns_filtered_results(const vespalib::string& attribute_tenso
auto nullTensor = createTensor(query_tensor_type_spec, 0.0, 0.0);
SimpleResult result = find_matches<true>(fixture, *nullTensor);
SimpleResult nullExpect({1,3,4});
- EXPECT_EQUAL(result, nullExpect);
+ EXPECT_EQ(result, nullExpect);
result = find_matches<false>(fixture, *nullTensor);
- EXPECT_EQUAL(result, nullExpect);
+ EXPECT_EQ(result, nullExpect);
auto farTensor = createTensor(query_tensor_type_spec, 9.0, 9.0);
SimpleResult farExpect({1,3,4});
result = find_matches<true>(fixture, *farTensor);
- EXPECT_EQUAL(result, farExpect);
+ EXPECT_EQ(result, farExpect);
result = find_matches<false>(fixture, *farTensor);
- EXPECT_EQUAL(result, farExpect);
+ EXPECT_EQ(result, farExpect);
}
-TEST("require that NearestNeighborIterator returns filtered results") {
- TEST_DO(verify_iterator_returns_filtered_results(denseSpecDouble, denseSpecDouble));
- TEST_DO(verify_iterator_returns_filtered_results(denseSpecFloat, denseSpecFloat));
+TEST(NnsIndexIteratorTest, require_that_iterator_returns_filtered_results) {
+ verify_iterator_returns_filtered_results(denseSpecDouble, denseSpecDouble);
+ verify_iterator_returns_filtered_results(denseSpecFloat, denseSpecFloat);
}
template <bool strict>
@@ -218,8 +220,9 @@ std::vector<feature_t> get_rawscores(Fixture &env, const Value &qtv) {
auto md = MatchData::makeTestInstance(2, 2);
auto &tfmd = *(md->resolveTermField(0));
auto &attr = *(env._tensorAttr);
+ DistanceCalculator dist_calc(attr, qtv, env.dist_fun());
NearestNeighborDistanceHeap dh(2);
- auto search = NearestNeighborIterator::create(strict, tfmd, qtv, attr, dh, nullptr, env.dist_fun());
+ auto search = NearestNeighborIterator::create(strict, tfmd, dist_calc, dh, nullptr);
uint32_t limit = attr.getNumDocs();
uint32_t docid = 1;
search->initRange(docid, limit);
@@ -249,63 +252,63 @@ verify_iterator_sets_expected_rawscore(const vespalib::string& attribute_tensor_
auto nullTensor = createTensor(query_tensor_type_spec, 0.0, 0.0);
std::vector<feature_t> got = get_rawscores<true>(fixture, *nullTensor);
std::vector<feature_t> expected{5.0, 13.0, 10.0, 10.0, 5.0};
- EXPECT_EQUAL(got.size(), expected.size());
+ EXPECT_EQ(got.size(), expected.size());
for (size_t i = 0; i < expected.size(); ++i) {
- EXPECT_APPROX(1.0/(1.0+expected[i]), got[i], EPS);
+ EXPECT_NEAR(1.0/(1.0+expected[i]), got[i], EPS);
}
got = get_rawscores<false>(fixture, *nullTensor);
- EXPECT_EQUAL(got.size(), expected.size());
+ EXPECT_EQ(got.size(), expected.size());
for (size_t i = 0; i < expected.size(); ++i) {
- EXPECT_APPROX(1.0/(1.0+expected[i]), got[i], EPS);
+ EXPECT_NEAR(1.0/(1.0+expected[i]), got[i], EPS);
}
}
-TEST("require that NearestNeighborIterator sets expected rawscore") {
- TEST_DO(verify_iterator_sets_expected_rawscore(denseSpecDouble, denseSpecDouble));
- TEST_DO(verify_iterator_sets_expected_rawscore(denseSpecFloat, denseSpecFloat));
+TEST(NnsIndexIteratorTest, require_that_iterator_sets_expected_rawscore) {
+ verify_iterator_sets_expected_rawscore(denseSpecDouble, denseSpecDouble);
+ verify_iterator_sets_expected_rawscore(denseSpecFloat, denseSpecFloat);
}
-TEST("require that NnsIndexIterator works as expected") {
+TEST(NnsIndexIteratorTest, require_that_iterator_works_as_expected) {
std::vector<NnsIndexIterator::Hit> hits{{2,4.0}, {3,9.0}, {5,1.0}, {8,16.0}, {9,36.0}};
auto md = MatchData::makeTestInstance(2, 2);
auto &tfmd = *(md->resolveTermField(0));
- auto search = NnsIndexIterator::create(tfmd, hits, euclid_d.get());
+ auto search = NnsIndexIterator::create(tfmd, hits, *euclid_d);
uint32_t docid = 1;
search->initFullRange();
bool match = search->seek(docid);
EXPECT_FALSE(match);
EXPECT_FALSE(search->isAtEnd());
- EXPECT_EQUAL(2u, search->getDocId());
+ EXPECT_EQ(2u, search->getDocId());
docid = 2;
match = search->seek(docid);
EXPECT_TRUE(match);
EXPECT_FALSE(search->isAtEnd());
- EXPECT_EQUAL(docid, search->getDocId());
+ EXPECT_EQ(docid, search->getDocId());
search->unpack(docid);
- EXPECT_APPROX(1.0/(1.0+2.0), tfmd.getRawScore(), EPS);
+ EXPECT_NEAR(1.0/(1.0+2.0), tfmd.getRawScore(), EPS);
docid = 3;
match = search->seek(docid);
EXPECT_TRUE(match);
EXPECT_FALSE(search->isAtEnd());
- EXPECT_EQUAL(docid, search->getDocId());
+ EXPECT_EQ(docid, search->getDocId());
search->unpack(docid);
- EXPECT_APPROX(1.0/(1.0+3.0), tfmd.getRawScore(), EPS);
+ EXPECT_NEAR(1.0/(1.0+3.0), tfmd.getRawScore(), EPS);
docid = 4;
match = search->seek(docid);
EXPECT_FALSE(match);
EXPECT_FALSE(search->isAtEnd());
- EXPECT_EQUAL(5u, search->getDocId());
+ EXPECT_EQ(5u, search->getDocId());
docid = 6;
match = search->seek(docid);
EXPECT_FALSE(match);
EXPECT_FALSE(search->isAtEnd());
- EXPECT_EQUAL(8u, search->getDocId());
+ EXPECT_EQ(8u, search->getDocId());
docid = 8;
search->unpack(docid);
- EXPECT_APPROX(1.0/(1.0+4.0), tfmd.getRawScore(), EPS);
+ EXPECT_NEAR(1.0/(1.0+4.0), tfmd.getRawScore(), EPS);
docid = 9;
match = search->seek(docid);
EXPECT_TRUE(match);
@@ -320,10 +323,10 @@ TEST("require that NnsIndexIterator works as expected") {
match = search->seek(docid);
EXPECT_FALSE(match);
EXPECT_FALSE(search->isAtEnd());
- EXPECT_EQUAL(5u, search->getDocId());
+ EXPECT_EQ(5u, search->getDocId());
docid = 5;
search->unpack(docid);
- EXPECT_APPROX(1.0/(1.0+1.0), tfmd.getRawScore(), EPS);
+ EXPECT_NEAR(1.0/(1.0+1.0), tfmd.getRawScore(), EPS);
EXPECT_FALSE(search->isAtEnd());
docid = 6;
match = search->seek(docid);
@@ -331,4 +334,4 @@ TEST("require that NnsIndexIterator works as expected") {
EXPECT_TRUE(search->isAtEnd());
}
-TEST_MAIN() { TEST_RUN_ALL(); }
+GTEST_MAIN_RUN_ALL_TESTS()