mod error;
mod embedder;
mod vector_store;
pub use error::{EmbeddingError};
pub use embedder::{Embedder, EmbeddingUseCase};
pub use vector_store::{VectorStore, ChunkDataResult};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Embedding(pub Vec<f32>);
impl From<Vec<f32>> for Embedding {
fn from(vec: Vec<f32>) -> Self {
Embedding(vec)
}
}
impl Embedding {
pub fn similarity(&self, other: &Embedding) -> Result<f32, EmbeddingError> {
if self.0.is_empty() || other.0.is_empty() {
panic!("zero length vector");
}
if self.0.len() != other.0.len() {
panic!("mismatched vector lengths");
}
let dot_product: f32 = self.0.iter().zip(&other.0).map(|(a, b)| a * b).sum();
let norm_self: f32 = self.0.iter().map(|x| x * x).sum::<f32>().sqrt();
let norm_other: f32 = other.0.iter().map(|x| x * x).sum::<f32>().sqrt();
if norm_self == 0.0 || norm_other == 0.0 {
panic!("zero length vector");
}
Ok(dot_product / (norm_self * norm_other))
}
}