use ndarray::Array2;
use num_enum::{IntoPrimitive, TryFromPrimitive};
use serde::{Deserialize, Serialize};
use crate::{common_matrices, linalg::Tensor, C64};
#[derive(Debug, Copy, Clone, Serialize, Deserialize, IntoPrimitive, TryFromPrimitive)]
#[repr(u8)]
pub enum Pauli {
I = 0,
X = 1,
Y = 3,
Z = 2,
}
pub trait AsUnitary {
fn as_unitary(&self) -> Array2<C64>;
}
impl AsUnitary for Pauli {
fn as_unitary(&self) -> Array2<C64> {
match self {
Pauli::I => common_matrices::nq_eye(1),
Pauli::X => common_matrices::x(),
Pauli::Y => common_matrices::y(),
Pauli::Z => common_matrices::z(),
}
}
}
impl AsUnitary for Vec<Pauli> {
fn as_unitary(&self) -> Array2<C64> {
let sq_unitaries = self.iter().map(|p| p.as_unitary());
let result = sq_unitaries.reduce(|p, q| p.tensor(&q));
result.unwrap()
}
}