1#ifndef KNNCOLLE_HNSW_DISTANCES_HPP
2#define KNNCOLLE_HNSW_DISTANCES_HPP
20template<
typename HnswData_ =
float>
25 std::function<hnswlib::SpaceInterface<HnswData_>*(std::size_t)>
create;
39template<
typename HnswData_ =
float>
42 std::size_t my_data_size;
55 std::size_t get_data_size() {
59 hnswlib::DISTFUNC<HnswData_> get_dist_func() {
63 void * get_dist_func_param() {
68 static HnswData_ L1(
const void *pVect1v,
const void *pVect2v,
const void *qty_ptr) {
69 const HnswData_* pVect1 =
static_cast<const HnswData_*
>(pVect1v);
70 const HnswData_* pVect2 =
static_cast<const HnswData_*
>(pVect2v);
71 std::size_t qty = *((
size_t *) qty_ptr);
73 for (; qty > 0; --qty, ++pVect1, ++pVect2) {
74 res += std::abs(*pVect1 - *pVect2);
88template<
typename HnswData_ =
float>
91 std::size_t my_data_size;
104 std::size_t get_data_size() {
108 hnswlib::DISTFUNC<HnswData_> get_dist_func() {
112 void * get_dist_func_param() {
117 static HnswData_ L2(
const void *pVect1v,
const void *pVect2v,
const void *qty_ptr) {
118 const HnswData_* pVect1 =
static_cast<const HnswData_*
>(pVect1v);
119 const HnswData_* pVect2 =
static_cast<const HnswData_*
>(pVect2v);
120 std::size_t qty = *((
size_t *) qty_ptr);
122 for (; qty > 0; --qty, ++pVect1, ++pVect2) {
123 auto delta = *pVect1 - *pVect2;
124 res += delta * delta;
138template<
typename HnswData_ =
float>
141 output.
create = [](std::size_t dim) -> hnswlib::SpaceInterface<HnswData_>* {
142 if constexpr(std::is_same<HnswData_, float>::value) {
143 return static_cast<hnswlib::SpaceInterface<HnswData_>*
>(
new hnswlib::L2Space(dim));
148 output.
normalize = [](HnswData_ x) -> HnswData_ {
158template<
typename HnswData_ =
float>
161 output.
create = [](std::size_t dim) -> hnswlib::SpaceInterface<HnswData_>* {
Manhattan distance.
Definition distances.hpp:40
ManhattanDistance(std::size_t dim)
Definition distances.hpp:49
Squared Euclidean distance.
Definition distances.hpp:89
SquaredEuclideanDistance(std::size_t dim)
Definition distances.hpp:98
knncolle bindings for HNSW search.
Definition distances.hpp:13
DistanceConfig< HnswData_ > makeManhattanDistanceConfig()
Definition distances.hpp:159
DistanceConfig< HnswData_ > makeEuclideanDistanceConfig()
Definition distances.hpp:139
Distance configuration for the HNSW index.
Definition distances.hpp:21
std::function< HnswData_(HnswData_)> normalize
Definition distances.hpp:31
std::function< hnswlib::SpaceInterface< HnswData_ > *(std::size_t)> create
Definition distances.hpp:25