mod detectors;
mod distance;
pub use detectors::{
SurgeryCheckRecord, SurgeryDetectorLimits, SurgeryDetectorModel, SurgeryFault,
};
mod execution;
mod geometry;
mod recovery;
use super::PlanarCode;
use crate::photonic::stabilizer::PauliProduct;
pub use distance::SurgeryDistance;
pub use execution::{
SurgeryAbort, SurgeryAttempt, SurgeryCnotRecord, SurgeryMeasurement, SurgeryPhase,
SurgeryRecord,
};
pub use recovery::SurgeryRecovery;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum MergeBasis {
ZZ,
XX,
}
#[derive(Clone, Copy, Debug)]
pub struct SurgeryLimits {
pub max_data_qubits: usize,
pub max_checks: usize,
pub max_measurements: usize,
pub max_distance_work: usize,
}
impl Default for SurgeryLimits {
fn default() -> Self {
Self {
max_data_qubits: 2048,
max_checks: 4096,
max_measurements: 1 << 20,
max_distance_work: 1 << 26,
}
}
}
#[derive(Clone, Debug)]
pub struct PlanarSurgery {
code: PlanarCode,
basis: MergeBasis,
merged: Vec<PauliProduct>,
split: Vec<PauliProduct>,
boundary: Vec<[usize; 2]>,
coordinates: Vec<[isize; 2]>,
distance: SurgeryDistance,
}
impl PlanarSurgery {
pub fn code(&self) -> &PlanarCode {
&self.code
}
pub fn basis(&self) -> MergeBasis {
self.basis
}
pub fn merged_checks(&self) -> &[PauliProduct] {
&self.merged
}
pub fn seam_checks(&self) -> &[PauliProduct] {
&self.merged[..self.code.distance()]
}
pub fn split_checks(&self) -> &[PauliProduct] {
&self.split
}
pub fn boundary_checks(&self) -> &[[usize; 2]] {
&self.boundary
}
pub fn coordinates(&self) -> &[[isize; 2]] {
&self.coordinates
}
pub fn distance_certificate(&self) -> &SurgeryDistance {
&self.distance
}
pub fn measurements(&self) -> usize {
self.code.distance() * (self.merged.len() + self.split.len())
}
}