use crate::components::state::State;
use num_complex::Complex;
use std::ops::Deref;
use crate::compiler::{compilable::Compilable, ir::InstructionIR};
#[derive(Debug, Clone, PartialEq)]
pub struct MeasurementResult {
pub basis: MeasurementBasis,
pub indices: Vec<usize>,
pub outcomes: Vec<u8>,
pub new_state: State,
}
impl Deref for MeasurementResult {
type Target = State;
fn deref(&self) -> &Self::Target {
&self.new_state
}
}
impl MeasurementResult {
pub fn get_indices(&self) -> &Vec<usize> {
&self.indices
}
pub fn get_basis(&self) -> &MeasurementBasis {
&self.basis
}
pub fn get_outcomes(&self) -> &Vec<u8> {
&self.outcomes
}
pub fn get_new_state(&self) -> &State {
&self.new_state
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum MeasurementBasis {
Computational,
X,
Y,
Custom([[Complex<f64>; 2]; 2]),
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub(crate) struct MeasurementOperation {
pub basis: MeasurementBasis,
}
impl Compilable for MeasurementOperation {
fn to_ir(&self, targets: Vec<usize>, _controls: Vec<usize>) -> Vec<InstructionIR> {
vec![InstructionIR::Measurement(targets, self.basis)]
}
}