#[derive(Debug, Clone, PartialEq, thiserror::Error)]
#[non_exhaustive]
pub enum SimError {
#[error("probability {0} must be between 0 and 1")]
InvalidProbability(f64),
#[error("invalid Pauli channel probability distribution")]
InvalidProbabilityDistribution,
#[error("Pauli rotation angle {0} must be finite")]
InvalidRotationAngle(f64),
#[error("prune epsilon {epsilon} removed every amplitude")]
EmptyStateAfterPruning {
epsilon: f64,
},
#[error("stabilizer rank {rank} exceeds cap {cap}")]
RankOverflow {
rank: usize,
cap: usize,
},
#[error("cannot post-select outcome {outcome} with probability {probability:e}")]
PostselectImpossible {
outcome: bool,
probability: f64,
},
#[error("gate received repeated qubit index {0}")]
RepeatedQubit(usize),
#[error("controlled-Pauli control and target must commute")]
NonCommutingControlledPaulis,
#[error("controlled-Pauli axes must be positive Hermitian Paulis")]
InvalidControlledPauli,
#[error("measurement and rotation axes must be Hermitian Paulis")]
NonHermitianPauli,
#[error("conditional Pauli reads batch record {index}, which the batch has not produced")]
MissingBatchRecord {
index: usize,
},
#[error("observable qubit index {index} is outside a {num_qubits}-qubit register")]
QubitIndexOutOfRange {
index: usize,
num_qubits: usize,
},
}