use thiserror::Error;
use vernier_mask::MaskError;
use vernier_partial::PartialError;
pub use vernier_partial::PartialFormatErrorKind;
#[derive(Debug, Error)]
pub enum EvalError {
#[error("dimension mismatch: {detail}")]
DimensionMismatch {
detail: String,
},
#[error("invalid annotation: {detail}")]
InvalidAnnotation {
detail: String,
},
#[error("json: {0}")]
Json(#[from] serde_json::Error),
#[error("mask: {0}")]
Mask(#[from] MaskError),
#[error("non-finite value in {context}")]
NonFinite {
context: &'static str,
},
#[error("invalid config: {detail}")]
InvalidConfig {
detail: String,
},
#[error("memory budget exceeded: used {used_bytes} / budget {budget_bytes} bytes")]
OutOfBudget {
used_bytes: usize,
budget_bytes: usize,
breakdown: std::collections::HashMap<&'static str, usize>,
},
#[error("not implemented: {feature}")]
NotImplemented {
feature: &'static str,
},
#[error("per_pair table exceeded cap: would emit at least {observed} rows, cap {cap}")]
PerPairOverflow {
observed: usize,
cap: usize,
},
#[error("lvis federated conflict on image_id={image_id}, category_id={category_id}: {detail}")]
LvisFederatedConflict {
image_id: i64,
category_id: i64,
detail: &'static str,
},
#[error(
"lvis dataset is missing `frequency` on {} categories: {category_ids:?}",
category_ids.len()
)]
MissingFrequency {
category_ids: Vec<i64>,
},
#[error("partial wire format rejected: {kind}")]
PartialFormatMismatch {
kind: PartialFormatErrorKind,
},
#[error("partial dataset_hash mismatch: expected {expected:02x?}, got {actual:02x?}")]
PartialDatasetMismatch {
expected: [u8; 32],
actual: [u8; 32],
},
#[error("partial params_hash mismatch: expected {expected:02x?}, got {actual:02x?}")]
PartialParamsMismatch {
expected: [u8; 32],
actual: [u8; 32],
},
#[error("partials cover image_id={image_id} on both rank {rank_a} and rank {rank_b}")]
PartialPartitionOverlap {
rank_a: u32,
rank_b: u32,
image_id: i64,
},
#[error("partials share rank_id={rank_id} in strict mode")]
PartialRankCollision {
rank_id: u32,
},
}
impl From<PartialError> for EvalError {
fn from(err: PartialError) -> Self {
match err {
PartialError::Format { kind } => EvalError::PartialFormatMismatch { kind },
PartialError::DatasetMismatch { expected, actual } => {
EvalError::PartialDatasetMismatch { expected, actual }
}
PartialError::ParamsMismatch { expected, actual } => {
EvalError::PartialParamsMismatch { expected, actual }
}
PartialError::PartitionOverlap {
rank_a,
rank_b,
image_id,
} => EvalError::PartialPartitionOverlap {
rank_a,
rank_b,
image_id,
},
PartialError::RankCollision { rank_id } => EvalError::PartialRankCollision { rank_id },
}
}
}