use crate::pauli::PauliString;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub enum CircuitInstructionKind {
#[default]
Tick,
H,
HNegXy,
HNegXz,
HNegYz,
HXy,
HYz,
CNegXyz,
CNegZyx,
CXNegYz,
CXyNegZ,
CXyz,
CZNegYx,
CZyNegX,
CZyx,
S,
SDag,
SqrtX,
SqrtXDag,
SqrtY,
SqrtYDag,
X,
Y,
Z,
CX,
CY,
CZ,
Swap,
CxSwap,
CzSwap,
ISwap,
ISwapDag,
SqrtXx,
SqrtXxDag,
SqrtYy,
SqrtYyDag,
SqrtZz,
SqrtZzDag,
SwapCx,
Xcx,
Xcy,
Xcz,
Ycx,
Ycy,
Ycz,
T,
TDag,
PauliRotation,
MZ,
MX,
MY,
Mrz,
Mrx,
Mry,
RZ,
RX,
RY,
Mpp,
ExpVal,
XError,
YError,
ZError,
Depolarize1,
Depolarize2,
Depolarize3,
PauliChannel1,
PauliChannel2,
PauliChannel3,
PauliProductChannel,
HeraldedErase,
HeraldedPauliChannel1,
MPad,
FeedbackX,
FeedbackY,
FeedbackZ,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct CircuitMeasurementTarget {
pub qubit: usize,
pub inverted: bool,
}
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct CircuitPauliProduct {
pub pauli: PauliString,
pub inverted: bool,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct CircuitFeedbackTarget {
pub record: usize,
pub qubit: usize,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CircuitInstruction {
pub kind: CircuitInstructionKind,
pub probability: f64,
pub kernel_angle: f64,
pub qubits: Vec<usize>,
pub measurement_targets: Vec<CircuitMeasurementTarget>,
pub pauli_products: Vec<CircuitPauliProduct>,
pub feedback_targets: Vec<CircuitFeedbackTarget>,
pub probabilities: Vec<f64>,
pub exp_val: Option<usize>,
pub line: usize,
}
impl CircuitInstruction {
pub fn new(kind: CircuitInstructionKind, line: usize) -> Self {
Self {
kind,
line,
..Self::default()
}
}
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CircuitDetector {
pub records: Vec<usize>,
pub coords: Vec<f64>,
pub line: usize,
pub after_instruction: usize,
pub discard: bool,
}
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct CircuitObservableInclude {
pub index: usize,
pub records: Vec<usize>,
pub line: usize,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct Circuit {
pub(crate) nqubits: usize,
pub(crate) nrecords: usize,
pub(crate) nexpvals: usize,
pub(crate) instructions: Vec<CircuitInstruction>,
pub(crate) detectors: Vec<CircuitDetector>,
pub(crate) observables: Vec<CircuitObservableInclude>,
}
impl Circuit {
#[cfg(test)]
pub fn num_observables(&self) -> usize {
self.observables
.iter()
.map(|observable| observable.index + 1)
.max()
.unwrap_or(0)
}
}