1#ifndef KNNCOLLE_DISTANCES_HPP
2#define KNNCOLLE_DISTANCES_HPP
7#include <unordered_map>
29template<
typename Data_,
typename Distance_>
57 virtual Distance_
raw(std::size_t num_dimensions,
const Data_* x,
const Data_* y)
const = 0;
96 virtual void save([[maybe_unused]]
const std::filesystem::path& dir)
const {
97 throw std::runtime_error(
"saving is not supported");
104inline static constexpr const char* euclidean_distance_save_name =
"knncolle::Euclidean";
111template<
typename Data_,
typename Distance_>
117 Distance_
raw(std::size_t num_dimensions,
const Data_* x,
const Data_* y)
const {
118 Distance_ output = 0;
119 for (std::size_t d = 0; d < num_dimensions; ++d) {
120 auto delta =
static_cast<Distance_
>(x[d]) -
static_cast<Distance_
>(y[d]);
121 output += delta * delta;
127 return std::sqrt(
raw);
134 void save(
const std::filesystem::path& dir)
const {
135 quick_save(dir /
"DISTANCE", euclidean_distance_save_name, std::strlen(euclidean_distance_save_name));
145inline static constexpr const char* manhattan_distance_save_name =
"knncolle::Manhattan";
153template<
typename Data_,
typename Distance_>
159 Distance_
raw(std::size_t num_dimensions,
const Data_* x,
const Data_* y)
const {
160 Distance_ output = 0;
161 for (std::size_t d = 0; d < num_dimensions; ++d) {
162 auto delta =
static_cast<Distance_
>(x[d]) -
static_cast<Distance_
>(y[d]);
163 output += std::abs(delta);
176 void save(
const std::filesystem::path& dir)
const {
177 quick_save(dir /
"DISTANCE", manhattan_distance_save_name, std::strlen(manhattan_distance_save_name));
191template<
typename Data_,
typename Distance_>
204template<
typename Data_,
typename Distance_>
206 static std::unordered_map<std::string, LoadDistanceMetricFunction<Data_, Distance_> > registry;
216template<
typename Data_,
typename Distance_>
228template<
typename Data_,
typename Distance_>
245 std::runtime_error(
"cannot find a load_distance_metric_registry() function for '" + distance +
"' at '" + path.string() +
"'"),
246 my_distance(std::move(distance)),
247 my_path(std::move(path))
254 std::string my_distance;
255 std::filesystem::path my_path;
284template<
typename Data_,
typename Distance_>
286 const auto metric_path = dir /
"DISTANCE";
290 auto it = reg.find(metric_name);
291 if (it == reg.end()) {
295 return (it->second)(dir);
Interface for a distance metric.
Definition distances.hpp:30
virtual Distance_ normalize(Distance_ raw) const =0
virtual Distance_ denormalize(Distance_ norm) const =0
virtual Distance_ raw(std::size_t num_dimensions, const Data_ *x, const Data_ *y) const =0
virtual void save(const std::filesystem::path &dir) const
Definition distances.hpp:96
Compute Euclidean distances between two input vectors.
Definition distances.hpp:112
Exception for unknown distance metrics in load_distance_metric_raw().
Definition distances.hpp:239
const std::filesystem::path & get_path() const
Definition distances.hpp:268
const std::string & get_distance() const
Definition distances.hpp:261
Compute Manhattan distances between two input vectors.
Definition distances.hpp:154
Collection of KNN algorithms.
Definition Bruteforce.hpp:29
std::function< DistanceMetric< Data_, Distance_ > *(const std::filesystem::path &)> LoadDistanceMetricFunction
Definition distances.hpp:192
void register_load_euclidean_distance()
Definition distances.hpp:217
std::string quick_load_as_string(const std::filesystem::path &path)
Definition utils.hpp:74
void register_load_manhattan_distance()
Definition distances.hpp:229
DistanceMetric< Data_, Distance_ > * load_distance_metric_raw(const std::filesystem::path &dir)
Definition distances.hpp:285
void quick_save(const std::filesystem::path &path, const Input_ *const contents, const Length_ length)
Definition utils.hpp:33
std::unordered_map< std::string, LoadDistanceMetricFunction< Data_, Distance_ > > & load_distance_metric_registry()
Definition distances.hpp:205
Miscellaneous utilities for knncolle