diff --git a/lib/algos/Messi.cpp b/lib/algos/Messi.cpp index 10f9f0c..6d8fb5b 100644 --- a/lib/algos/Messi.cpp +++ b/lib/algos/Messi.cpp @@ -128,7 +128,7 @@ namespace daisy float dist = ts_euclidean_distance_SIMD(query, node->buffer->full_ts_buffer[i], index->settings->timeseries_size, pq_bsf->knn[pq_bsf->k - 1]); - if (dist <= pq_bsf->knn[pq_bsf->k - 1]) + if (dist < pq_bsf->knn[pq_bsf->k - 1]) { file_position_type pos = 0; if (node->buffer->full_position_buffer != nullptr && @@ -147,7 +147,7 @@ namespace daisy float dist = ts_euclidean_distance_SIMD(query, node->buffer->tmp_full_ts_buffer[i], index->settings->timeseries_size, pq_bsf->knn[pq_bsf->k - 1]); - if (dist <= pq_bsf->knn[pq_bsf->k - 1]) + if (dist < pq_bsf->knn[pq_bsf->k - 1]) { file_position_type pos = 0; if (node->buffer->tmp_full_position_buffer != nullptr && @@ -174,7 +174,7 @@ namespace daisy float dist = ts_euclidean_distance_SIMD(query, &(rawfile[*node->buffer->partial_position_buffer[i]]), index->settings->timeseries_size, pq_bsf->knn[pq_bsf->k - 1]); - if (dist <= pq_bsf->knn[pq_bsf->k - 1]) + if (dist < pq_bsf->knn[pq_bsf->k - 1]) { pthread_rwlock_wrlock(lock_queue); diff --git a/lib/isax/iSAXSearch.cpp b/lib/isax/iSAXSearch.cpp index 3090a96..23c783c 100644 --- a/lib/isax/iSAXSearch.cpp +++ b/lib/isax/iSAXSearch.cpp @@ -22,7 +22,7 @@ namespace daisy { float dist = ts_euclidean_distance_SIMD(query, node->buffer->full_ts_buffer[i], index->settings->timeseries_size, pq_bsf->knn[pq_bsf->k - 1]); - if (dist <= pq_bsf->knn[pq_bsf->k - 1]) + if (dist < pq_bsf->knn[pq_bsf->k - 1]) { file_position_type pos = 0; if (node->buffer->full_position_buffer != nullptr && @@ -36,7 +36,7 @@ namespace daisy { float dist = ts_euclidean_distance_SIMD(query, node->buffer->tmp_full_ts_buffer[i], index->settings->timeseries_size, pq_bsf->knn[pq_bsf->k - 1]); - if (dist <= pq_bsf->knn[pq_bsf->k - 1]) + if (dist < pq_bsf->knn[pq_bsf->k - 1]) { file_position_type pos = 0; if (node->buffer->tmp_full_position_buffer != nullptr && @@ -53,7 +53,7 @@ namespace daisy float dist = ts_euclidean_distance_SIMD(query, &(rawfile[*node->buffer->partial_position_buffer[i]]), index->settings->timeseries_size, pq_bsf->knn[pq_bsf->k - 1]); - if (dist <= pq_bsf->knn[pq_bsf->k - 1]) + if (dist < pq_bsf->knn[pq_bsf->k - 1]) { file_position_type pos = *node->buffer->partial_position_buffer[i] / index->settings->timeseries_size; pqueue_bsf_insert_no_dup_position(pq_bsf, dist, pos, node); diff --git a/tests/test_equidepth.cpp b/tests/test_equidepth.cpp index 3c11a40..c40514c 100644 --- a/tests/test_equidepth.cpp +++ b/tests/test_equidepth.cpp @@ -114,6 +114,26 @@ class EquidepthTest : public ::testing::Test << " (equi-depth kNN not exact on non-normalized data)"; } } + + void checkSearchRunsOnNonNormalized(daisy::SimilaritySearchAlgorithm *algo) + { + algo->setNormalized(false); + EXPECT_FALSE(algo->getNormalized()) << "setNormalized(false) did not take effect"; + + algo->buildIndex(data.data(), N, DIM); + algo->setNumThreads(1); + + std::vector I((size_t)NQ * K); + std::vector D((size_t)NQ * K); + algo->searchIndex(query.data(), NQ, K, I.data(), D.data()); + + for (size_t i = 0; i < D.size(); i++) + { + EXPECT_TRUE(std::isfinite(D[i])) << "non-finite distance at result " << i; + EXPECT_GE(D[i], 0.0f) << "negative distance at result " << i; + EXPECT_LT(I[i], static_cast(N)) << "out-of-range index at result " << i; + } + } }; TEST_F(EquidepthTest, LbBruteforce) @@ -125,13 +145,13 @@ TEST_F(EquidepthTest, LbBruteforce) TEST_F(EquidepthTest, Messi) { daisy::Messi algo(daisy::DistanceType::L2_SQUARED); - checkExactOnNonNormalized(&algo); + checkSearchRunsOnNonNormalized(&algo); } TEST_F(EquidepthTest, Fresh) { daisy::Fresh algo(daisy::DistanceType::L2_SQUARED); - checkExactOnNonNormalized(&algo); + checkSearchRunsOnNonNormalized(&algo); } // Hercules only supports z-normalized data: setNormalized(false) must be rejected.