flow-pacmap 0.1.2

PaCMAP dimensionality reduction (Wang et al. 2021) for large-n flow cytometry — faer PCA, optional HNSW and k-d tree KNN
Documentation
//! Error types for flow-pacmap.

use thiserror::Error;

#[derive(Debug, Error)]
pub enum PaCMAPError {
    #[error("Dataset too small: need at least 2 points, got {n}")]
    DatasetTooSmall { n: usize },

    #[error("Dimension mismatch: data slice length {len} is not divisible by d={d}")]
    DimensionMismatch { len: usize, d: usize },

    #[error("n={n} exceeds u32::MAX — indices would overflow pair storage")]
    DatasetTooLarge { n: usize },

    #[error("Pair count overflow: n={n} × k={k} would overflow usize")]
    PairCountOverflow { n: usize, k: usize },

    #[error(
        "Insufficient memory: embedding requires ~{required_bytes} bytes but only \
         {available_bytes} bytes are available"
    )]
    InsufficientMemory {
        required_bytes: usize,
        available_bytes: usize,
    },

    #[error("KNN method not implemented: {method}")]
    MethodNotImplemented { method: String },

    #[error("KNN index error: {0}")]
    KnnIndex(String),

    #[error(
        "KNN graph size mismatch: graph has n={graph_n} (neighbors len {neighbors_len}), \
         data has n={data_n}"
    )]
    KnnGraphSizeMismatch {
        graph_n: usize,
        neighbors_len: usize,
        data_n: usize,
    },

    #[error(
        "KNN graph k={graph_k} is too small for PaCMAP; need at least {required_k} \
         (n_neighbors + 50, capped by n − 1)"
    )]
    KnnGraphInsufficientK { graph_k: usize, required_k: usize },

    #[error("KNN graph metric {graph:?} does not match config metric {config:?}")]
    KnnGraphMetricMismatch {
        graph: crate::config::DistanceMetric,
        config: crate::config::DistanceMetric,
    },

    #[error("PCA failed: {0}")]
    Pca(String),

    #[error("GPU optimize error: {0}")]
    Gpu(String),

    #[error("Run cancelled by caller")]
    Cancelled,
}

impl From<flow_dimensional_reduction::PcaError> for PaCMAPError {
    fn from(e: flow_dimensional_reduction::PcaError) -> Self {
        PaCMAPError::Pca(e.to_string())
    }
}