Skip to main content

fib_quant/
error.rs

1use thiserror::Error;
2
3/// FibQuant crate result type.
4pub type Result<T> = std::result::Result<T, FibQuantError>;
5
6/// Fail-closed FibQuant error taxonomy.
7#[derive(Debug, Error, Clone, PartialEq)]
8pub enum FibQuantError {
9    /// Ambient dimension is zero.
10    #[error("ambient dimension must be nonzero")]
11    ZeroDimension,
12    /// Block dimension is invalid for the ambient dimension.
13    #[error("invalid block dimension {block_dim} for ambient dimension {ambient_dim}")]
14    InvalidBlockDim {
15        /// Ambient vector dimension.
16        ambient_dim: usize,
17        /// Requested block dimension.
18        block_dim: usize,
19    },
20    /// `d` is not divisible by `k`.
21    #[error("ambient dimension {ambient_dim} is not divisible by block dimension {block_dim}")]
22    DimensionNotDivisible {
23        /// Ambient vector dimension.
24        ambient_dim: usize,
25        /// Requested block dimension.
26        block_dim: usize,
27    },
28    /// Codebook size is invalid.
29    #[error("invalid codebook size {0}")]
30    InvalidCodebookSize(usize),
31    /// Input contains a non-finite value.
32    #[error("non-finite input at index {0}")]
33    NonFiniteInput(usize),
34    /// Normal encode path received a zero vector.
35    #[error("zero norm vector is not valid on the normal FibQuant encode path")]
36    ZeroNorm,
37    /// Stored profile digest did not match the expected digest.
38    #[error("profile digest mismatch: expected {expected}, actual {actual}")]
39    ProfileDigestMismatch {
40        /// Expected digest.
41        expected: String,
42        /// Actual digest.
43        actual: String,
44    },
45    /// Stored codebook digest did not match the expected digest.
46    #[error("codebook digest mismatch: expected {expected}, actual {actual}")]
47    CodebookDigestMismatch {
48        /// Expected digest.
49        expected: String,
50        /// Actual digest.
51        actual: String,
52    },
53    /// Stored rotation digest did not match the expected digest.
54    #[error("rotation digest mismatch: expected {expected}, actual {actual}")]
55    RotationDigestMismatch {
56        /// Expected digest.
57        expected: String,
58        /// Actual digest.
59        actual: String,
60    },
61    /// Payload is malformed.
62    #[error("corrupt payload: {0}")]
63    CorruptPayload(String),
64    /// Requested dimensions or payload sizes exceed alpha release resource limits.
65    #[error("resource limit exceeded: {0}")]
66    ResourceLimitExceeded(String),
67    /// Decoded index is outside the codebook range.
68    #[error("index {index} is outside codebook size {codebook_size}")]
69    IndexOutOfRange {
70        /// Invalid index.
71        index: u32,
72        /// Codebook size.
73        codebook_size: u32,
74    },
75    /// Numerical algorithm failed.
76    #[error("numerical failure: {0}")]
77    NumericalFailure(String),
78    /// Empty-cell repair failed during Lloyd-Max refinement.
79    #[error("empty-cell repair failed: {0}")]
80    EmptyCellRepairFailed(String),
81    /// Required dependency behavior is unsupported.
82    #[error("dependency unsupported: {0}")]
83    DependencyUnsupported(String),
84}