use thiserror::Error;
#[derive(Clone, Debug, Error, PartialEq)]
pub enum StateSpaceError {
#[error("System matrix A must be square and non-empty. Got {rows}×{cols}")]
SystemMatrix {
rows: usize,
cols: usize
},
#[error("Input matrix B must be {expected_row}×{expected_col}, but got {actual_rows}×{actual_cols}")]
InputMatrix {
expected_row: usize,
expected_col: usize,
actual_rows: usize,
actual_cols: usize,
},
#[error("Input vector U must be {expected_row}, but got {actual_rows}")]
InputVector {
expected_row: usize,
actual_rows: usize,
},
#[error("Output matrixC must be {expected_row}×{expected_col}, but got {actual_rows}×{actual_cols}")]
OutputMatrix {
expected_row: usize,
expected_col: usize,
actual_rows: usize,
actual_cols: usize,
},
#[error("Feedthrough matrix D must be {expected_row}×{expected_col}, but got {actual_rows}×{actual_cols}")]
FeedthroughMatrix {
expected_row: usize,
expected_col: usize,
actual_rows: usize,
actual_cols: usize,
},
#[error("StateSpace must have at least one state")]
EmptySystem,
#[error("Matrix is singular")]
SingularMatrix,
#[error("Only single-input single-output systems are supported, got {inputs} inputs and {outputs} outputs")]
NotSiso { inputs: usize, outputs: usize },
#[error("Improper transfer function (numerator degree {numerator} > denominator degree {denominator}) has no state-space realization")]
Improper { numerator: usize, denominator: usize },
}