Skip to main content

flow_pacmap/
error.rs

1//! Error types for flow-pacmap.
2
3use thiserror::Error;
4
5#[derive(Debug, Error)]
6pub enum PaCMAPError {
7    #[error("Dataset too small: need at least 2 points, got {n}")]
8    DatasetTooSmall { n: usize },
9
10    #[error("Dimension mismatch: data slice length {len} is not divisible by d={d}")]
11    DimensionMismatch { len: usize, d: usize },
12
13    #[error("n={n} exceeds u32::MAX — indices would overflow pair storage")]
14    DatasetTooLarge { n: usize },
15
16    #[error("Pair count overflow: n={n} × k={k} would overflow usize")]
17    PairCountOverflow { n: usize, k: usize },
18
19    #[error(
20        "Insufficient memory: embedding requires ~{required_bytes} bytes but only \
21         {available_bytes} bytes are available"
22    )]
23    InsufficientMemory {
24        required_bytes: usize,
25        available_bytes: usize,
26    },
27
28    #[error("KNN method not implemented: {method}")]
29    MethodNotImplemented { method: String },
30
31    #[error("KNN index error: {0}")]
32    KnnIndex(String),
33
34    #[error(
35        "KNN graph size mismatch: graph has n={graph_n} (neighbors len {neighbors_len}), \
36         data has n={data_n}"
37    )]
38    KnnGraphSizeMismatch {
39        graph_n: usize,
40        neighbors_len: usize,
41        data_n: usize,
42    },
43
44    #[error(
45        "KNN graph k={graph_k} is too small for PaCMAP; need at least {required_k} \
46         (n_neighbors + 50, capped by n − 1)"
47    )]
48    KnnGraphInsufficientK { graph_k: usize, required_k: usize },
49
50    #[error("KNN graph metric {graph:?} does not match config metric {config:?}")]
51    KnnGraphMetricMismatch {
52        graph: crate::config::DistanceMetric,
53        config: crate::config::DistanceMetric,
54    },
55
56    #[error("PCA failed: {0}")]
57    Pca(String),
58
59    #[error("GPU optimize error: {0}")]
60    Gpu(String),
61
62    #[error("Run cancelled by caller")]
63    Cancelled,
64}
65
66impl From<flow_dimensional_reduction::PcaError> for PaCMAPError {
67    fn from(e: flow_dimensional_reduction::PcaError) -> Self {
68        PaCMAPError::Pca(e.to_string())
69    }
70}