/* * tests/vptree_tests.cpp * * Unit tests for VPTree (knn queries) * * Copyright (C) 2023 Douglas Rumbaugh * * All rights reserved. Published under the Modified BSD License. * */ #include "shard/VPTree.h" #include "testing.h" #include "vptree.hpp" #include using namespace de; typedef VPTree Shard; START_TEST(t_mbuffer_init) { size_t n= 24; auto buffer = new MutableBuffer(n, n); for (int64_t i=0; iappend({i, i}); } Shard* shard = new Shard(buffer); ck_assert_uint_eq(shard->get_record_count(), n); delete buffer; delete shard; } START_TEST(t_wss_init) { size_t n = 512; auto mbuffer1 = create_2d_mbuffer(n); auto mbuffer2 = create_2d_mbuffer(n); auto mbuffer3 = create_2d_mbuffer(n); auto shard1 = new Shard(mbuffer1); auto shard2 = new Shard(mbuffer2); auto shard3 = new Shard(mbuffer3); Shard* shards[3] = {shard1, shard2, shard3}; auto shard4 = new Shard(shards, 3); ck_assert_int_eq(shard4->get_record_count(), n * 3); ck_assert_int_eq(shard4->get_tombstone_count(), 0); delete mbuffer1; delete mbuffer2; delete mbuffer3; delete shard1; delete shard2; delete shard3; delete shard4; } START_TEST(t_point_lookup) { size_t n = 16; auto buffer = create_2d_sequential_mbuffer(n); auto wss = Shard(buffer); for (size_t i=0; iget_data() + i); r.data[0] = rec->rec.data[0]; r.data[1] = rec->rec.data[1]; auto result = wss.point_lookup(r); ck_assert_ptr_nonnull(result); ck_assert_int_eq(result->rec.data[0], r.data[0]); ck_assert_int_eq(result->rec.data[1], r.data[1]); } delete buffer; } END_TEST START_TEST(t_point_lookup_miss) { size_t n = 10000; auto buffer = create_2d_sequential_mbuffer(n); auto wss = Shard(buffer); for (size_t i=n + 100; i<2*n; i++) { PRec r; r.data[0] = i; r.data[1] = i; auto result = wss.point_lookup(r); ck_assert_ptr_null(result); } delete buffer; } START_TEST(t_buffer_query) { size_t n = 10000; auto buffer = create_2d_sequential_mbuffer(n); PRec target; target.data[0] = 120; target.data[1] = 120; KNNQueryParms p; p.k = 10; p.point = target; auto state = KNNQuery::get_buffer_query_state(buffer, &p); auto result = KNNQuery::buffer_query(buffer, state, &p); KNNQuery::delete_buffer_query_state(state); std::sort(result.begin(), result.end()); size_t start = 120 - 5; for (size_t i=0; i p; p.k = 10; p.point = target; auto state = KNNQuery::get_buffer_query_state(buffer, &p); auto result = KNNQuery::buffer_query(buffer, state, &p); KNNQuery::delete_buffer_query_state(state); auto vptree = VPTree(buffer); auto state_2 = KNNQuery::get_query_state(&vptree, &p); auto result_2 = KNNQuery::query(&vptree, state_2, &p); KNNQuery::delete_query_state(state_2); std::sort(result_2.begin(), result_2.end()); size_t start = 46; for (size_t i=0; i