summaryrefslogtreecommitdiffstats
path: root/include/shard/VPTree.h
diff options
context:
space:
mode:
authorDouglas Rumbaugh <dbr4@psu.edu>2023-07-27 18:21:26 -0400
committerDouglas Rumbaugh <dbr4@psu.edu>2023-07-27 18:21:26 -0400
commitd6e08e9d8d3ac9b356ac50cee22b41f828160247 (patch)
tree2c1f62f6385072e1a824e557693634acc3136cdd /include/shard/VPTree.h
parentf462921cbc52688fb478c6ac86a891e596fd6053 (diff)
downloaddynamic-extension-d6e08e9d8d3ac9b356ac50cee22b41f828160247.tar.gz
Expanded query interface
Query interface now enables skipping of delete processing and stopping query processing when first match is found.
Diffstat (limited to 'include/shard/VPTree.h')
-rw-r--r--include/shard/VPTree.h13
1 files changed, 8 insertions, 5 deletions
diff --git a/include/shard/VPTree.h b/include/shard/VPTree.h
index 5f740dc..86f4ab7 100644
--- a/include/shard/VPTree.h
+++ b/include/shard/VPTree.h
@@ -424,6 +424,9 @@ private:
template <NDRecordInterface R>
class KNNQuery {
public:
+ constexpr static bool EARLY_ABORT=false;
+ constexpr static bool SKIP_DELETE_FILTER=true;
+
static void *get_query_state(VPTree<R> *wss, void *parms) {
return nullptr;
}
@@ -432,7 +435,7 @@ public:
return nullptr;
}
- static void process_query_states(void *query_parms, std::vector<void*> shard_states, void *buff_state) {
+ static void process_query_states(void *query_parms, std::vector<void*> &shard_states, void *buff_state) {
return;
}
@@ -494,7 +497,7 @@ public:
return results;
}
- static std::vector<R> merge(std::vector<std::vector<R>> &results, void *parms) {
+ static std::vector<R> merge(std::vector<std::vector<Wrapped<R>>> &results, void *parms) {
KNNQueryParms<R> *p = (KNNQueryParms<R> *) parms;
R rec = p->point;
size_t k = p->k;
@@ -503,14 +506,14 @@ public:
for (size_t i=0; i<results.size(); i++) {
for (size_t j=0; j<results[i].size(); j++) {
if (pq.size() < k) {
- pq.push(&results[i][j]);
+ pq.push(&results[i][j].rec);
} else {
double head_dist = pq.peek().data->calc_distance(rec);
- double cur_dist = results[i][j].calc_distance(rec);
+ double cur_dist = results[i][j].rec.calc_distance(rec);
if (cur_dist < head_dist) {
pq.pop();
- pq.push(&results[i][j]);
+ pq.push(&results[i][j].rec);
}
}
}