tensorlogic_trustformers/moe/
error.rs1use thiserror::Error;
9
10#[derive(Debug, Clone, Error, PartialEq)]
12pub enum MoeError {
13 #[error("MoE layer constructed with zero experts")]
16 EmptyExpertPool,
17
18 #[error("invalid top-k: k={k} must be in 1..={num_experts}")]
20 InvalidTopK {
21 k: usize,
23 num_experts: usize,
25 },
26
27 #[error("shape mismatch: expected feature length {expected}, got {got}")]
29 ShapeMismatch {
30 expected: usize,
32 got: usize,
34 },
35
36 #[error("invalid capacity factor: {value} (must be strictly positive and finite)")]
38 InvalidCapacityFactor {
39 value: f64,
41 },
42}
43
44pub type MoeResult<T> = Result<T, MoeError>;
46
47impl From<MoeError> for crate::error::TrustformerError {
48 fn from(err: MoeError) -> Self {
49 crate::error::TrustformerError::CompilationError(err.to_string())
50 }
51}
52
53#[cfg(test)]
54mod tests {
55 use super::*;
56
57 #[test]
58 fn invalid_topk_display_contains_context() {
59 let err = MoeError::InvalidTopK {
60 k: 5,
61 num_experts: 2,
62 };
63 let msg = err.to_string();
64 assert!(msg.contains('5'));
65 assert!(msg.contains('2'));
66 }
67
68 #[test]
69 fn capacity_factor_error_carries_value() {
70 let err = MoeError::InvalidCapacityFactor { value: -1.0 };
71 assert!(err.to_string().contains("-1"));
72 }
73
74 #[test]
75 fn bridges_into_trustformer_error() {
76 let err = MoeError::EmptyExpertPool;
77 let bridged: crate::error::TrustformerError = err.into();
78 assert!(bridged.to_string().contains("MoE"));
79 }
80}