small-world-rs 1.0.0

The easiest HNSW vector index you'll ever use
Documentation
use crate::{
    metrics::{calculate_cosine_similarity, calculate_euclidean_distance},
    primitives::vector::Vector,
};
use serde::{Deserialize, Serialize};

#[derive(Clone, Serialize, Deserialize)]
pub enum DistanceMetric {
    Cosine(CosineDistance),
    Euclidean(EuclideanDistance),
}

impl DistanceMetric {
    pub fn distance(&self, a: &Vector, b: &Vector) -> f32 {
        match self {
            DistanceMetric::Cosine(metric) => metric.distance(a, b),
            DistanceMetric::Euclidean(metric) => metric.distance(a, b),
        }
    }
}

#[derive(Clone, Serialize, Deserialize)]
pub struct CosineDistance;

impl CosineDistance {
    fn distance(&self, a: &Vector, b: &Vector) -> f32 {
        1.0 - calculate_cosine_similarity(a, b)
    }
}

#[derive(Clone, Serialize, Deserialize)]
pub struct EuclideanDistance;

impl EuclideanDistance {
    fn distance(&self, a: &Vector, b: &Vector) -> f32 {
        calculate_euclidean_distance(a, b)
    }
}