use num::complex::Complex;
use crate::data::GeneralizedTableau;
use crate::sparsevec::SparseVector;
use ppvm_traits::config::Config;
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub enum QubitStatus {
#[default]
Live = 0,
Leaked = 1,
Lost = 2,
}
impl QubitStatus {
#[inline]
pub const fn is_inactive(self) -> bool {
(self as u8) != 0
}
#[inline]
pub const fn is_lost(self) -> bool {
matches!(self, QubitStatus::Lost)
}
#[inline]
pub const fn is_leaked(self) -> bool {
matches!(self, QubitStatus::Leaked)
}
}
impl<T: Config, I, C: SparseVector<Complex<T::Coeff>, I>> GeneralizedTableau<T, I, C> {
#[inline]
pub fn is_inactive(&self, addr0: usize) -> bool {
self.qubit_status[addr0].is_inactive()
}
#[inline]
pub fn is_lost(&self, addr0: usize) -> bool {
self.qubit_status[addr0].is_lost()
}
#[inline]
pub fn is_leaked(&self, addr0: usize) -> bool {
self.qubit_status[addr0].is_leaked()
}
#[inline]
pub(crate) fn any_inactive(&self, indices: &[usize]) -> bool {
indices.iter().any(|&i| self.is_inactive(i))
}
#[inline]
pub(crate) fn any_inactive_pair(&self, pairs: &[(usize, usize)]) -> bool {
pairs
.iter()
.any(|&(c, t)| self.is_inactive(c) || self.is_inactive(t))
}
}