use thiserror::Error;
#[derive(Debug, Clone, Error, PartialEq)]
pub enum MoeError {
#[error("MoE layer constructed with zero experts")]
EmptyExpertPool,
#[error("invalid top-k: k={k} must be in 1..={num_experts}")]
InvalidTopK {
k: usize,
num_experts: usize,
},
#[error("shape mismatch: expected feature length {expected}, got {got}")]
ShapeMismatch {
expected: usize,
got: usize,
},
#[error("invalid capacity factor: {value} (must be strictly positive and finite)")]
InvalidCapacityFactor {
value: f64,
},
}
pub type MoeResult<T> = Result<T, MoeError>;
impl From<MoeError> for crate::error::TrustformerError {
fn from(err: MoeError) -> Self {
crate::error::TrustformerError::CompilationError(err.to_string())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn invalid_topk_display_contains_context() {
let err = MoeError::InvalidTopK {
k: 5,
num_experts: 2,
};
let msg = err.to_string();
assert!(msg.contains('5'));
assert!(msg.contains('2'));
}
#[test]
fn capacity_factor_error_carries_value() {
let err = MoeError::InvalidCapacityFactor { value: -1.0 };
assert!(err.to_string().contains("-1"));
}
#[test]
fn bridges_into_trustformer_error() {
let err = MoeError::EmptyExpertPool;
let bridged: crate::error::TrustformerError = err.into();
assert!(bridged.to_string().contains("MoE"));
}
}