pub struct NoiseModel {
pub single_qubit_errors: HashMap<usize, f64>,
pub two_qubit_errors: HashMap<(usize, usize), f64>,
pub t1_times: HashMap<usize, f64>,
pub t2_times: HashMap<usize, f64>,
pub readout_fidelities: HashMap<usize, f64>,
pub gate_times: HashMap<String, f64>,
pub crosstalk_matrix: Option<Vec<Vec<f64>>>,
}
Expand description
Noise model for quantum devices
Fields§
§single_qubit_errors: HashMap<usize, f64>
Single-qubit gate error rates (per qubit)
two_qubit_errors: HashMap<(usize, usize), f64>
Two-qubit gate error rates (per qubit pair)
t1_times: HashMap<usize, f64>
T1 coherence times (microseconds)
t2_times: HashMap<usize, f64>
T2 coherence times (microseconds)
readout_fidelities: HashMap<usize, f64>
Readout fidelities
gate_times: HashMap<String, f64>
Gate execution times (nanoseconds)
crosstalk_matrix: Option<Vec<Vec<f64>>>
Crosstalk matrix
Implementations§
Source§impl NoiseModel
impl NoiseModel
Sourcepub fn new() -> Self
pub fn new() -> Self
Create a new empty noise model
Examples found in repository?
examples/noise_optimization_demo.rs (line 197)
186fn demo_fidelity_comparison() -> quantrs2_core::error::QuantRS2Result<()> {
187 println!("--- Fidelity Comparison Across Noise Models ---");
188
189 // Create circuits of different complexity
190 let circuits = vec![
191 create_simple_circuit()?,
192 create_medium_circuit()?,
193 create_complex_circuit()?,
194 ];
195
196 let noise_models = vec![
197 ("Ideal", NoiseModel::new()),
198 ("Uniform", NoiseModel::uniform(4)),
199 ("IBM-like", NoiseModel::ibm_like(4)),
200 ];
201
202 println!(
203 "{:<12} {:<8} {:<8} {:<8}",
204 "Circuit", "Ideal", "Uniform", "IBM-like"
205 );
206 println!("{:-<40}", "");
207
208 for (i, circuit) in circuits.iter().enumerate() {
209 let circuit_name = match i {
210 0 => "Simple",
211 1 => "Medium",
212 2 => "Complex",
213 _ => "Unknown",
214 };
215
216 print!("{:<12}", circuit_name);
217
218 for (_, noise_model) in &noise_models {
219 let optimizer = NoiseAwareOptimizer::new(noise_model.clone());
220 let fidelity = optimizer.estimate_fidelity(circuit);
221 print!(" {:<8.4}", fidelity);
222 }
223 println!();
224 }
225
226 println!();
227 Ok(())
228}
Sourcepub fn uniform(num_qubits: usize) -> Self
pub fn uniform(num_qubits: usize) -> Self
Create a uniform noise model for testing
Examples found in repository?
examples/noise_optimization_demo.rs (line 47)
44fn demo_uniform_noise(circuit: &Circuit<4>) -> quantrs2_core::error::QuantRS2Result<()> {
45 println!("--- Uniform Noise Model ---");
46
47 let noise_model = NoiseModel::uniform(4);
48 let optimizer = NoiseAwareOptimizer::new(noise_model.clone());
49
50 println!("Noise characteristics:");
51 println!(
52 " Single-qubit error rate: {:.2e}",
53 noise_model.single_qubit_error(0)
54 );
55 println!(
56 " Two-qubit error rate: {:.2e}",
57 noise_model.two_qubit_error(0, 1)
58 );
59 println!(" T1 time: {:.1} μs", noise_model.t1_time(0));
60 println!(" T2 time: {:.1} μs", noise_model.t2_time(0));
61 println!(" CNOT gate time: {:.1} ns", noise_model.gate_time("CNOT"));
62
63 let original_fidelity = optimizer.estimate_fidelity(circuit);
64 println!("\nOriginal circuit fidelity: {:.4}", original_fidelity);
65
66 let optimized = optimizer.optimize(circuit)?;
67 let optimized_fidelity = optimizer.estimate_fidelity(&optimized);
68 println!("Optimized circuit fidelity: {:.4}", optimized_fidelity);
69
70 if optimized_fidelity > original_fidelity {
71 println!(
72 "✓ Fidelity improved by {:.4}",
73 optimized_fidelity - original_fidelity
74 );
75 } else {
76 println!("→ No fidelity improvement (circuit already optimal)");
77 }
78
79 println!();
80 Ok(())
81}
82
83fn demo_ibm_noise(circuit: &Circuit<4>) -> quantrs2_core::error::QuantRS2Result<()> {
84 println!("--- IBM-like Noise Model ---");
85
86 let noise_model = NoiseModel::ibm_like(4);
87 let coupling_map = CouplingMap::linear(4);
88 let optimizer = NoiseAwareOptimizer::new(noise_model.clone()).with_coupling_map(coupling_map);
89
90 println!("IBM-like noise characteristics:");
91 println!(
92 " Single-qubit error rate: {:.2e}",
93 noise_model.single_qubit_error(0)
94 );
95 println!(
96 " Two-qubit error rate (adjacent): {:.2e}",
97 noise_model.two_qubit_error(0, 1)
98 );
99 println!(" Hadamard gate time: {:.1} ns", noise_model.gate_time("H"));
100 println!(" CNOT gate time: {:.1} ns", noise_model.gate_time("CNOT"));
101
102 let original_fidelity = optimizer.estimate_fidelity(circuit);
103 println!("\nOriginal circuit fidelity: {:.4}", original_fidelity);
104
105 let optimized = optimizer.optimize(circuit)?;
106 let optimized_fidelity = optimizer.estimate_fidelity(&optimized);
107 println!("Optimized circuit fidelity: {:.4}", optimized_fidelity);
108
109 println!("Available optimization passes:");
110 for pass in optimizer.get_passes() {
111 println!(" - {}", pass.name());
112 }
113
114 println!();
115 Ok(())
116}
117
118fn demo_noise_aware_cost_model(circuit: &Circuit<4>) -> quantrs2_core::error::QuantRS2Result<()> {
119 println!("--- Noise-Aware Cost Analysis ---");
120
121 let uniform_noise = NoiseModel::uniform(4);
122 let ibm_noise = NoiseModel::ibm_like(4);
123
124 let uniform_cost_model = NoiseAwareCostModel::new(uniform_noise);
125 let ibm_cost_model = NoiseAwareCostModel::new(ibm_noise);
126
127 let uniform_cost = uniform_cost_model.circuit_cost(circuit);
128 let ibm_cost = ibm_cost_model.circuit_cost(circuit);
129
130 println!("Circuit costs with different noise models:");
131 println!(" Uniform noise model: {:.2}", uniform_cost);
132 println!(" IBM-like noise model: {:.2}", ibm_cost);
133
134 // Analyze individual gate costs
135 println!("\nGate-by-gate cost analysis (IBM model):");
136 for (i, gate) in circuit.gates().iter().enumerate() {
137 let gate_cost = ibm_cost_model.gate_cost(gate.as_ref());
138 println!(" Gate {}: {} - Cost: {:.2}", i, gate.name(), gate_cost);
139 }
140
141 println!();
142 Ok(())
143}
144
145fn demo_noise_optimization_passes(
146 circuit: &Circuit<4>,
147) -> quantrs2_core::error::QuantRS2Result<()> {
148 println!("--- Individual Optimization Passes ---");
149
150 let noise_model = NoiseModel::ibm_like(4);
151 let coupling_map = CouplingMap::linear(4);
152
153 // Test coherence optimization
154 let coherence_opt = CoherenceOptimization::new(noise_model.clone());
155 let cost_model = NoiseAwareCostModel::new(noise_model.clone());
156
157 if coherence_opt.should_apply() {
158 let coherence_result = coherence_opt.apply(circuit, &cost_model)?;
159 println!("✓ Coherence optimization applied");
160 println!(" Original gates: {}", circuit.num_gates());
161 println!(" After coherence opt: {}", coherence_result.num_gates());
162 }
163
164 // Test noise-aware mapping
165 let mapping_opt = NoiseAwareMapping::new(noise_model.clone(), coupling_map.clone());
166 if mapping_opt.should_apply() {
167 let mapping_result = mapping_opt.apply(circuit, &cost_model)?;
168 println!("✓ Noise-aware mapping applied");
169 println!(" Original gates: {}", circuit.num_gates());
170 println!(" After mapping opt: {}", mapping_result.num_gates());
171 }
172
173 // Test dynamical decoupling
174 let dd_opt = DynamicalDecoupling::new(noise_model.clone());
175 if dd_opt.should_apply() {
176 let dd_result = dd_opt.apply(circuit, &cost_model)?;
177 println!("✓ Dynamical decoupling applied");
178 println!(" Original gates: {}", circuit.num_gates());
179 println!(" After DD insertion: {}", dd_result.num_gates());
180 }
181
182 println!();
183 Ok(())
184}
185
186fn demo_fidelity_comparison() -> quantrs2_core::error::QuantRS2Result<()> {
187 println!("--- Fidelity Comparison Across Noise Models ---");
188
189 // Create circuits of different complexity
190 let circuits = vec![
191 create_simple_circuit()?,
192 create_medium_circuit()?,
193 create_complex_circuit()?,
194 ];
195
196 let noise_models = vec![
197 ("Ideal", NoiseModel::new()),
198 ("Uniform", NoiseModel::uniform(4)),
199 ("IBM-like", NoiseModel::ibm_like(4)),
200 ];
201
202 println!(
203 "{:<12} {:<8} {:<8} {:<8}",
204 "Circuit", "Ideal", "Uniform", "IBM-like"
205 );
206 println!("{:-<40}", "");
207
208 for (i, circuit) in circuits.iter().enumerate() {
209 let circuit_name = match i {
210 0 => "Simple",
211 1 => "Medium",
212 2 => "Complex",
213 _ => "Unknown",
214 };
215
216 print!("{:<12}", circuit_name);
217
218 for (_, noise_model) in &noise_models {
219 let optimizer = NoiseAwareOptimizer::new(noise_model.clone());
220 let fidelity = optimizer.estimate_fidelity(circuit);
221 print!(" {:<8.4}", fidelity);
222 }
223 println!();
224 }
225
226 println!();
227 Ok(())
228}
Sourcepub fn ibm_like(num_qubits: usize) -> Self
pub fn ibm_like(num_qubits: usize) -> Self
Create a realistic noise model based on IBM devices
Examples found in repository?
examples/noise_optimization_demo.rs (line 86)
83fn demo_ibm_noise(circuit: &Circuit<4>) -> quantrs2_core::error::QuantRS2Result<()> {
84 println!("--- IBM-like Noise Model ---");
85
86 let noise_model = NoiseModel::ibm_like(4);
87 let coupling_map = CouplingMap::linear(4);
88 let optimizer = NoiseAwareOptimizer::new(noise_model.clone()).with_coupling_map(coupling_map);
89
90 println!("IBM-like noise characteristics:");
91 println!(
92 " Single-qubit error rate: {:.2e}",
93 noise_model.single_qubit_error(0)
94 );
95 println!(
96 " Two-qubit error rate (adjacent): {:.2e}",
97 noise_model.two_qubit_error(0, 1)
98 );
99 println!(" Hadamard gate time: {:.1} ns", noise_model.gate_time("H"));
100 println!(" CNOT gate time: {:.1} ns", noise_model.gate_time("CNOT"));
101
102 let original_fidelity = optimizer.estimate_fidelity(circuit);
103 println!("\nOriginal circuit fidelity: {:.4}", original_fidelity);
104
105 let optimized = optimizer.optimize(circuit)?;
106 let optimized_fidelity = optimizer.estimate_fidelity(&optimized);
107 println!("Optimized circuit fidelity: {:.4}", optimized_fidelity);
108
109 println!("Available optimization passes:");
110 for pass in optimizer.get_passes() {
111 println!(" - {}", pass.name());
112 }
113
114 println!();
115 Ok(())
116}
117
118fn demo_noise_aware_cost_model(circuit: &Circuit<4>) -> quantrs2_core::error::QuantRS2Result<()> {
119 println!("--- Noise-Aware Cost Analysis ---");
120
121 let uniform_noise = NoiseModel::uniform(4);
122 let ibm_noise = NoiseModel::ibm_like(4);
123
124 let uniform_cost_model = NoiseAwareCostModel::new(uniform_noise);
125 let ibm_cost_model = NoiseAwareCostModel::new(ibm_noise);
126
127 let uniform_cost = uniform_cost_model.circuit_cost(circuit);
128 let ibm_cost = ibm_cost_model.circuit_cost(circuit);
129
130 println!("Circuit costs with different noise models:");
131 println!(" Uniform noise model: {:.2}", uniform_cost);
132 println!(" IBM-like noise model: {:.2}", ibm_cost);
133
134 // Analyze individual gate costs
135 println!("\nGate-by-gate cost analysis (IBM model):");
136 for (i, gate) in circuit.gates().iter().enumerate() {
137 let gate_cost = ibm_cost_model.gate_cost(gate.as_ref());
138 println!(" Gate {}: {} - Cost: {:.2}", i, gate.name(), gate_cost);
139 }
140
141 println!();
142 Ok(())
143}
144
145fn demo_noise_optimization_passes(
146 circuit: &Circuit<4>,
147) -> quantrs2_core::error::QuantRS2Result<()> {
148 println!("--- Individual Optimization Passes ---");
149
150 let noise_model = NoiseModel::ibm_like(4);
151 let coupling_map = CouplingMap::linear(4);
152
153 // Test coherence optimization
154 let coherence_opt = CoherenceOptimization::new(noise_model.clone());
155 let cost_model = NoiseAwareCostModel::new(noise_model.clone());
156
157 if coherence_opt.should_apply() {
158 let coherence_result = coherence_opt.apply(circuit, &cost_model)?;
159 println!("✓ Coherence optimization applied");
160 println!(" Original gates: {}", circuit.num_gates());
161 println!(" After coherence opt: {}", coherence_result.num_gates());
162 }
163
164 // Test noise-aware mapping
165 let mapping_opt = NoiseAwareMapping::new(noise_model.clone(), coupling_map.clone());
166 if mapping_opt.should_apply() {
167 let mapping_result = mapping_opt.apply(circuit, &cost_model)?;
168 println!("✓ Noise-aware mapping applied");
169 println!(" Original gates: {}", circuit.num_gates());
170 println!(" After mapping opt: {}", mapping_result.num_gates());
171 }
172
173 // Test dynamical decoupling
174 let dd_opt = DynamicalDecoupling::new(noise_model.clone());
175 if dd_opt.should_apply() {
176 let dd_result = dd_opt.apply(circuit, &cost_model)?;
177 println!("✓ Dynamical decoupling applied");
178 println!(" Original gates: {}", circuit.num_gates());
179 println!(" After DD insertion: {}", dd_result.num_gates());
180 }
181
182 println!();
183 Ok(())
184}
185
186fn demo_fidelity_comparison() -> quantrs2_core::error::QuantRS2Result<()> {
187 println!("--- Fidelity Comparison Across Noise Models ---");
188
189 // Create circuits of different complexity
190 let circuits = vec![
191 create_simple_circuit()?,
192 create_medium_circuit()?,
193 create_complex_circuit()?,
194 ];
195
196 let noise_models = vec![
197 ("Ideal", NoiseModel::new()),
198 ("Uniform", NoiseModel::uniform(4)),
199 ("IBM-like", NoiseModel::ibm_like(4)),
200 ];
201
202 println!(
203 "{:<12} {:<8} {:<8} {:<8}",
204 "Circuit", "Ideal", "Uniform", "IBM-like"
205 );
206 println!("{:-<40}", "");
207
208 for (i, circuit) in circuits.iter().enumerate() {
209 let circuit_name = match i {
210 0 => "Simple",
211 1 => "Medium",
212 2 => "Complex",
213 _ => "Unknown",
214 };
215
216 print!("{:<12}", circuit_name);
217
218 for (_, noise_model) in &noise_models {
219 let optimizer = NoiseAwareOptimizer::new(noise_model.clone());
220 let fidelity = optimizer.estimate_fidelity(circuit);
221 print!(" {:<8.4}", fidelity);
222 }
223 println!();
224 }
225
226 println!();
227 Ok(())
228}
Sourcepub fn single_qubit_error(&self, qubit: usize) -> f64
pub fn single_qubit_error(&self, qubit: usize) -> f64
Get error rate for a single-qubit gate
Examples found in repository?
examples/noise_optimization_demo.rs (line 53)
44fn demo_uniform_noise(circuit: &Circuit<4>) -> quantrs2_core::error::QuantRS2Result<()> {
45 println!("--- Uniform Noise Model ---");
46
47 let noise_model = NoiseModel::uniform(4);
48 let optimizer = NoiseAwareOptimizer::new(noise_model.clone());
49
50 println!("Noise characteristics:");
51 println!(
52 " Single-qubit error rate: {:.2e}",
53 noise_model.single_qubit_error(0)
54 );
55 println!(
56 " Two-qubit error rate: {:.2e}",
57 noise_model.two_qubit_error(0, 1)
58 );
59 println!(" T1 time: {:.1} μs", noise_model.t1_time(0));
60 println!(" T2 time: {:.1} μs", noise_model.t2_time(0));
61 println!(" CNOT gate time: {:.1} ns", noise_model.gate_time("CNOT"));
62
63 let original_fidelity = optimizer.estimate_fidelity(circuit);
64 println!("\nOriginal circuit fidelity: {:.4}", original_fidelity);
65
66 let optimized = optimizer.optimize(circuit)?;
67 let optimized_fidelity = optimizer.estimate_fidelity(&optimized);
68 println!("Optimized circuit fidelity: {:.4}", optimized_fidelity);
69
70 if optimized_fidelity > original_fidelity {
71 println!(
72 "✓ Fidelity improved by {:.4}",
73 optimized_fidelity - original_fidelity
74 );
75 } else {
76 println!("→ No fidelity improvement (circuit already optimal)");
77 }
78
79 println!();
80 Ok(())
81}
82
83fn demo_ibm_noise(circuit: &Circuit<4>) -> quantrs2_core::error::QuantRS2Result<()> {
84 println!("--- IBM-like Noise Model ---");
85
86 let noise_model = NoiseModel::ibm_like(4);
87 let coupling_map = CouplingMap::linear(4);
88 let optimizer = NoiseAwareOptimizer::new(noise_model.clone()).with_coupling_map(coupling_map);
89
90 println!("IBM-like noise characteristics:");
91 println!(
92 " Single-qubit error rate: {:.2e}",
93 noise_model.single_qubit_error(0)
94 );
95 println!(
96 " Two-qubit error rate (adjacent): {:.2e}",
97 noise_model.two_qubit_error(0, 1)
98 );
99 println!(" Hadamard gate time: {:.1} ns", noise_model.gate_time("H"));
100 println!(" CNOT gate time: {:.1} ns", noise_model.gate_time("CNOT"));
101
102 let original_fidelity = optimizer.estimate_fidelity(circuit);
103 println!("\nOriginal circuit fidelity: {:.4}", original_fidelity);
104
105 let optimized = optimizer.optimize(circuit)?;
106 let optimized_fidelity = optimizer.estimate_fidelity(&optimized);
107 println!("Optimized circuit fidelity: {:.4}", optimized_fidelity);
108
109 println!("Available optimization passes:");
110 for pass in optimizer.get_passes() {
111 println!(" - {}", pass.name());
112 }
113
114 println!();
115 Ok(())
116}
Sourcepub fn two_qubit_error(&self, q1: usize, q2: usize) -> f64
pub fn two_qubit_error(&self, q1: usize, q2: usize) -> f64
Get error rate for a two-qubit gate
Examples found in repository?
examples/noise_optimization_demo.rs (line 57)
44fn demo_uniform_noise(circuit: &Circuit<4>) -> quantrs2_core::error::QuantRS2Result<()> {
45 println!("--- Uniform Noise Model ---");
46
47 let noise_model = NoiseModel::uniform(4);
48 let optimizer = NoiseAwareOptimizer::new(noise_model.clone());
49
50 println!("Noise characteristics:");
51 println!(
52 " Single-qubit error rate: {:.2e}",
53 noise_model.single_qubit_error(0)
54 );
55 println!(
56 " Two-qubit error rate: {:.2e}",
57 noise_model.two_qubit_error(0, 1)
58 );
59 println!(" T1 time: {:.1} μs", noise_model.t1_time(0));
60 println!(" T2 time: {:.1} μs", noise_model.t2_time(0));
61 println!(" CNOT gate time: {:.1} ns", noise_model.gate_time("CNOT"));
62
63 let original_fidelity = optimizer.estimate_fidelity(circuit);
64 println!("\nOriginal circuit fidelity: {:.4}", original_fidelity);
65
66 let optimized = optimizer.optimize(circuit)?;
67 let optimized_fidelity = optimizer.estimate_fidelity(&optimized);
68 println!("Optimized circuit fidelity: {:.4}", optimized_fidelity);
69
70 if optimized_fidelity > original_fidelity {
71 println!(
72 "✓ Fidelity improved by {:.4}",
73 optimized_fidelity - original_fidelity
74 );
75 } else {
76 println!("→ No fidelity improvement (circuit already optimal)");
77 }
78
79 println!();
80 Ok(())
81}
82
83fn demo_ibm_noise(circuit: &Circuit<4>) -> quantrs2_core::error::QuantRS2Result<()> {
84 println!("--- IBM-like Noise Model ---");
85
86 let noise_model = NoiseModel::ibm_like(4);
87 let coupling_map = CouplingMap::linear(4);
88 let optimizer = NoiseAwareOptimizer::new(noise_model.clone()).with_coupling_map(coupling_map);
89
90 println!("IBM-like noise characteristics:");
91 println!(
92 " Single-qubit error rate: {:.2e}",
93 noise_model.single_qubit_error(0)
94 );
95 println!(
96 " Two-qubit error rate (adjacent): {:.2e}",
97 noise_model.two_qubit_error(0, 1)
98 );
99 println!(" Hadamard gate time: {:.1} ns", noise_model.gate_time("H"));
100 println!(" CNOT gate time: {:.1} ns", noise_model.gate_time("CNOT"));
101
102 let original_fidelity = optimizer.estimate_fidelity(circuit);
103 println!("\nOriginal circuit fidelity: {:.4}", original_fidelity);
104
105 let optimized = optimizer.optimize(circuit)?;
106 let optimized_fidelity = optimizer.estimate_fidelity(&optimized);
107 println!("Optimized circuit fidelity: {:.4}", optimized_fidelity);
108
109 println!("Available optimization passes:");
110 for pass in optimizer.get_passes() {
111 println!(" - {}", pass.name());
112 }
113
114 println!();
115 Ok(())
116}
Sourcepub fn t1_time(&self, qubit: usize) -> f64
pub fn t1_time(&self, qubit: usize) -> f64
Get T1 time for a qubit
Examples found in repository?
examples/noise_optimization_demo.rs (line 59)
44fn demo_uniform_noise(circuit: &Circuit<4>) -> quantrs2_core::error::QuantRS2Result<()> {
45 println!("--- Uniform Noise Model ---");
46
47 let noise_model = NoiseModel::uniform(4);
48 let optimizer = NoiseAwareOptimizer::new(noise_model.clone());
49
50 println!("Noise characteristics:");
51 println!(
52 " Single-qubit error rate: {:.2e}",
53 noise_model.single_qubit_error(0)
54 );
55 println!(
56 " Two-qubit error rate: {:.2e}",
57 noise_model.two_qubit_error(0, 1)
58 );
59 println!(" T1 time: {:.1} μs", noise_model.t1_time(0));
60 println!(" T2 time: {:.1} μs", noise_model.t2_time(0));
61 println!(" CNOT gate time: {:.1} ns", noise_model.gate_time("CNOT"));
62
63 let original_fidelity = optimizer.estimate_fidelity(circuit);
64 println!("\nOriginal circuit fidelity: {:.4}", original_fidelity);
65
66 let optimized = optimizer.optimize(circuit)?;
67 let optimized_fidelity = optimizer.estimate_fidelity(&optimized);
68 println!("Optimized circuit fidelity: {:.4}", optimized_fidelity);
69
70 if optimized_fidelity > original_fidelity {
71 println!(
72 "✓ Fidelity improved by {:.4}",
73 optimized_fidelity - original_fidelity
74 );
75 } else {
76 println!("→ No fidelity improvement (circuit already optimal)");
77 }
78
79 println!();
80 Ok(())
81}
Sourcepub fn t2_time(&self, qubit: usize) -> f64
pub fn t2_time(&self, qubit: usize) -> f64
Get T2 time for a qubit
Examples found in repository?
examples/noise_optimization_demo.rs (line 60)
44fn demo_uniform_noise(circuit: &Circuit<4>) -> quantrs2_core::error::QuantRS2Result<()> {
45 println!("--- Uniform Noise Model ---");
46
47 let noise_model = NoiseModel::uniform(4);
48 let optimizer = NoiseAwareOptimizer::new(noise_model.clone());
49
50 println!("Noise characteristics:");
51 println!(
52 " Single-qubit error rate: {:.2e}",
53 noise_model.single_qubit_error(0)
54 );
55 println!(
56 " Two-qubit error rate: {:.2e}",
57 noise_model.two_qubit_error(0, 1)
58 );
59 println!(" T1 time: {:.1} μs", noise_model.t1_time(0));
60 println!(" T2 time: {:.1} μs", noise_model.t2_time(0));
61 println!(" CNOT gate time: {:.1} ns", noise_model.gate_time("CNOT"));
62
63 let original_fidelity = optimizer.estimate_fidelity(circuit);
64 println!("\nOriginal circuit fidelity: {:.4}", original_fidelity);
65
66 let optimized = optimizer.optimize(circuit)?;
67 let optimized_fidelity = optimizer.estimate_fidelity(&optimized);
68 println!("Optimized circuit fidelity: {:.4}", optimized_fidelity);
69
70 if optimized_fidelity > original_fidelity {
71 println!(
72 "✓ Fidelity improved by {:.4}",
73 optimized_fidelity - original_fidelity
74 );
75 } else {
76 println!("→ No fidelity improvement (circuit already optimal)");
77 }
78
79 println!();
80 Ok(())
81}
Sourcepub fn gate_time(&self, gate_name: &str) -> f64
pub fn gate_time(&self, gate_name: &str) -> f64
Get gate execution time
Examples found in repository?
examples/noise_optimization_demo.rs (line 61)
44fn demo_uniform_noise(circuit: &Circuit<4>) -> quantrs2_core::error::QuantRS2Result<()> {
45 println!("--- Uniform Noise Model ---");
46
47 let noise_model = NoiseModel::uniform(4);
48 let optimizer = NoiseAwareOptimizer::new(noise_model.clone());
49
50 println!("Noise characteristics:");
51 println!(
52 " Single-qubit error rate: {:.2e}",
53 noise_model.single_qubit_error(0)
54 );
55 println!(
56 " Two-qubit error rate: {:.2e}",
57 noise_model.two_qubit_error(0, 1)
58 );
59 println!(" T1 time: {:.1} μs", noise_model.t1_time(0));
60 println!(" T2 time: {:.1} μs", noise_model.t2_time(0));
61 println!(" CNOT gate time: {:.1} ns", noise_model.gate_time("CNOT"));
62
63 let original_fidelity = optimizer.estimate_fidelity(circuit);
64 println!("\nOriginal circuit fidelity: {:.4}", original_fidelity);
65
66 let optimized = optimizer.optimize(circuit)?;
67 let optimized_fidelity = optimizer.estimate_fidelity(&optimized);
68 println!("Optimized circuit fidelity: {:.4}", optimized_fidelity);
69
70 if optimized_fidelity > original_fidelity {
71 println!(
72 "✓ Fidelity improved by {:.4}",
73 optimized_fidelity - original_fidelity
74 );
75 } else {
76 println!("→ No fidelity improvement (circuit already optimal)");
77 }
78
79 println!();
80 Ok(())
81}
82
83fn demo_ibm_noise(circuit: &Circuit<4>) -> quantrs2_core::error::QuantRS2Result<()> {
84 println!("--- IBM-like Noise Model ---");
85
86 let noise_model = NoiseModel::ibm_like(4);
87 let coupling_map = CouplingMap::linear(4);
88 let optimizer = NoiseAwareOptimizer::new(noise_model.clone()).with_coupling_map(coupling_map);
89
90 println!("IBM-like noise characteristics:");
91 println!(
92 " Single-qubit error rate: {:.2e}",
93 noise_model.single_qubit_error(0)
94 );
95 println!(
96 " Two-qubit error rate (adjacent): {:.2e}",
97 noise_model.two_qubit_error(0, 1)
98 );
99 println!(" Hadamard gate time: {:.1} ns", noise_model.gate_time("H"));
100 println!(" CNOT gate time: {:.1} ns", noise_model.gate_time("CNOT"));
101
102 let original_fidelity = optimizer.estimate_fidelity(circuit);
103 println!("\nOriginal circuit fidelity: {:.4}", original_fidelity);
104
105 let optimized = optimizer.optimize(circuit)?;
106 let optimized_fidelity = optimizer.estimate_fidelity(&optimized);
107 println!("Optimized circuit fidelity: {:.4}", optimized_fidelity);
108
109 println!("Available optimization passes:");
110 for pass in optimizer.get_passes() {
111 println!(" - {}", pass.name());
112 }
113
114 println!();
115 Ok(())
116}
Sourcepub fn gate_error_probability(&self, gate: &dyn GateOp) -> f64
pub fn gate_error_probability(&self, gate: &dyn GateOp) -> f64
Calculate error probability for a gate
Trait Implementations§
Source§impl Clone for NoiseModel
impl Clone for NoiseModel
Source§fn clone(&self) -> NoiseModel
fn clone(&self) -> NoiseModel
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source
. Read moreSource§impl Debug for NoiseModel
impl Debug for NoiseModel
Source§impl Default for NoiseModel
impl Default for NoiseModel
Source§impl<'de> Deserialize<'de> for NoiseModel
impl<'de> Deserialize<'de> for NoiseModel
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
Auto Trait Implementations§
impl Freeze for NoiseModel
impl RefUnwindSafe for NoiseModel
impl Send for NoiseModel
impl Sync for NoiseModel
impl Unpin for NoiseModel
impl UnwindSafe for NoiseModel
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
The inverse inclusion map: attempts to construct
self
from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
Checks if
self
is actually part of its subset T
(and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
Use with care! Same as
self.to_subset
but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
The inclusion map: converts
self
to the equivalent element of its superset.