use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum QECCodeType {
SurfaceCode {
distance: usize,
layout: SurfaceCodeLayout,
},
ColorCode {
distance: usize,
color_type: ColorCodeType,
},
TopologicalCode { code_type: TopologicalCodeType },
CSSCode { stabilizers: Vec<String> },
SteaneCode,
ShorCode,
RepetitionCode { length: usize },
CustomCode {
name: String,
parameters: HashMap<String, f64>,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum SurfaceCodeLayout {
Square,
Triangular,
Hexagonal,
Rotated,
Custom(String),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ColorCodeType {
TriangularLattice,
HexagonalLattice,
Custom(String),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum TopologicalCodeType {
ToricCode,
PlanarCode,
TwistedToricCode,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SurfaceCodeConfig {
pub distance: usize,
pub layout: SurfaceCodeLayout,
pub qubit_allocation: QubitAllocation,
pub stabilizer_config: StabilizerConfig,
pub boundary_conditions: BoundaryConditions,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QubitAllocation {
pub data_qubits: Vec<usize>,
pub syndrome_qubits: Vec<usize>,
pub auxiliary_qubits: Vec<usize>,
pub spare_qubits: Vec<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StabilizerConfig {
pub x_stabilizers: Vec<Stabilizer>,
pub z_stabilizers: Vec<Stabilizer>,
pub measurement_schedule: MeasurementSchedule,
pub error_threshold: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Stabilizer {
pub qubits: Vec<usize>,
pub operators: Vec<PauliOperator>,
pub weight: usize,
pub expected_eigenvalue: i8,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum PauliOperator {
I, X, Y, Z, }
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MeasurementSchedule {
pub measurement_order: Vec<usize>,
pub measurement_interval: std::time::Duration,
pub parallel_groups: Vec<Vec<usize>>,
pub adaptive_scheduling: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum BoundaryConditions {
Open,
Periodic,
Twisted,
Rough,
Smooth,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ColorCodeConfig {
pub distance: usize,
pub color_type: ColorCodeType,
pub face_coloring: FaceColoring,
pub vertex_operators: Vec<VertexOperator>,
pub face_operators: Vec<FaceOperator>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FaceColoring {
pub color_assignments: HashMap<usize, Color>,
pub constraints: Vec<ColorConstraint>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum Color {
Red,
Green,
Blue,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ColorConstraint {
pub constraint_type: ConstraintType,
pub faces: Vec<usize>,
pub required_colors: Vec<Color>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ConstraintType {
AdjacentFaces,
VertexNeighbors,
EdgeConnected,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VertexOperator {
pub vertex: usize,
pub qubits: Vec<usize>,
pub operator_type: VertexOperatorType,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum VertexOperatorType {
XType,
ZType,
YType,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FaceOperator {
pub face: usize,
pub color: Color,
pub boundary_qubits: Vec<usize>,
pub weight: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TopologicalCodeConfig {
pub code_type: TopologicalCodeType,
pub lattice: LatticeConfig,
pub logical_operators: LogicalOperators,
pub syndrome_extraction: SyndromeExtractionConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LatticeConfig {
pub dimensions: (usize, usize),
pub periodic: bool,
pub twisted: bool,
pub defects: Vec<DefectLocation>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DefectLocation {
pub position: (usize, usize),
pub defect_type: DefectType,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum DefectType {
Hole,
Twist,
Boundary,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LogicalOperators {
pub logical_x: Vec<LogicalOperator>,
pub logical_z: Vec<LogicalOperator>,
pub commutation_relations: CommutationTable,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LogicalOperator {
pub path: Vec<usize>,
pub operator_type: LogicalOperatorType,
pub homology_class: Vec<i32>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum LogicalOperatorType {
XOperator,
ZOperator,
YOperator,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CommutationTable {
pub matrix: Vec<Vec<i8>>,
pub labels: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SyndromeExtractionConfig {
pub method: ExtractionMethod,
pub measurement_circuits: Vec<MeasurementCircuit>,
pub correction_cycles: usize,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ExtractionMethod {
Standard,
Fast,
Adaptive,
FaultTolerant,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MeasurementCircuit {
pub gates: Vec<Gate>,
pub measurement_qubits: Vec<usize>,
pub classical_registers: Vec<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Gate {
pub gate_type: GateType,
pub targets: Vec<usize>,
pub controls: Vec<usize>,
pub parameters: Vec<f64>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum GateType {
X,
Y,
Z,
H,
S,
T,
CNOT,
CZ,
Measurement,
Reset,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CSSCodeConfig {
pub classical_codes: ClassicalCodes,
pub parity_matrices: ParityMatrices,
pub generator_matrices: GeneratorMatrices,
pub code_parameters: CSSParameters,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ClassicalCodes {
pub x_code: ClassicalCode,
pub z_code: ClassicalCode,
pub dual_relationship: DualRelationship,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ClassicalCode {
pub length: usize,
pub dimension: usize,
pub min_distance: usize,
pub generator: Vec<Vec<u8>>,
pub parity_check: Vec<Vec<u8>>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum DualRelationship {
SelfDual,
MutuallyDual,
NonDual,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ParityMatrices {
pub hx_matrix: Vec<Vec<u8>>,
pub hz_matrix: Vec<Vec<u8>>,
pub orthogonality_verified: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GeneratorMatrices {
pub gx_matrix: Vec<Vec<u8>>,
pub gz_matrix: Vec<Vec<u8>>,
pub logical_generators: LogicalGenerators,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LogicalGenerators {
pub logical_x_generators: Vec<Vec<u8>>,
pub logical_z_generators: Vec<Vec<u8>>,
pub stabilizer_generators: Vec<Vec<u8>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CSSParameters {
pub n: usize,
pub k: usize,
pub d: usize,
pub t: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SteaneCodeConfig {
pub parameters: SteaneParameters,
pub encoding_circuits: Vec<EncodingCircuit>,
pub decoding_tables: DecodingTables,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SteaneParameters {
pub n: usize, pub k: usize, pub d: usize, }
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EncodingCircuit {
pub name: String,
pub gates: Vec<Gate>,
pub input_qubits: Vec<usize>,
pub output_qubits: Vec<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DecodingTables {
pub syndrome_error_map: HashMap<Vec<u8>, ErrorPattern>,
pub recovery_operations: HashMap<Vec<u8>, Vec<Gate>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorPattern {
pub locations: Vec<usize>,
pub error_types: Vec<ErrorType>,
pub weight: usize,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ErrorType {
X,
Y,
Z,
Identity,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ShorCodeConfig {
pub parameters: ShorParameters,
pub bit_flip_structure: BitFlipStructure,
pub phase_flip_structure: PhaseFlipStructure,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ShorParameters {
pub n: usize, pub k: usize, pub d: usize, }
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BitFlipStructure {
pub blocks: Vec<CodeBlock>,
pub parity_qubits: Vec<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PhaseFlipStructure {
pub superposition_states: Vec<SuperpositionState>,
pub phase_parity_qubits: Vec<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CodeBlock {
pub qubits: Vec<usize>,
pub majority_vote_qubits: Vec<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SuperpositionState {
pub coefficients: Vec<f64>,
pub basis_states: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RepetitionCodeConfig {
pub length: usize,
pub majority_voting: MajorityVoting,
pub error_threshold: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MajorityVoting {
pub strategy: VotingStrategy,
pub confidence_threshold: f64,
pub tie_breaking: TieBreaking,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum VotingStrategy {
Simple,
Weighted,
Adaptive,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum TieBreaking {
Random,
Conservative,
Aggressive,
Historical,
}