1#ifndef KNNCOLLE_HNSW_DISTANCES_HPP
2#define KNNCOLLE_HNSW_DISTANCES_HPP
30template<
typename Distance_,
typename HnswData_ =
float>
35 std::function<hnswlib::SpaceInterface<HnswData_>*(std::size_t)>
create;
54template<
typename HnswData_ =
float>
57 std::size_t my_data_size;
70 std::size_t get_data_size() {
74 hnswlib::DISTFUNC<HnswData_> get_dist_func() {
78 void * get_dist_func_param() {
83 static HnswData_ L1(
const void *pVect1v,
const void *pVect2v,
const void *qty_ptr) {
84 const HnswData_* pVect1 =
static_cast<const HnswData_*
>(pVect1v);
85 const HnswData_* pVect2 =
static_cast<const HnswData_*
>(pVect2v);
86 std::size_t qty = *((
size_t *) qty_ptr);
88 for (; qty > 0; --qty, ++pVect1, ++pVect2) {
89 res += std::abs(*pVect1 - *pVect2);
103template<
typename HnswData_ =
float>
106 std::size_t my_data_size;
119 std::size_t get_data_size() {
123 hnswlib::DISTFUNC<HnswData_> get_dist_func() {
127 void * get_dist_func_param() {
132 static HnswData_ L2(
const void *pVect1v,
const void *pVect2v,
const void *qty_ptr) {
133 const HnswData_* pVect1 =
static_cast<const HnswData_*
>(pVect1v);
134 const HnswData_* pVect2 =
static_cast<const HnswData_*
>(pVect2v);
135 std::size_t qty = *((
size_t *) qty_ptr);
137 for (; qty > 0; --qty, ++pVect1, ++pVect2) {
138 auto delta = *pVect1 - *pVect2;
139 res += delta * delta;
154template<
typename Distance_,
typename HnswData_ =
float>
157 output.
create = [](std::size_t dim) -> hnswlib::SpaceInterface<HnswData_>* {
158 if constexpr(std::is_same<HnswData_, float>::value) {
159 return static_cast<hnswlib::SpaceInterface<HnswData_>*
>(
new hnswlib::L2Space(dim));
173template<
typename Distance_,
typename HnswData_ =
float>
176 output.
create = [](std::size_t dim) -> hnswlib::SpaceInterface<HnswData_>* {
187template<
typename HnswData_ =
float,
typename Distance_ =
double>
188DistanceConfig<Distance_, HnswData_> makeEuclideanDistanceConfig() {
192template<
typename HnswData_ =
float,
typename Distance_ =
double>
193DistanceConfig<Distance_, HnswData_> makeManhattanDistanceConfig() {
211template<
typename HnswData_>
213 if (
dynamic_cast<const hnswlib::L2Space*
>(distance) != NULL) {
216 return "squared_euclidean";
Manhattan distance.
Definition distances.hpp:55
ManhattanDistance(std::size_t dim)
Definition distances.hpp:64
Squared Euclidean distance.
Definition distances.hpp:104
SquaredEuclideanDistance(std::size_t dim)
Definition distances.hpp:113
knncolle bindings for HNSW search.
Definition distances.hpp:13
DistanceNormalizeMethod
Definition distances.hpp:22
DistanceConfig< Distance_, HnswData_ > configure_euclidean_distance()
Definition distances.hpp:155
const char * get_distance_name(const hnswlib::SpaceInterface< HnswData_ > *distance)
Definition distances.hpp:212
DistanceConfig< Distance_, HnswData_ > configure_manhattan_distance()
Definition distances.hpp:174
Distance configuration for the HNSW index.
Definition distances.hpp:31
DistanceNormalizeMethod normalize_method
Definition distances.hpp:40
std::function< hnswlib::SpaceInterface< HnswData_ > *(std::size_t)> create
Definition distances.hpp:35
std::function< Distance_(Distance_)> custom_normalize
Definition distances.hpp:46