diff options
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.cpp | 117 |
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() |