diff options
Diffstat (limited to 'include/framework/interface')
| -rw-r--r-- | include/framework/interface/Query.h | 35 | ||||
| -rw-r--r-- | include/framework/interface/Record.h | 214 | ||||
| -rw-r--r-- | include/framework/interface/Scheduler.h | 31 | ||||
| -rw-r--r-- | include/framework/interface/Shard.h | 26 |
4 files changed, 306 insertions, 0 deletions
diff --git a/include/framework/interface/Query.h b/include/framework/interface/Query.h new file mode 100644 index 0000000..46a1ce1 --- /dev/null +++ b/include/framework/interface/Query.h @@ -0,0 +1,35 @@ +/* + * include/framework/QueryInterface.h + * + * Copyright (C) 2023 Douglas Rumbaugh <drumbaugh@psu.edu> + * + * All rights reserved. Published under the Modified BSD License. + * + */ +#pragma once + +#include <vector> +#include <concepts> +#include "util/types.h" + +template <typename Q> +concept QueryInterface = requires(Q q, void *p, std::vector<void*> &s) { + +/* + {q.get_query_state(p, p)} -> std::convertible_to<void*>; + {q.get_buffer_query_state(p, p)}; + {q.query(p, p)}; + {q.buffer_query(p, p)}; + {q.merge()}; + {q.delete_query_state(p)}; +*/ + {Q::EARLY_ABORT} -> std::convertible_to<bool>; + {Q::SKIP_DELETE_FILTER} -> std::convertible_to<bool>; + //{Q::get_query_state(p, p)} -> std::convertible_to<void*>; + //{Q::get_buffer_query_state(p, p)} -> std::convertible_to<void*>; + {Q::process_query_states(p, s, p)}; + + {Q::delete_query_state(std::declval<void*>())} -> std::same_as<void>; + {Q::delete_buffer_query_state(p)}; + +}; diff --git a/include/framework/interface/Record.h b/include/framework/interface/Record.h new file mode 100644 index 0000000..1ef1984 --- /dev/null +++ b/include/framework/interface/Record.h @@ -0,0 +1,214 @@ +/* + * include/framework/RecordInterface.h + * + * Copyright (C) 2023 Douglas Rumbaugh <drumbaugh@psu.edu> + * Dong Xie <dongx@psu.edu> + * + * All rights reserved. Published under the Modified BSD License. + * + */ +#pragma once + +#include <cstring> +#include <concepts> +#include <cmath> + +#include "psu-util/hash.h" + +namespace de { + +template<typename R> +concept RecordInterface = requires(R r, R s) { + { r < s } ->std::convertible_to<bool>; + { r == s } ->std::convertible_to<bool>; +}; + +template<typename R> +concept WeightedRecordInterface = requires(R r) { + {r.weight} -> std::convertible_to<double>; +}; + +template<typename R> +concept NDRecordInterface = RecordInterface<R> && requires(R r, R s) { + {r.calc_distance(s)} -> std::convertible_to<double>; +}; + +template <typename R> +concept KVPInterface = RecordInterface<R> && requires(R r) { + r.key; + r.value; +}; + +template<typename R> +concept AlexInterface = KVPInterface<R> && requires(R r) { + {r.key} -> std::convertible_to<size_t>; + {r.value} -> std::convertible_to<size_t>; +}; + +template<typename R> +concept WrappedInterface = RecordInterface<R> && requires(R r, R s, bool b) { + {r.header} -> std::convertible_to<uint32_t>; + r.rec; + {r.set_delete()}; + {r.is_deleted()} -> std::convertible_to<bool>; + {r.set_tombstone(b)}; + {r.is_tombstone()} -> std::convertible_to<bool>; + {r < s} -> std::convertible_to<bool>; + {r == s} ->std::convertible_to<bool>; +}; + +template<RecordInterface R> +struct Wrapped { + uint32_t header; + R rec; + + inline void set_delete() { + header |= 2; + } + + inline bool is_deleted() const { + return header & 2; + } + + inline void set_tombstone(bool val=true) { + if (val) { + header |= val; + } else { + header &= 0; + } + } + + inline bool is_tombstone() const { + return header & 1; + } + + inline bool operator<(const Wrapped& other) const { + return rec < other.rec || (rec == other.rec && header < other.header); + } + + inline bool operator==(const Wrapped& other) const { + return rec == other.rec; + } + +}; + +template <typename K, typename V> +struct Record { + K key; + V value; + uint32_t header = 0; + + inline bool operator<(const Record& other) const { + return key < other.key || (key == other.key && value < other.value); + } + + inline bool operator==(const Record& other) const { + return key == other.key && value == other.value; + } +}; + +template <typename K, typename V, typename W> +struct WeightedRecord { + K key; + V value; + W weight = 1; + + inline bool operator==(const WeightedRecord& other) const { + return key == other.key && value == other.value; + } + + inline bool operator<(const WeightedRecord& other) const { + return key < other.key || (key == other.key && value < other.value); + } +}; + + +template <typename V, size_t D=2> +struct CosinePoint{ + V data[D]; + + inline bool operator==(const CosinePoint& other) const { + for (size_t i=0; i<D; i++) { + if (data[i] != other.data[i]) { + return false; + } + } + + return true; + } + + // lexicographic order + inline bool operator<(const CosinePoint& other) const { + for (size_t i=0; i<D; i++) { + if (data[i] < other.data[i]) { + return true; + } else if (data[i] > other.data[i]) { + return false; + } + } + + return false; + } + + inline double calc_distance(const CosinePoint& other) const { + + double prod = 0; + double asquared = 0; + double bsquared = 0; + + for (size_t i=0; i<D; i++) { + prod += data[i] * other.data[i]; + asquared += data[i]*data[i]; + bsquared += other.data[i]*other.data[i]; + } + + return prod / std::sqrt(asquared * bsquared); + } +}; + + +template <typename V, size_t D=2> +struct EuclidPoint{ + V data[D]; + + inline bool operator==(const EuclidPoint& other) const { + for (size_t i=0; i<D; i++) { + if (data[i] != other.data[i]) { + return false; + } + } + + return true; + } + + // lexicographic order + inline bool operator<(const EuclidPoint& other) const { + for (size_t i=0; i<D; i++) { + if (data[i] < other.data[i]) { + return true; + } else if (data[i] > other.data[i]) { + return false; + } + } + + return false; + } + + inline double calc_distance(const EuclidPoint& other) const { + double dist = 0; + for (size_t i=0; i<D; i++) { + dist += (data[i] - other.data[i]) * (data[i] - other.data[i]); + } + + return std::sqrt(dist); + } +}; + +template<RecordInterface R> +struct RecordHash { + size_t operator()(R const &rec) const { + return psudb::hash_bytes((std::byte *) &rec, sizeof(R)); + } +}; + +} diff --git a/include/framework/interface/Scheduler.h b/include/framework/interface/Scheduler.h new file mode 100644 index 0000000..1445e90 --- /dev/null +++ b/include/framework/interface/Scheduler.h @@ -0,0 +1,31 @@ +/* + * include/framework/QueryInterface.h + * + * Copyright (C) 2023 Douglas Rumbaugh <drumbaugh@psu.edu> + * + * All rights reserved. Published under the Modified BSD License. + * + */ +#pragma once + +#include <vector> +#include <concepts> +#include "framework/interface/Record.h" +#include "util/types.h" + +template <typename S> +concept SchedulerInterface = requires(S s, size_t i, void *vp) { + {S(i, i)}; +// {s.schedule_merge(vp, vp)}; + +/* + {q.get_query_state(p, p)} -> std::convertible_to<void*>; + {q.get_buffer_query_state(p, p)}; + {q.query(p, p)}; + {q.buffer_query(p, p)}; + {q.merge()}; + {q.delete_query_state(p)}; +*/ + //{Q::get_query_state(p, p)} -> std::convertible_to<void*>; + //{Q::get_buffer_query_state(p, p)} -> std::convertible_to<void*>; +}; diff --git a/include/framework/interface/Shard.h b/include/framework/interface/Shard.h new file mode 100644 index 0000000..ea58b2a --- /dev/null +++ b/include/framework/interface/Shard.h @@ -0,0 +1,26 @@ +/* + * include/framework/ShardInterface.h + * + * Copyright (C) 2023 Douglas Rumbaugh <drumbaugh@psu.edu> + * + * All rights reserved. Published under the Modified BSD License. + * + */ +#pragma once + +#include <concepts> + +#include "util/types.h" +#include "framework/interface/Record.h" + +namespace de { + +//template <template<typename> typename S, typename R> +template <typename S> +concept ShardInterface = requires(S s, void *p, bool b) { + //{s.point_lookup(r, b) } -> std::same_as<R*>; + {s.get_record_count()} -> std::convertible_to<size_t>; + {s.get_memory_usage()} -> std::convertible_to<size_t>; +}; + +} |