use crate::circuit::CircuitError;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum QisError {
#[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),
}
#[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,
}