diff options
| author | Douglas Rumbaugh <dbr4@psu.edu> | 2023-07-24 18:17:57 -0400 |
|---|---|---|
| committer | Douglas Rumbaugh <dbr4@psu.edu> | 2023-07-24 18:17:57 -0400 |
| commit | 5ab408321dd45865a88fed71d11efe01dd7715d9 (patch) | |
| tree | 21a77ebf79dfeb4761a4346b5de47da50594d9b2 /tests | |
| parent | d02fe67962c8002ddc6e0d6569128ae2645ea7fc (diff) | |
| download | dynamic-extension-5ab408321dd45865a88fed71d11efe01dd7715d9.tar.gz | |
VPTree: added a level of indirection to avoid repeated point copies
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/vptree_tests.cpp | 43 |
1 files changed, 25 insertions, 18 deletions
diff --git a/tests/vptree_tests.cpp b/tests/vptree_tests.cpp index 894e64a..06f147b 100644 --- a/tests/vptree_tests.cpp +++ b/tests/vptree_tests.cpp @@ -137,31 +137,38 @@ START_TEST(t_buffer_query) START_TEST(t_knn_query) { - size_t n = 100; + size_t n = 1000; auto buffer = create_2d_sequential_mbuffer(n); - PRec target; - target.data[0] = 50; - target.data[1] = 50; + auto vptree = VPTree<PRec>(buffer); KNNQueryParms<PRec> p; - p.k = 10; - p.point = target; + for (size_t i=0; i<100; i++) { + p.k = rand() % 150; + p.point.data[0] = rand() % (n-p.k); + p.point.data[1] = p.point.data[0]; - auto state = KNNQuery<PRec>::get_buffer_query_state(buffer, &p); - auto result = KNNQuery<PRec>::buffer_query(buffer, state, &p); + auto state = KNNQuery<PRec>::get_query_state(&vptree, &p); + auto results = KNNQuery<PRec>::query(&vptree, state, &p); + KNNQuery<PRec>::delete_query_state(state); - KNNQuery<PRec>::delete_buffer_query_state(state); + ck_assert_int_eq(results.size(), p.k); - auto vptree = VPTree<PRec>(buffer); - auto state_2 = KNNQuery<PRec>::get_query_state(&vptree, &p); - auto result_2 = KNNQuery<PRec>::query(&vptree, state_2, &p); - KNNQuery<PRec>::delete_query_state(state_2); - - std::sort(result_2.begin(), result_2.end()); - size_t start = 46; - for (size_t i=0; i<result_2.size(); i++) { - ck_assert_int_eq(result_2[i].rec.data[0], start++); + std::sort(results.begin(), results.end()); + + if ((int64_t) (p.point.data[0] - p.k/2 - 1) < 0) { + ck_assert_int_eq(results[0].rec.data[0], 0); + } else { + ck_assert(results[0].rec.data[0] == (p.point.data[0] - p.k/2 - 1) || + results[0].rec.data[0] == (p.point.data[0] - p.k/2) || + results[0].rec.data[0] == (p.point.data[0] - p.k/2 + 1)); + } + + + size_t start = results[0].rec.data[0]; + for (size_t i=0; i<results.size(); i++) { + ck_assert_int_eq(results[i].rec.data[0], start++); + } } delete buffer; |