#![warn(missing_docs)]
#![allow(clippy::clone_on_copy)]
pub mod backfill;
mod cache;
mod error;
pub mod migration;
mod model;
mod service;
pub mod simd;
pub mod types;
pub use cache::{CacheStats, DEFAULT_CACHE_CAPACITY, EmbeddingCache, ShardStats};
pub use error::{EmbedError, Result};
pub use model::{EmbeddingModel, MIN_MRL_OUTPUT_DIM, ModelConfig, ModelProvenance};
pub use service::{DEFAULT_MAX_BATCH_SIZE, EmbeddingService, MAX_TEXT_CHARS};
pub use simd::{SimdConfig, simd_config};
#[cfg(feature = "native")]
pub use service::{CachedEmbeddingService, NativeEmbeddingService};
pub mod utils {
use crate::simd;
#[inline]
pub fn cosine_similarity(a: &[f32], b: &[f32]) -> f32 {
simd::cosine_similarity(a, b)
}
#[inline]
pub fn dot_product(a: &[f32], b: &[f32]) -> f32 {
simd::dot_product(a, b)
}
#[inline]
pub fn normalize(vector: &mut [f32]) {
simd::normalize(vector)
}
#[inline]
pub fn euclidean_distance(a: &[f32], b: &[f32]) -> f32 {
simd::euclidean_distance(a, b)
}
#[inline]
pub fn batch_cosine_similarity(pairs: &[(&[f32], &[f32])]) -> Vec<f32> {
simd::batch_cosine_similarity(pairs)
}
#[inline]
pub fn batch_dot_product(pairs: &[(&[f32], &[f32])]) -> Vec<f32> {
simd::batch_dot_product(pairs)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_cosine_similarity_identical() {
let a = vec![1.0, 2.0, 3.0];
let b = vec![1.0, 2.0, 3.0];
let sim = utils::cosine_similarity(&a, &b);
assert!((sim - 1.0).abs() < 0.0001);
}
#[test]
fn test_cosine_similarity_orthogonal() {
let a = vec![1.0, 0.0];
let b = vec![0.0, 1.0];
let sim = utils::cosine_similarity(&a, &b);
assert!(sim.abs() < 0.0001);
}
#[test]
fn test_cosine_similarity_opposite() {
let a = vec![1.0, 0.0];
let b = vec![-1.0, 0.0];
let sim = utils::cosine_similarity(&a, &b);
assert!((sim + 1.0).abs() < 0.0001);
}
#[test]
fn test_normalize() {
let mut v = vec![3.0, 4.0];
utils::normalize(&mut v);
let magnitude: f32 = v.iter().map(|x| x * x).sum::<f32>().sqrt();
assert!((magnitude - 1.0).abs() < 0.0001);
}
#[test]
fn test_euclidean_distance() {
let a = vec![0.0, 0.0, 0.0];
let b = vec![1.0, 0.0, 0.0];
let dist = utils::euclidean_distance(&a, &b);
assert!((dist - 1.0).abs() < 0.0001);
}
#[test]
fn test_model_default() {
let model = EmbeddingModel::default();
assert_eq!(model.dimensions(), 384);
}
}