use serde::{Deserialize, Serialize}; use space::Metric; #[derive(Debug, Default, Clone, Copy, Serialize, Deserialize)] pub struct DotProduct; impl Metric> for DotProduct { type Unit = u32; // Following . // // Here is a playground that validate the ordering of the bit representation of floats in range 0.0..=1.0: // fn distance(&self, a: &Vec, b: &Vec) -> Self::Unit { let dist = 1.0 - dot_product_similarity(a, b); debug_assert!(!dist.is_nan()); dist.to_bits() } } /// Returns the dot product similarity score that will between 0.0 and 1.0 /// if both vectors are normalized. The higher the more similar the vectors are. pub fn dot_product_similarity(a: &[f32], b: &[f32]) -> f32 { a.iter().zip(b).map(|(a, b)| a * b).sum() }