use thiserror::Error;
#[derive(Debug, Clone, PartialEq, Error)]
pub enum QuantumError {
#[error("Quantum state vector has zero norm — unphysical state")]
ZeroStateVector,
#[error("Qubit index {index} is out of range for a {n_qubits}-qubit register")]
QubitIndexOutOfRange {
index: usize,
n_qubits: usize,
},
#[error("Dimension mismatch: expected {expected}, got {actual}")]
DimensionMismatch {
expected: usize,
actual: usize,
},
#[error("Basis index {index} is out of range for dim={dim}")]
BasisIndexOutOfRange {
index: usize,
dim: usize,
},
#[error("Too many qubits requested: {0} would exceed usize capacity")]
TooManyQubits(usize),
#[error("Invalid qubit count: {0}")]
InvalidQubitCount(usize),
#[error("Gate arity mismatch: gate acts on {gate_qubits} qubit(s) but {supplied} target(s) were provided")]
GateArityMismatch {
gate_qubits: usize,
supplied: usize,
},
#[error("Duplicate qubit index {index} in gate target list")]
DuplicateQubitIndex {
index: usize,
},
#[error("Gate matrix is not unitary (max deviation = {deviation:.3e})")]
NonUnitaryGate {
deviation: f64,
},
#[error(
"Circuit was built for {circuit_qubits} qubit(s) but the register has {register_qubits}"
)]
CircuitRegisterMismatch {
circuit_qubits: usize,
register_qubits: usize,
},
#[error("Domain error: {0}")]
DomainError(String),
}
pub type QuantumResult<T> = Result<T, QuantumError>;