pub type AreaId = String;
pub type Position = (u32, u32, u32);
pub type Weight = u8;
pub type BduResult<T> = Result<T, BduError>;
#[derive(Debug, thiserror::Error)]
pub enum BduError {
#[error("Invalid area: {0}")]
InvalidArea(String),
#[error("Invalid morphology: {0}")]
InvalidMorphology(String),
#[error("Invalid position: {0:?}")]
InvalidPosition(Position),
#[error("Dimension mismatch: expected {expected:?}, got {actual:?}")]
DimensionMismatch {
expected: (usize, usize, usize),
actual: (usize, usize, usize),
},
#[error("Out of bounds: position {pos:?} not in dimensions {dims:?}")]
OutOfBounds {
pos: Position,
dims: (usize, usize, usize),
},
#[error("Invalid genome: {0}")]
InvalidGenome(String),
#[error("Invalid neuron: {0}")]
InvalidNeuron(String),
#[error("Invalid synapse: {0}")]
InvalidSynapse(String),
#[error("Internal error: {0}")]
Internal(String),
#[error("Region IO policy violation: {0}")]
RegionIoPolicyViolation(String),
}
impl From<feagi_npu_neural::types::FeagiError> for BduError {
fn from(err: feagi_npu_neural::types::FeagiError) -> Self {
match &err {
feagi_npu_neural::types::FeagiError::InvalidArea(msg) => {
BduError::InvalidArea(msg.clone())
}
feagi_npu_neural::types::FeagiError::InvalidRegion(msg) => {
BduError::InvalidArea(msg.clone())
}
_ => BduError::Internal(err.to_string()),
}
}
}
impl From<feagi_structures::FeagiDataError> for BduError {
fn from(err: feagi_structures::FeagiDataError) -> Self {
BduError::Internal(err.to_string())
}
}
impl From<feagi_evolutionary::EvoError> for BduError {
fn from(err: feagi_evolutionary::EvoError) -> Self {
match &err {
feagi_evolutionary::EvoError::InvalidGenome(msg) => {
BduError::InvalidGenome(msg.clone())
}
feagi_evolutionary::EvoError::InvalidArea(msg) => BduError::InvalidArea(msg.clone()),
_ => BduError::Internal(err.to_string()),
}
}
}