Skip to main content

oxirs_stream/quantum_processing/
quantum_circuit.rs

1//! Quantum circuit representation and operations
2
3use nalgebra::DMatrix;
4use num_complex::Complex64;
5use std::collections::HashMap;
6
7use super::quantum_config::QuantumGate;
8
9/// Quantum circuit representation
10#[derive(Debug, Clone)]
11pub struct QuantumCircuit {
12    pub circuit_id: String,
13    pub qubits: u32,
14    pub classical_bits: u32,
15    pub gates: Vec<QuantumGateOperation>,
16    pub measurements: Vec<MeasurementOperation>,
17    pub circuit_depth: u32,
18    pub estimated_execution_time_us: f64,
19    pub success_probability: f64,
20    pub quantum_complexity: QuantumComplexity,
21}
22
23impl QuantumCircuit {
24    pub fn new(circuit_id: String, qubits: u32, classical_bits: u32) -> Self {
25        Self {
26            circuit_id,
27            qubits,
28            classical_bits,
29            gates: Vec::new(),
30            measurements: Vec::new(),
31            circuit_depth: 0,
32            estimated_execution_time_us: 0.0,
33            success_probability: 1.0,
34            quantum_complexity: QuantumComplexity::default(),
35        }
36    }
37
38    pub fn add_gate(&mut self, gate: QuantumGateOperation) {
39        self.gates.push(gate);
40        self.circuit_depth = self.calculate_depth();
41    }
42
43    pub fn add_measurement(&mut self, measurement: MeasurementOperation) {
44        self.measurements.push(measurement);
45    }
46
47    fn calculate_depth(&self) -> u32 {
48        // Simplified depth calculation
49        self.gates.len() as u32
50    }
51}
52
53/// Quantum gate operation
54#[derive(Debug, Clone)]
55pub struct QuantumGateOperation {
56    pub gate: QuantumGate,
57    pub target_qubits: Vec<u32>,
58    pub control_qubits: Vec<u32>,
59    pub parameters: Vec<f64>,
60    pub condition: Option<ClassicalCondition>,
61}
62
63impl QuantumGateOperation {
64    pub fn new(gate: QuantumGate, target_qubits: Vec<u32>) -> Self {
65        Self {
66            gate,
67            target_qubits,
68            control_qubits: Vec::new(),
69            parameters: Vec::new(),
70            condition: None,
71        }
72    }
73
74    pub fn with_controls(mut self, control_qubits: Vec<u32>) -> Self {
75        self.control_qubits = control_qubits;
76        self
77    }
78
79    pub fn with_parameters(mut self, parameters: Vec<f64>) -> Self {
80        self.parameters = parameters;
81        self
82    }
83}
84
85/// Measurement operation
86#[derive(Debug, Clone)]
87pub struct MeasurementOperation {
88    pub qubit: u32,
89    pub classical_bit: u32,
90    pub basis: MeasurementBasis,
91}
92
93impl MeasurementOperation {
94    pub fn new(qubit: u32, classical_bit: u32) -> Self {
95        Self {
96            qubit,
97            classical_bit,
98            basis: MeasurementBasis::Computational,
99        }
100    }
101
102    pub fn with_basis(mut self, basis: MeasurementBasis) -> Self {
103        self.basis = basis;
104        self
105    }
106}
107
108/// Measurement basis
109#[derive(Debug, Clone)]
110pub enum MeasurementBasis {
111    Computational, // Z basis
112    Hadamard,      // X basis
113    Circular,      // Y basis
114    Custom(DMatrix<Complex64>),
115}
116
117/// Classical condition for conditional operations
118#[derive(Debug, Clone)]
119pub struct ClassicalCondition {
120    pub register: String,
121    pub value: u64,
122    pub comparison: ComparisonOperator,
123}
124
125/// Comparison operators for classical conditions
126#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
127pub enum ComparisonOperator {
128    Equal,
129    NotEqual,
130    GreaterThan,
131    LessThan,
132    GreaterOrEqual,
133    LessOrEqual,
134}
135
136/// Quantum complexity metrics
137#[derive(Debug, Clone)]
138pub struct QuantumComplexity {
139    pub quantum_gate_count: HashMap<String, u32>, // Using String instead of QuantumGate for simplicity
140    pub entanglement_entropy: f64,
141    pub circuit_expressivity: f64,
142    pub barren_plateau_susceptibility: f64,
143}
144
145impl Default for QuantumComplexity {
146    fn default() -> Self {
147        Self {
148            quantum_gate_count: HashMap::new(),
149            entanglement_entropy: 0.0,
150            circuit_expressivity: 0.0,
151            barren_plateau_susceptibility: 0.0,
152        }
153    }
154}