use crate::circuit::CircuitError;
use num_complex::Complex64;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum QisError {
#[error("Fermionic mode {mode} is out of bounds for {num_modes} modes")]
ModeOutOfBounds { mode: usize, num_modes: usize },
#[error("Mode count mismatch: expected {expected}, got {actual}")]
ModeMismatch { expected: usize, actual: usize },
#[error("Operator coefficient must be finite, got {coefficient}")]
NonFiniteCoefficient { coefficient: Complex64 },
#[error("Invalid occupation at mode {index}: expected 0 or 1, got {value}")]
InvalidOccupation { index: usize, value: u8 },
#[error(transparent)]
CircuitError(#[from] CircuitError),
#[error("Qubit count mismatch: expected {expected}, got {actual}")]
QubitMismatch { expected: usize, actual: usize },
#[error("Dimension mismatch: expected {expected}, got {actual}")]
DimensionMismatch { expected: usize, actual: usize },
#[error("Invalid state dimension: length {0} is not a power of 2")]
InvalidStateDimension(usize),
#[error("Invalid probability value: {0}")]
InvalidProbability(f64),
#[error("Index out of bounds: index {index}, max {max}")]
IndexOutOfBounds { index: usize, max: usize },
#[error("Unsupported simulation operation: {0}")]
UnsupportedOperation(String),
#[error(transparent)]
PauliStringParseError(#[from] PauliStringParseError),
#[error("State is not normalized")]
NotNormalized,
#[error("Operator is not Hermitian")]
NotHermitian,
#[error("Density matrix is not positive semidefinite")]
NotPositiveSemidefinite,
#[error("Invalid parameter value: {0}")]
InvalidParameterValue(String),
#[error("Invalid subsystem: {0}")]
InvalidSubsystem(String),
#[error("Unsupported dimension: expected {expected}, got {actual}")]
UnsupportedDimension { expected: usize, actual: usize },
#[error("Non-Clifford gate: {0}")]
NonCliffordGate(String),
}
pub(crate) fn validate_coefficient(coefficient: Complex64) -> Result<(), QisError> {
if coefficient.re.is_finite() && coefficient.im.is_finite() {
Ok(())
} else {
Err(QisError::NonFiniteCoefficient { coefficient })
}
}
#[derive(Debug, Clone, PartialEq, Eq, Error)]
pub enum PauliStringParseError {
#[error("empty string")]
EmptyString,
#[error("invalid character '{0}'")]
InvalidCharacter(char),
#[error("no Pauli operators specified")]
NoOperators,
}