#[derive(Debug, Clone)]
pub struct VamanaConfig {
pub max_degree: usize,
pub search_list_size: usize,
pub alpha: f32,
pub beam_width: usize,
}
impl Default for VamanaConfig {
fn default() -> Self {
Self {
max_degree: 64,
search_list_size: 180, alpha: 1.2,
beam_width: 48, }
}
}
impl VamanaConfig {
pub fn new(max_degree: usize, search_list_size: usize, alpha: f32) -> Self {
Self {
max_degree,
search_list_size,
alpha,
beam_width: max_degree / 2,
}
}
pub fn embedded(dimension: usize) -> Self {
let max_degree = if dimension <= 128 {
32
} else if dimension <= 384 {
48
} else {
64
};
Self {
max_degree,
search_list_size: max_degree * 2,
alpha: 1.2,
beam_width: max_degree / 2,
}
}
pub fn performance(dimension: usize) -> Self {
let max_degree = if dimension <= 128 {
64
} else if dimension <= 384 {
96
} else {
128
};
Self {
max_degree,
search_list_size: max_degree * 3,
alpha: 1.2,
beam_width: max_degree,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_config() {
let config = VamanaConfig::default();
assert_eq!(config.max_degree, 64);
assert_eq!(config.search_list_size, 180); assert!((config.alpha - 1.2).abs() < 0.001);
}
#[test]
fn test_embedded_config() {
let config = VamanaConfig::embedded(384);
assert_eq!(config.max_degree, 48);
assert!(config.max_degree < 64); }
#[test]
fn test_performance_config() {
let config = VamanaConfig::performance(384);
assert_eq!(config.max_degree, 96);
assert!(config.max_degree > 64); }
}