diff options
Diffstat (limited to 'searchlib/src/tests/features/nns_closeness/nns_closeness_test.cpp')
-rw-r--r-- | searchlib/src/tests/features/nns_closeness/nns_closeness_test.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/searchlib/src/tests/features/nns_closeness/nns_closeness_test.cpp b/searchlib/src/tests/features/nns_closeness/nns_closeness_test.cpp index 8cb060c08e4..703f03918d8 100644 --- a/searchlib/src/tests/features/nns_closeness/nns_closeness_test.cpp +++ b/searchlib/src/tests/features/nns_closeness/nns_closeness_test.cpp @@ -16,6 +16,7 @@ using namespace search::features; using namespace search::fef::test; using namespace search::fef; +using search::attribute::DistanceMetric; using vespalib::eval::TensorSpec; const vespalib::string labelFeatureName("closeness(label,nns)"); @@ -146,4 +147,23 @@ TEST(NnsClosenessTest, raw_score_is_calculated_on_the_fly_using_label_setup) expect_raw_score_calculated_on_the_fly(f2); } +TEST(NnsClosenessTest, can_return_negative_values_with_dotproduct_distance_metric) +{ + NoLabel f1; + RankFixture f2(0, 2, f1, fieldFeatureName, "tensor(x[2]):[2,3]", DistanceMetric::Dotproduct); + ASSERT_FALSE(f2.failed()); + + f2.set_bar_rawscore(0, 7, 5.0); + f2.set_bar_rawscore(1, 8, -5.0); + f2.set_attribute_tensor(9, TensorSpec::from_expr("tensor(x[2]):[4,5]")); + f2.set_attribute_tensor(10, TensorSpec::from_expr("tensor(x[2]):[-4,-5]")); + + // For docids 9 and 10 the raw score is calculated on the fly + // using a distance calculator over the attribute and query tensors. + EXPECT_EQ(5.0, f2.getScore(7)); + EXPECT_EQ(-5.0, f2.getScore(8)); + EXPECT_EQ(23.0, f2.getScore(9)); + EXPECT_EQ(-23.0, f2.getScore(10)); +} + GTEST_MAIN_RUN_ALL_TESTS() |