VaneDB 0.1.0
Embeddable vector database for edge AI
Loading...
Searching...
No Matches
distance_strategy.h
Go to the documentation of this file.
1// VaneDB - Copyright (c) 2025 Anton Tsvetkov - MIT License
2#pragma once
3#include "distance.h"
4#include <cstddef>
5#include <limits>
6#include <stdexcept>
7
8namespace vanedb {
9
10enum class DistanceMetric { L2 = 0, COSINE = 1, DOT = 2 };
11
13 [[deprecated("Use vanedb::DistanceMetric (core/distance_strategy.h). HNSWDistanceMetric is removed in v0.3.0.")]]
15
16// Default-constructed instances are invalid; operator() returns infinity.
17// Default-constructibility is required for MMapVectorStore which assigns
18// dist_ in its constructor body (after parsing metric/dim from the file).
19//
20// operator() dispatches via switch (not a function pointer) so the SIMD
21// distance functions inline into the hot loop. Don't refactor this back.
23public:
24 DistanceComputer() noexcept = default;
25
27 : dim_(dimension), metric_(metric), valid_(true) {
28 switch (metric) {
32 return;
33 }
34 throw std::invalid_argument("DistanceComputer: invalid DistanceMetric value");
35 }
36
37 [[nodiscard]] float operator()(const float* a, const float* b) const noexcept {
38 if (!valid_) [[unlikely]] return std::numeric_limits<float>::infinity();
39 switch (metric_) {
40 case DistanceMetric::L2: return l2_sq(a, b, dim_);
41 case DistanceMetric::COSINE: return cosine_distance(a, b, dim_);
42 case DistanceMetric::DOT: return -dot_product(a, b, dim_);
43 }
44 return std::numeric_limits<float>::infinity();
45 }
46
47 [[nodiscard]] size_t dimension() const noexcept { return dim_; }
48
49private:
50 size_t dim_ = 0;
52 bool valid_ = false;
53};
54
55} // namespace vanedb
DistanceComputer() noexcept=default
float operator()(const float *a, const float *b) const noexcept
size_t dimension() const noexcept
float cosine_distance(const float *__restrict__ a, const float *__restrict__ b, size_t n) noexcept
Definition distance.h:99
float dot_product(const float *__restrict__ a, const float *__restrict__ b, size_t n) noexcept
Definition distance.h:77
float l2_sq(const float *__restrict__ a, const float *__restrict__ b, size_t n) noexcept
Definition distance.h:49