oxirs_stream/quantum_processing/
quantum_circuit.rs1use nalgebra::DMatrix;
4use num_complex::Complex64;
5use std::collections::HashMap;
6
7use super::quantum_config::QuantumGate;
8
9#[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 self.gates.len() as u32
50 }
51}
52
53#[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#[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#[derive(Debug, Clone)]
110pub enum MeasurementBasis {
111 Computational, Hadamard, Circular, Custom(DMatrix<Complex64>),
115}
116
117#[derive(Debug, Clone)]
119pub struct ClassicalCondition {
120 pub register: String,
121 pub value: u64,
122 pub comparison: ComparisonOperator,
123}
124
125#[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#[derive(Debug, Clone)]
138pub struct QuantumComplexity {
139 pub quantum_gate_count: HashMap<String, u32>, 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}