use crate::StabilizerCHForm;
use crate::error::{Error, Result};
use crate::form::types::QubitState;
impl StabilizerCHForm {
pub(crate) fn get_qubit_state(&self, qarg: usize) -> Result<QubitState> {
if qarg >= self.n {
return Err(Error::QubitIndexOutOfBounds(qarg, self.n));
}
let g_row = self.mat_g.row(qarg);
let is_determined = !g_row.iter().zip(&self.vec_v).any(|(&g, &v)| g && v);
if is_determined {
let value = g_row.iter().zip(&self.vec_s).fold(
0,
|acc, (&g, &s)| {
if g && s { acc + 1 } else { acc }
},
) % 2
== 1;
Ok(QubitState::Determined(value))
} else {
Ok(QubitState::Superposition)
}
}
}