use thiserror::Error;
use uuid::Uuid;
pub type Result<T> = std::result::Result<T, TuneError>;
#[derive(Error, Debug)]
pub enum TuneError {
#[error("Dataset error: {0}")]
Dataset(String),
#[error("Example not found: {id}")]
ExampleNotFound {
id: Uuid,
},
#[error("Invalid batch size: {size} (must be > 0 and <= dataset size {dataset_size})")]
InvalidBatchSize {
size: usize,
dataset_size: usize,
},
#[error("Dimension mismatch: expected {expected}, got {actual}")]
DimensionMismatch {
expected: usize,
actual: usize,
},
#[error("Teacher API error: {0}")]
TeacherApi(String),
#[error("Teacher timeout after {timeout_ms}ms")]
TeacherTimeout {
timeout_ms: u64,
},
#[error("Training error: {0}")]
Training(String),
#[error("Training did not converge after {epochs} epochs (final loss: {final_loss:.6})")]
ConvergenceFailure {
epochs: usize,
final_loss: f32,
},
#[error("Invalid configuration: {0}")]
InvalidConfig(String),
#[error("Model not found: {name} v{version}")]
ModelNotFound {
name: String,
version: String,
},
#[error("Model already exists: {name} v{version}")]
DuplicateModel {
name: String,
version: String,
},
#[error("Storage error: {0}")]
Storage(String),
#[error("Serialization error: {0}")]
Serialization(String),
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
#[error("Validation error: {0}")]
Validation(String),
#[error("Weight integrity error: expected checksum {expected}, got {actual}")]
WeightIntegrityError {
expected: String,
actual: String,
},
#[error("Memory budget exceeded: required {required_mb}MB, budget {budget_mb}MB")]
MemoryBudgetExceeded {
required_mb: usize,
budget_mb: usize,
},
}
#[cfg(feature = "serde")]
impl From<serde_json::Error> for TuneError {
fn from(err: serde_json::Error) -> Self {
TuneError::Serialization(err.to_string())
}
}