use thiserror::Error;
#[derive(Debug, Error)]
pub enum EdgeErrors {
#[error("Invalid argument: {0}")]
InvalidArgument(String),
#[error("Parameter '{0}' must be a positive non-zero integer.")]
MustBePositive(String),
#[error("Unknown {kind} method '{name}'. Expected one of: {expected}.")]
UnknownMethod {
kind: &'static str,
name: String,
expected: &'static str,
},
#[error("Expected shape {expected:?}; got {got:?}.")]
ShapeMismatch {
expected: (usize, usize),
got: (usize, usize),
},
#[error("'{name}' has length {got}, expected {expected}.")]
LengthMismatch {
name: &'static str,
expected: usize,
got: usize,
},
#[error("Counts matrix is empty: {n_genes} genes by {n_samples} samples.")]
EmptyCounts {
n_genes: usize,
n_samples: usize,
},
#[error("Design matrix is not full rank: {n_cols} columns but rank {rank}.")]
DesignNotFullRank {
n_cols: usize,
rank: usize,
},
#[error("Coefficient index {index} is out of range for a design with {n_coef} coefficients.")]
CoefOutOfRange {
index: usize,
n_coef: usize,
},
#[error("Cholesky factorisation failed: {0}")]
CholeskyFailed(String),
#[error("Linear solve failed: {0}")]
SolveFailed(String),
#[error(
"{routine} failed to converge after {iterations} iterations (last change {last_delta:e})."
)]
NoConvergence {
routine: &'static str,
iterations: usize,
last_delta: f64,
},
#[error(
"Interval [{lower}, {upper}] does not bracket a root: f(lower) = {f_lower:e}, f(upper) = {f_upper:e}."
)]
RootNotBracketed {
lower: f64,
upper: f64,
f_lower: f64,
f_upper: f64,
},
#[error("Invalid bounds for parameter {index}: lower {lower} exceeds upper {upper}.")]
InvalidBounds {
index: usize,
lower: f64,
upper: f64,
},
#[error("Malformed sparse matrix: {0}")]
MalformedSparse(String),
#[error("No genes survived filtering for normalisation; all {n_genes} were dropped.")]
NoGenesAfterFiltering {
n_genes: usize,
},
#[error("Invalid TMM reference column: {0}")]
InvalidReferenceColumn(String),
#[error("Dispersion must be non-negative and finite; got {0}.")]
InvalidDispersion(f64),
#[error(
"Cells are not contiguous by subject: subject {subject} appears in more than one block."
)]
SubjectsNotContiguous {
subject: usize,
},
#[error("NEBULA requires an intercept column in the design matrix; none was found.")]
MissingIntercept,
#[error("NEBULA needs at least {required} subjects; got {got}.")]
TooFewSubjects {
required: usize,
got: usize,
},
}