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),
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 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::CalculationError(msg) => write!(f, "Calculation Error: {}", msg),
}
}
}