pub use flow_knn::{DistanceMetric, HnswParams, KnnMethod, Quantization};
#[derive(Debug, Clone)]
pub enum Init {
Pca,
Random(Option<u64>),
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub enum OptimizeBackend {
#[default]
Cpu,
#[cfg(feature = "cubecl")]
Gpu,
}
#[derive(Debug, Clone)]
pub struct PaCMAPConfig {
pub n_neighbors: usize,
pub mn_ratio: f32,
pub fp_ratio: f32,
pub phase_iters: [usize; 3],
pub learning_rate: f32,
pub init: Init,
pub seed: Option<u64>,
pub knn_method: KnnMethod,
pub distance_metric: DistanceMetric,
pub optimize_backend: OptimizeBackend,
}
impl Default for PaCMAPConfig {
fn default() -> Self {
Self {
n_neighbors: 10,
mn_ratio: 0.5,
fp_ratio: 2.0,
phase_iters: [100, 100, 250],
learning_rate: 1.0,
init: Init::Pca,
seed: None,
knn_method: KnnMethod::default(),
distance_metric: DistanceMetric::default(),
optimize_backend: OptimizeBackend::default(),
}
}
}
impl PaCMAPConfig {
pub fn n_mn(&self) -> usize {
(self.n_neighbors as f32 * self.mn_ratio).floor() as usize
}
pub fn n_fp(&self) -> usize {
(self.n_neighbors as f32 * self.fp_ratio).floor() as usize
}
pub fn total_iters(&self) -> usize {
self.phase_iters.iter().sum()
}
}