use alloc::format;
use alloc::string::String;
use core::fmt::{Debug, Display, Formatter};
use deep_causality_core::{CausalityError, CausalityErrorEnum};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct QuantumError(pub QuantumErrorEnum);
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum QuantumErrorEnum {
DimensionMismatch(String),
MetricMismatch(String),
UnsupportedMetric(String),
NonFiniteValue(String),
NormalizationError(String),
NonPositiveOperator(String),
NonUnitTrace(String),
NonCptpChannel(String),
PartialTraceShape(String),
CommutatorNonZero {
node_j: usize,
node_k: usize,
detail: String,
},
NotFaithfullyRepresentable(String),
CertificateNotInherited {
node_j: usize,
node_k: usize,
detail: String,
},
CyclicStructureUnsupported(String),
HypothesisCountExceeded { n: usize, pairs: usize },
BoundaryNotHeld(String),
NotInNormalizer { generator: usize, detail: String },
NonCliffordGate(String),
CalculationError(String),
}
impl QuantumError {
pub(crate) fn new(variant: QuantumErrorEnum) -> Self {
Self(variant)
}
#[allow(non_snake_case)]
pub fn DimensionMismatch(msg: String) -> Self {
Self(QuantumErrorEnum::DimensionMismatch(msg))
}
#[allow(non_snake_case)]
pub fn MetricMismatch(msg: String) -> Self {
Self(QuantumErrorEnum::MetricMismatch(msg))
}
#[allow(non_snake_case)]
pub fn UnsupportedMetric(msg: String) -> Self {
Self(QuantumErrorEnum::UnsupportedMetric(msg))
}
#[allow(non_snake_case)]
pub fn NonFiniteValue(msg: String) -> Self {
Self(QuantumErrorEnum::NonFiniteValue(msg))
}
#[allow(non_snake_case)]
pub fn NormalizationError(msg: String) -> Self {
Self(QuantumErrorEnum::NormalizationError(msg))
}
#[allow(non_snake_case)]
pub fn NonPositiveOperator(msg: String) -> Self {
Self(QuantumErrorEnum::NonPositiveOperator(msg))
}
#[allow(non_snake_case)]
pub fn NonUnitTrace(msg: String) -> Self {
Self(QuantumErrorEnum::NonUnitTrace(msg))
}
#[allow(non_snake_case)]
pub fn NonCptpChannel(msg: String) -> Self {
Self(QuantumErrorEnum::NonCptpChannel(msg))
}
#[allow(non_snake_case)]
pub fn PartialTraceShape(msg: String) -> Self {
Self(QuantumErrorEnum::PartialTraceShape(msg))
}
#[allow(non_snake_case)]
pub fn CommutatorNonZero(node_j: usize, node_k: usize, detail: String) -> Self {
Self(QuantumErrorEnum::CommutatorNonZero {
node_j,
node_k,
detail,
})
}
#[allow(non_snake_case)]
pub fn NotFaithfullyRepresentable(msg: String) -> Self {
Self(QuantumErrorEnum::NotFaithfullyRepresentable(msg))
}
#[allow(non_snake_case)]
pub fn CertificateNotInherited(node_j: usize, node_k: usize, detail: String) -> Self {
Self(QuantumErrorEnum::CertificateNotInherited {
node_j,
node_k,
detail,
})
}
#[allow(non_snake_case)]
pub fn CyclicStructureUnsupported(msg: String) -> Self {
Self(QuantumErrorEnum::CyclicStructureUnsupported(msg))
}
#[allow(non_snake_case)]
pub fn HypothesisCountExceeded(n: usize, pairs: usize) -> Self {
Self(QuantumErrorEnum::HypothesisCountExceeded { n, pairs })
}
#[allow(non_snake_case)]
pub fn BoundaryNotHeld(msg: String) -> Self {
Self(QuantumErrorEnum::BoundaryNotHeld(msg))
}
#[allow(non_snake_case)]
pub fn NotInNormalizer(generator: usize, detail: String) -> Self {
Self(QuantumErrorEnum::NotInNormalizer { generator, detail })
}
#[allow(non_snake_case)]
pub fn NonCliffordGate(msg: String) -> Self {
Self(QuantumErrorEnum::NonCliffordGate(msg))
}
#[allow(non_snake_case)]
pub fn CalculationError(msg: String) -> Self {
Self(QuantumErrorEnum::CalculationError(msg))
}
}
impl From<QuantumError> for CausalityError {
fn from(e: QuantumError) -> Self {
CausalityError::new(CausalityErrorEnum::Custom(format!("{}", e)))
}
}
impl From<deep_causality_metric::MetricError> for QuantumError {
fn from(e: deep_causality_metric::MetricError) -> Self {
QuantumError::new(QuantumErrorEnum::UnsupportedMetric(format!("{}", e)))
}
}
impl core::error::Error for QuantumError {}
impl Display for QuantumError {
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
match &self.0 {
QuantumErrorEnum::DimensionMismatch(msg) => write!(f, "Dimension Mismatch: {}", msg),
QuantumErrorEnum::MetricMismatch(msg) => write!(f, "Metric Mismatch: {}", msg),
QuantumErrorEnum::UnsupportedMetric(msg) => write!(f, "Unsupported Metric: {}", msg),
QuantumErrorEnum::NonFiniteValue(msg) => write!(f, "Non-Finite Value: {}", msg),
QuantumErrorEnum::NormalizationError(msg) => {
write!(f, "Normalization Error: {}", msg)
}
QuantumErrorEnum::NonPositiveOperator(msg) => {
write!(f, "Non-Positive Operator: {}", msg)
}
QuantumErrorEnum::NonUnitTrace(msg) => write!(f, "Non-Unit Trace: {}", msg),
QuantumErrorEnum::NonCptpChannel(msg) => write!(f, "Non-CPTP Channel: {}", msg),
QuantumErrorEnum::PartialTraceShape(msg) => {
write!(f, "Partial Trace Shape Error: {}", msg)
}
QuantumErrorEnum::CommutatorNonZero {
node_j,
node_k,
detail,
} => write!(
f,
"Non-Zero Commutator: factors at nodes {} and {} do not commute: {}",
node_j, node_k, detail
),
QuantumErrorEnum::NotFaithfullyRepresentable(msg) => {
write!(f, "Not Faithfully Representable (C3 obstruction): {}", msg)
}
QuantumErrorEnum::CertificateNotInherited {
node_j,
node_k,
detail,
} => write!(
f,
"Certificate Not Inherited: the parts' factors at nodes {} and {} do not certify the composite: {}",
node_j, node_k, detail
),
QuantumErrorEnum::CyclicStructureUnsupported(msg) => {
write!(f, "Cyclic Structure Unsupported: {}", msg)
}
QuantumErrorEnum::HypothesisCountExceeded { n, pairs } => write!(
f,
"Hypothesis Count Exceeded: {} hypotheses give {} pairs, above the design cap",
n, pairs
),
QuantumErrorEnum::BoundaryNotHeld(msg) => write!(f, "Boundary Not Held: {}", msg),
QuantumErrorEnum::NotInNormalizer { generator, detail } => write!(
f,
"Not In Normalizer: anticommutes with stabilizer generator {} ({})",
generator, detail
),
QuantumErrorEnum::NonCliffordGate(msg) => write!(f, "Non-Clifford Gate: {}", msg),
QuantumErrorEnum::CalculationError(msg) => write!(f, "Calculation Error: {}", msg),
}
}
}