use deep_causality_multivector::{CausalMultiVector, MultiVector};
use deep_causality_num::{Complex, RealField};
pub trait QuantumGates {
fn gate_identity() -> Self;
fn gate_x() -> Self;
fn gate_y() -> Self;
fn gate_z() -> Self;
fn gate_hadamard() -> Self;
fn gate_cnot() -> Self;
}
pub trait QuantumOps<R: RealField> {
fn dag(&self) -> Self;
fn bracket(&self, other: &Self) -> Complex<R>;
fn expectation_value(&self, operator: &Self) -> Complex<R>;
fn normalize(&self) -> Self;
}
impl<R: RealField + core::iter::Sum> QuantumOps<R> for CausalMultiVector<Complex<R>> {
fn dag(&self) -> Self {
let reverted = self.reversion();
let conjugated_data = reverted
.data()
.iter()
.map(|c| Complex::new(c.re, -c.im))
.collect::<Vec<_>>();
CausalMultiVector::new(conjugated_data, reverted.metric()).unwrap_or_else(|_| {
CausalMultiVector::new(
vec![Complex::new(R::zero(), R::zero()); reverted.data().len()],
reverted.metric(),
)
.expect("consistent metric")
})
}
fn bracket(&self, other: &Self) -> Complex<R> {
let prod = self.dag().geometric_product(other);
prod.get(0)
.cloned()
.unwrap_or(Complex::new(R::zero(), R::zero()))
}
fn expectation_value(&self, operator: &Self) -> Complex<R> {
let bra_psi = self.dag();
let a_psi = operator.geometric_product(self);
let prod = bra_psi.geometric_product(&a_psi);
prod.get(0)
.cloned()
.unwrap_or(Complex::new(R::zero(), R::zero()))
}
fn normalize(&self) -> Self {
use deep_causality_multivector::MultiVectorL2Norm;
self.normalize_l2()
}
}