1use crate::{
31 error::{QuantRS2Error, QuantRS2Result},
32 noise_characterization::{
33 CrossEntropyBenchmarking, DDSequenceType, DynamicalDecoupling, ExtrapolationMethod,
34 NoiseModel, ProbabilisticErrorCancellation, RandomizedBenchmarking, ZeroNoiseExtrapolation,
35 },
36 qaoa::{CostHamiltonian, MixerHamiltonian, QAOACircuit, QAOAParams},
37 quantum_benchmarking::{
38 BenchmarkConfig, BenchmarkResult, ComparativeBenchmark, QuantumBenchmarkSuite,
39 ResourceUsage,
40 },
41 quantum_volume_tomography::{GateSetTomography, QuantumProcessTomography, QuantumVolume},
42};
43use scirs2_core::random::prelude::*;
44use scirs2_core::Complex64;
45use std::collections::HashMap;
46use std::time::{Duration, Instant};
47
48pub struct ComprehensiveBenchmarkSuite {
50 pub noise_model: NoiseModel,
52 pub config: BenchmarkConfig,
54 pub auto_mitigation: bool,
56 pub assess_qv: bool,
58 pub enable_tomography: bool,
60}
61
62impl Default for ComprehensiveBenchmarkSuite {
63 fn default() -> Self {
64 Self::new()
65 }
66}
67
68impl ComprehensiveBenchmarkSuite {
69 pub fn new() -> Self {
71 Self {
72 noise_model: NoiseModel::default(),
73 config: BenchmarkConfig::default(),
74 auto_mitigation: true,
75 assess_qv: false,
76 enable_tomography: false,
77 }
78 }
79
80 pub fn with_noise_model(noise_model: NoiseModel) -> Self {
82 Self {
83 noise_model,
84 config: BenchmarkConfig::default(),
85 auto_mitigation: true,
86 assess_qv: false,
87 enable_tomography: false,
88 }
89 }
90
91 pub const fn enable_all_features(&mut self) {
93 self.auto_mitigation = true;
94 self.assess_qv = true;
95 self.enable_tomography = true;
96 }
97
98 pub fn benchmark_qaoa_comprehensive(
100 &self,
101 num_qubits: usize,
102 edges: Vec<(usize, usize)>,
103 num_layers: usize,
104 ) -> QuantRS2Result<ComprehensiveBenchmarkReport> {
105 let start_time = Instant::now();
106
107 let noise_analysis = self.characterize_noise(num_qubits)?;
109
110 let mitigation_strategy = self.select_mitigation_strategy(&noise_analysis)?;
112
113 let qaoa_results =
115 self.run_qaoa_with_mitigation(num_qubits, edges, num_layers, &mitigation_strategy)?;
116
117 let qv_result = if self.assess_qv {
119 Some(self.assess_quantum_volume(num_qubits)?)
120 } else {
121 None
122 };
123
124 let tomography_result = if self.enable_tomography {
126 Some(self.perform_process_tomography(num_qubits)?)
127 } else {
128 None
129 };
130
131 let total_time = start_time.elapsed();
132
133 let recommendations = self.generate_recommendations(&noise_analysis, &qaoa_results);
134
135 Ok(ComprehensiveBenchmarkReport {
136 algorithm_name: format!("QAOA MaxCut ({num_qubits} qubits, {num_layers} layers)"),
137 noise_analysis,
138 mitigation_strategy,
139 qaoa_results,
140 quantum_volume: qv_result,
141 tomography_fidelity: tomography_result,
142 total_execution_time: total_time,
143 recommendations,
144 })
145 }
146
147 fn characterize_noise(&self, num_qubits: usize) -> QuantRS2Result<NoiseAnalysis> {
149 let avg_gate_fidelity = self.noise_model.single_qubit_fidelity();
152
153 Ok(NoiseAnalysis {
154 avg_gate_fidelity,
155 single_qubit_error: 1.0 - self.noise_model.single_qubit_fidelity(),
156 two_qubit_error: 1.0 - self.noise_model.two_qubit_fidelity(),
157 coherence_time: self.noise_model.t2_dephasing,
158 readout_error: self.noise_model.readout_error,
159 })
160 }
161
162 fn select_mitigation_strategy(
164 &self,
165 noise_analysis: &NoiseAnalysis,
166 ) -> QuantRS2Result<MitigationStrategy> {
167 if noise_analysis.avg_gate_fidelity > 0.99 {
169 Ok(MitigationStrategy::None)
171 } else if noise_analysis.avg_gate_fidelity > 0.95 {
172 Ok(MitigationStrategy::ZeroNoiseExtrapolation {
174 method: ExtrapolationMethod::Linear,
175 scaling_factors: vec![1.0, 2.0, 3.0],
176 })
177 } else if noise_analysis.coherence_time < 50.0 {
178 Ok(MitigationStrategy::DynamicalDecoupling {
180 sequence_type: DDSequenceType::CPMG,
181 num_pulses: 10,
182 })
183 } else {
184 Ok(MitigationStrategy::ProbabilisticErrorCancellation { num_samples: 1000 })
186 }
187 }
188
189 fn run_qaoa_with_mitigation(
191 &self,
192 num_qubits: usize,
193 edges: Vec<(usize, usize)>,
194 num_layers: usize,
195 strategy: &MitigationStrategy,
196 ) -> QuantRS2Result<QAOABenchmarkResults> {
197 let cost_hamiltonian = CostHamiltonian::MaxCut(edges);
198 let mixer_hamiltonian = MixerHamiltonian::TransverseField;
199 let params = QAOAParams::random(num_layers);
200
201 let circuit = QAOACircuit::new(
202 num_qubits,
203 cost_hamiltonian,
204 mixer_hamiltonian,
205 params.clone(),
206 );
207
208 let noisy_expectation = self.execute_qaoa(&circuit)?;
210 let mitigated_expectation = match strategy {
211 MitigationStrategy::None => noisy_expectation,
212 MitigationStrategy::ZeroNoiseExtrapolation { .. } => {
213 self.apply_zne_mitigation(&circuit)?
214 }
215 MitigationStrategy::DynamicalDecoupling { .. } => self.apply_dd_mitigation(&circuit)?,
216 MitigationStrategy::ProbabilisticErrorCancellation { .. } => {
217 self.apply_pec_mitigation(&circuit)?
218 }
219 };
220
221 let improvement_factor = if noisy_expectation == 0.0 {
222 1.0
223 } else {
224 mitigated_expectation / noisy_expectation
225 };
226
227 Ok(QAOABenchmarkResults {
228 noisy_expectation,
229 mitigated_expectation,
230 improvement_factor,
231 num_parameters: params.layers * 2,
232 circuit_depth: num_layers * 2,
233 })
234 }
235
236 fn execute_qaoa(&self, circuit: &QAOACircuit) -> QuantRS2Result<f64> {
238 let state_size = 1 << circuit.num_qubits;
239 let mut state = vec![Complex64::new(0.0, 0.0); state_size];
240
241 circuit.execute(&mut state);
242
243 for amplitude in &mut state {
245 let noise_factor = self.noise_model.single_qubit_fidelity();
246 *amplitude *= Complex64::new(noise_factor.sqrt(), 0.0);
247 }
248
249 Ok(circuit.compute_expectation(&state))
250 }
251
252 fn apply_zne_mitigation(&self, circuit: &QAOACircuit) -> QuantRS2Result<f64> {
254 let zne = ZeroNoiseExtrapolation::new(vec![1.0, 2.0, 3.0], ExtrapolationMethod::Linear);
255
256 zne.mitigate(|scale| {
257 let state_size = 1 << circuit.num_qubits;
258 let mut state = vec![Complex64::new(0.0, 0.0); state_size];
259
260 circuit.execute(&mut state);
261
262 for amplitude in &mut state {
264 let noise_factor = self.noise_model.single_qubit_fidelity().powf(scale);
265 *amplitude *= Complex64::new(noise_factor.sqrt(), 0.0);
266 }
267
268 circuit.compute_expectation(&state)
269 })
270 }
271
272 fn apply_dd_mitigation(&self, circuit: &QAOACircuit) -> QuantRS2Result<f64> {
274 let state_size = 1 << circuit.num_qubits;
276 let mut state = vec![Complex64::new(0.0, 0.0); state_size];
277
278 circuit.execute(&mut state);
279
280 let dd = DynamicalDecoupling::new(DDSequenceType::CPMG, 10);
282 let improvement = dd.coherence_improvement_factor(
283 self.noise_model.t2_dephasing,
284 self.noise_model.gate_duration,
285 );
286
287 for amplitude in &mut state {
289 let improved_fidelity =
290 1.0 - (1.0 - self.noise_model.single_qubit_fidelity()) / improvement;
291 *amplitude *= Complex64::new(improved_fidelity.sqrt(), 0.0);
292 }
293
294 Ok(circuit.compute_expectation(&state))
295 }
296
297 fn apply_pec_mitigation(&self, _circuit: &QAOACircuit) -> QuantRS2Result<f64> {
299 let pec = ProbabilisticErrorCancellation::new(self.noise_model.clone(), 1000);
301 pec.mitigate(|_gates| {
302 0.5
304 })
305 }
306
307 fn assess_quantum_volume(&self, max_qubits: usize) -> QuantRS2Result<usize> {
309 let mut qv = QuantumVolume::new(max_qubits, 50, 500);
310
311 let circuit_executor = |_gates: &[Box<dyn crate::gate::GateOp>], num_shots: usize| {
312 let mut rng = thread_rng();
313 let max_value = 1 << max_qubits;
314 (0..num_shots)
315 .map(|_| (rng.gen::<u64>() as usize) % max_value)
316 .collect()
317 };
318
319 let result = qv.run(circuit_executor)?;
320 Ok(result.quantum_volume)
321 }
322
323 fn perform_process_tomography(&self, num_qubits: usize) -> QuantRS2Result<f64> {
325 let qpt = QuantumProcessTomography::new(num_qubits);
326
327 let process = |_prep: &str, _meas: &str| {
329 let fidelity = self.noise_model.single_qubit_fidelity();
330 Complex64::new(fidelity, 0.0)
331 };
332
333 let result = qpt.run(process)?;
334
335 let trace: Complex64 = result.chi_matrix.diag().iter().sum();
337 Ok(trace.norm() / (1 << num_qubits) as f64)
338 }
339
340 fn generate_recommendations(
342 &self,
343 noise_analysis: &NoiseAnalysis,
344 qaoa_results: &QAOABenchmarkResults,
345 ) -> Vec<String> {
346 let mut recommendations = Vec::new();
347
348 if noise_analysis.avg_gate_fidelity < 0.95 {
349 recommendations.push(
350 "Gate fidelity below 95% - consider recalibration or error mitigation".to_string(),
351 );
352 }
353
354 if noise_analysis.coherence_time < 50.0 {
355 recommendations
356 .push("Low coherence time - implement dynamical decoupling sequences".to_string());
357 }
358
359 if qaoa_results.improvement_factor > 1.5 {
360 recommendations.push(format!(
361 "Error mitigation highly effective ({:.2}x improvement) - continue using",
362 qaoa_results.improvement_factor
363 ));
364 }
365
366 if noise_analysis.readout_error > 0.05 {
367 recommendations.push(
368 "High readout error - consider readout error mitigation techniques".to_string(),
369 );
370 }
371
372 if recommendations.is_empty() {
373 recommendations.push("System performing well - no immediate action needed".to_string());
374 }
375
376 recommendations
377 }
378}
379
380#[derive(Debug, Clone)]
382pub struct NoiseAnalysis {
383 pub avg_gate_fidelity: f64,
384 pub single_qubit_error: f64,
385 pub two_qubit_error: f64,
386 pub coherence_time: f64,
387 pub readout_error: f64,
388}
389
390#[derive(Debug, Clone)]
392pub enum MitigationStrategy {
393 None,
394 ZeroNoiseExtrapolation {
395 method: ExtrapolationMethod,
396 scaling_factors: Vec<f64>,
397 },
398 DynamicalDecoupling {
399 sequence_type: DDSequenceType,
400 num_pulses: usize,
401 },
402 ProbabilisticErrorCancellation {
403 num_samples: usize,
404 },
405}
406
407#[derive(Debug, Clone)]
409pub struct QAOABenchmarkResults {
410 pub noisy_expectation: f64,
411 pub mitigated_expectation: f64,
412 pub improvement_factor: f64,
413 pub num_parameters: usize,
414 pub circuit_depth: usize,
415}
416
417#[derive(Debug, Clone)]
419pub struct ComprehensiveBenchmarkReport {
420 pub algorithm_name: String,
421 pub noise_analysis: NoiseAnalysis,
422 pub mitigation_strategy: MitigationStrategy,
423 pub qaoa_results: QAOABenchmarkResults,
424 pub quantum_volume: Option<usize>,
425 pub tomography_fidelity: Option<f64>,
426 pub total_execution_time: Duration,
427 pub recommendations: Vec<String>,
428}
429
430impl ComprehensiveBenchmarkReport {
431 pub fn print_detailed_report(&self) {
433 println!("╔════════════════════════════════════════════════════════════════╗");
434 println!("║ Comprehensive Quantum Benchmark Report ║");
435 println!("╠════════════════════════════════════════════════════════════════╣");
436 println!("║ Algorithm: {:<52} ║", self.algorithm_name);
437 println!("║ ║");
438 println!("║ NOISE CHARACTERIZATION ║");
439 println!(
440 "║ Average Gate Fidelity: {:>6.4} ({:.2}%) ║",
441 self.noise_analysis.avg_gate_fidelity,
442 self.noise_analysis.avg_gate_fidelity * 100.0
443 );
444 println!(
445 "║ Single-Qubit Error Rate: {:>6.4} ({:.3}%) ║",
446 self.noise_analysis.single_qubit_error,
447 self.noise_analysis.single_qubit_error * 100.0
448 );
449 println!(
450 "║ Two-Qubit Error Rate: {:>6.4} ({:.2}%) ║",
451 self.noise_analysis.two_qubit_error,
452 self.noise_analysis.two_qubit_error * 100.0
453 );
454 println!(
455 "║ Coherence Time (T2): {:>6.2} μs ║",
456 self.noise_analysis.coherence_time
457 );
458 println!(
459 "║ Readout Error: {:>6.4} ({:.2}%) ║",
460 self.noise_analysis.readout_error,
461 self.noise_analysis.readout_error * 100.0
462 );
463 println!("║ ║");
464 println!("║ ERROR MITIGATION ║");
465 println!(
466 "║ Strategy: {:<51} ║",
467 format!("{:?}", self.mitigation_strategy)
468 .chars()
469 .take(51)
470 .collect::<String>()
471 );
472 println!("║ ║");
473 println!("║ QAOA PERFORMANCE ║");
474 println!(
475 "║ Noisy Expectation: {:>8.4} ║",
476 self.qaoa_results.noisy_expectation
477 );
478 println!(
479 "║ Mitigated Expectation: {:>8.4} ║",
480 self.qaoa_results.mitigated_expectation
481 );
482 println!(
483 "║ Improvement Factor: {:>6.2}x ║",
484 self.qaoa_results.improvement_factor
485 );
486 println!(
487 "║ Circuit Depth: {:>4} ║",
488 self.qaoa_results.circuit_depth
489 );
490 println!(
491 "║ Parameters: {:>4} ║",
492 self.qaoa_results.num_parameters
493 );
494
495 if let Some(qv) = self.quantum_volume {
496 println!("║ ║");
497 println!("║ Quantum Volume: {qv:>4} ║");
498 }
499
500 if let Some(fidelity) = self.tomography_fidelity {
501 println!(
502 "║ Tomography Fidelity: {:>6.4} ({:.2}%) ║",
503 fidelity,
504 fidelity * 100.0
505 );
506 }
507
508 println!("║ ║");
509 println!(
510 "║ Total Execution Time: {:?} ║",
511 self.total_execution_time
512 );
513 println!("║ ║");
514 println!("║ RECOMMENDATIONS ║");
515 for (i, rec) in self.recommendations.iter().enumerate() {
516 let lines = self.wrap_text(rec, 60);
517 for (j, line) in lines.iter().enumerate() {
518 if j == 0 {
519 println!("║ {}. {:<60} ║", i + 1, line);
520 } else {
521 println!("║ {line:<60} ║");
522 }
523 }
524 }
525 println!("╚════════════════════════════════════════════════════════════════╝");
526 }
527
528 fn wrap_text(&self, text: &str, width: usize) -> Vec<String> {
530 let words: Vec<&str> = text.split_whitespace().collect();
531 let mut lines = Vec::new();
532 let mut current_line = String::new();
533
534 for word in words {
535 if current_line.len() + word.len() < width {
536 if !current_line.is_empty() {
537 current_line.push(' ');
538 }
539 current_line.push_str(word);
540 } else {
541 if !current_line.is_empty() {
542 lines.push(current_line.clone());
543 }
544 current_line = word.to_string();
545 }
546 }
547
548 if !current_line.is_empty() {
549 lines.push(current_line);
550 }
551
552 lines
553 }
554
555 pub fn to_json(&self) -> String {
557 format!(
559 r#"{{
560 "algorithm": "{}",
561 "noise_analysis": {{
562 "avg_gate_fidelity": {},
563 "single_qubit_error": {},
564 "two_qubit_error": {},
565 "coherence_time": {},
566 "readout_error": {}
567 }},
568 "qaoa_results": {{
569 "noisy_expectation": {},
570 "mitigated_expectation": {},
571 "improvement_factor": {},
572 "circuit_depth": {},
573 "num_parameters": {}
574 }},
575 "quantum_volume": {},
576 "tomography_fidelity": {},
577 "execution_time_ms": {},
578 "recommendations": {:?}
579}}"#,
580 self.algorithm_name,
581 self.noise_analysis.avg_gate_fidelity,
582 self.noise_analysis.single_qubit_error,
583 self.noise_analysis.two_qubit_error,
584 self.noise_analysis.coherence_time,
585 self.noise_analysis.readout_error,
586 self.qaoa_results.noisy_expectation,
587 self.qaoa_results.mitigated_expectation,
588 self.qaoa_results.improvement_factor,
589 self.qaoa_results.circuit_depth,
590 self.qaoa_results.num_parameters,
591 self.quantum_volume.unwrap_or(0),
592 self.tomography_fidelity.unwrap_or(0.0),
593 self.total_execution_time.as_millis(),
594 self.recommendations
595 )
596 }
597}
598
599#[cfg(test)]
600mod tests {
601 use super::*;
602
603 #[test]
604 fn test_comprehensive_suite_creation() {
605 let suite = ComprehensiveBenchmarkSuite::new();
606 assert!(suite.auto_mitigation);
607 assert!(!suite.assess_qv);
608 assert!(!suite.enable_tomography);
609 }
610
611 #[test]
612 fn test_mitigation_strategy_selection() {
613 let suite = ComprehensiveBenchmarkSuite::new();
614
615 let high_fidelity_analysis = NoiseAnalysis {
617 avg_gate_fidelity: 0.995,
618 single_qubit_error: 0.005,
619 two_qubit_error: 0.01,
620 coherence_time: 100.0,
621 readout_error: 0.01,
622 };
623
624 let strategy = suite
625 .select_mitigation_strategy(&high_fidelity_analysis)
626 .expect("strategy selection for high fidelity should succeed");
627 assert!(matches!(strategy, MitigationStrategy::None));
628
629 let moderate_noise_analysis = NoiseAnalysis {
631 avg_gate_fidelity: 0.96,
632 single_qubit_error: 0.04,
633 two_qubit_error: 0.08,
634 coherence_time: 80.0,
635 readout_error: 0.02,
636 };
637
638 let strategy = suite
639 .select_mitigation_strategy(&moderate_noise_analysis)
640 .expect("strategy selection for moderate noise should succeed");
641 assert!(matches!(
642 strategy,
643 MitigationStrategy::ZeroNoiseExtrapolation { .. }
644 ));
645
646 let low_coherence_analysis = NoiseAnalysis {
648 avg_gate_fidelity: 0.90,
649 single_qubit_error: 0.10,
650 two_qubit_error: 0.20,
651 coherence_time: 30.0,
652 readout_error: 0.03,
653 };
654
655 let strategy = suite
656 .select_mitigation_strategy(&low_coherence_analysis)
657 .expect("strategy selection for low coherence should succeed");
658 assert!(matches!(
659 strategy,
660 MitigationStrategy::DynamicalDecoupling { .. }
661 ));
662 }
663
664 #[test]
665 fn test_qaoa_comprehensive_benchmark() {
666 let suite = ComprehensiveBenchmarkSuite::new();
667
668 let edges = vec![(0, 1), (1, 2)];
670 let result = suite
671 .benchmark_qaoa_comprehensive(3, edges, 1)
672 .expect("QAOA comprehensive benchmark should succeed");
673
674 assert_eq!(result.algorithm_name, "QAOA MaxCut (3 qubits, 1 layers)");
675 assert!(result.noise_analysis.avg_gate_fidelity > 0.0);
676 assert!(result.qaoa_results.improvement_factor >= 1.0);
677 assert!(!result.recommendations.is_empty());
678
679 println!("\n=== Comprehensive Benchmark Test ===");
680 result.print_detailed_report();
681 }
682
683 #[test]
684 fn test_report_json_export() {
685 let suite = ComprehensiveBenchmarkSuite::new();
686 let edges = vec![(0, 1)];
687 let result = suite
688 .benchmark_qaoa_comprehensive(2, edges, 1)
689 .expect("QAOA benchmark should succeed");
690
691 let json = result.to_json();
692 assert!(json.contains("\"algorithm\""));
693 assert!(json.contains("\"noise_analysis\""));
694 assert!(json.contains("\"qaoa_results\""));
695
696 println!("\n=== JSON Export ===");
697 println!("{}", json);
698 }
699
700 #[test]
701 fn test_all_features_enabled() {
702 let mut suite = ComprehensiveBenchmarkSuite::new();
703 suite.enable_all_features();
704
705 assert!(suite.auto_mitigation);
706 assert!(suite.assess_qv);
707 assert!(suite.enable_tomography);
708 }
709
710 #[test]
711 fn test_custom_noise_model() {
712 let noise_model = NoiseModel::new(
713 0.005, 0.02, 100.0, 150.0, 0.01, );
719
720 let suite = ComprehensiveBenchmarkSuite::with_noise_model(noise_model.clone());
721
722 assert!((suite.noise_model.single_qubit_depolarizing - 0.005).abs() < 1e-10);
723 assert!((suite.noise_model.two_qubit_depolarizing - 0.02).abs() < 1e-10);
724 assert!((suite.noise_model.t1_relaxation - 100.0).abs() < 1e-10);
725 assert!((suite.noise_model.t2_dephasing - 150.0).abs() < 1e-10);
726 }
727
728 #[test]
729 fn test_noise_analysis_calculations() {
730 let suite = ComprehensiveBenchmarkSuite::new();
731
732 let single_qubit_fidelity = suite.noise_model.single_qubit_fidelity();
734 assert!(single_qubit_fidelity > 0.95);
735 assert!(single_qubit_fidelity <= 1.0);
736
737 let two_qubit_fidelity = suite.noise_model.two_qubit_fidelity();
738 assert!(two_qubit_fidelity > 0.90);
739 assert!(two_qubit_fidelity <= 1.0);
740 }
741
742 #[test]
743 fn test_edge_case_empty_graph() {
744 let suite = ComprehensiveBenchmarkSuite::new();
745 let edges: Vec<(usize, usize)> = vec![];
746
747 let result = suite.benchmark_qaoa_comprehensive(2, edges, 1);
749 assert!(result.is_ok());
750 }
751
752 #[test]
753 fn test_edge_case_single_edge() {
754 let suite = ComprehensiveBenchmarkSuite::new();
755 let edges = vec![(0, 1)];
756
757 let result = suite
758 .benchmark_qaoa_comprehensive(2, edges, 1)
759 .expect("QAOA benchmark for single edge should succeed");
760 assert!(result.qaoa_results.circuit_depth > 0);
761 assert!(result.qaoa_results.num_parameters > 0);
762 }
763
764 #[test]
765 fn test_large_graph_performance() {
766 let suite = ComprehensiveBenchmarkSuite::new();
767
768 let edges = vec![
770 (0, 1),
771 (1, 2),
772 (2, 3),
773 (3, 4),
774 (4, 5),
775 (5, 0),
776 (0, 3),
777 (1, 4),
778 ];
779
780 let result = suite.benchmark_qaoa_comprehensive(6, edges, 2);
781 assert!(result.is_ok());
782
783 if let Ok(report) = result {
784 assert!(report.qaoa_results.circuit_depth > 0);
785 assert!(report.qaoa_results.num_parameters > 0);
786 assert!(!report.recommendations.is_empty());
787 }
788 }
789
790 #[test]
791 fn test_mitigation_effectiveness() {
792 let mut suite = ComprehensiveBenchmarkSuite::new();
793 suite.auto_mitigation = true;
794
795 let edges = vec![(0, 1), (1, 2), (2, 0)]; let result = suite
798 .benchmark_qaoa_comprehensive(3, edges, 1)
799 .expect("QAOA benchmark with mitigation should succeed");
800
801 assert!(result.qaoa_results.improvement_factor >= 1.0); assert!(result.qaoa_results.mitigated_expectation != 0.0);
804 }
805
806 #[test]
807 fn test_high_noise_environment() {
808 let high_noise = NoiseModel::new(
809 0.05, 0.10, 20.0, 30.0, 0.05, );
815
816 let suite = ComprehensiveBenchmarkSuite::with_noise_model(high_noise);
817 let edges = vec![(0, 1), (1, 2)];
818
819 let result = suite
820 .benchmark_qaoa_comprehensive(3, edges, 1)
821 .expect("QAOA benchmark in high noise should succeed");
822
823 assert!(result
825 .recommendations
826 .iter()
827 .any(|r| r.to_lowercase().contains("error")
828 || r.to_lowercase().contains("mitigation")
829 || r.to_lowercase().contains("noise")));
830 }
831
832 #[test]
833 fn test_comparative_benchmarking() {
834 let low_noise = NoiseModel::new(0.001, 0.005, 100.0, 150.0, 0.01);
836 let suite_low = ComprehensiveBenchmarkSuite::with_noise_model(low_noise);
837
838 let high_noise = NoiseModel::new(0.01, 0.05, 50.0, 70.0, 0.03);
840 let suite_high = ComprehensiveBenchmarkSuite::with_noise_model(high_noise);
841
842 let edges = vec![(0, 1), (1, 2)];
843
844 let result_low = suite_low
845 .benchmark_qaoa_comprehensive(3, edges.clone(), 1)
846 .expect("QAOA benchmark with low noise should succeed");
847 let result_high = suite_high
848 .benchmark_qaoa_comprehensive(3, edges, 1)
849 .expect("QAOA benchmark with high noise should succeed");
850
851 assert!(
853 result_low.noise_analysis.avg_gate_fidelity
854 > result_high.noise_analysis.avg_gate_fidelity
855 );
856 }
857
858 #[test]
859 fn test_benchmark_report_formatting() {
860 let suite = ComprehensiveBenchmarkSuite::new();
861 let edges = vec![(0, 1)];
862 let result = suite
863 .benchmark_qaoa_comprehensive(2, edges, 1)
864 .expect("QAOA benchmark should succeed");
865
866 result.print_detailed_report();
868
869 let json = result.to_json();
871 assert!(json.starts_with('{'));
872 assert!(json.ends_with('}'));
873 }
874
875 #[test]
876 fn test_multiple_qaoa_layers() {
877 let suite = ComprehensiveBenchmarkSuite::new();
878 let edges = vec![(0, 1), (1, 2), (2, 3), (3, 0)]; for layers in 1..=3 {
882 let result = suite
883 .benchmark_qaoa_comprehensive(4, edges.clone(), layers)
884 .expect("QAOA benchmark with multiple layers should succeed");
885 assert!(result.qaoa_results.circuit_depth > 0);
887 assert!(result.qaoa_results.num_parameters > 0);
888 assert_eq!(result.qaoa_results.num_parameters, layers * 2);
890 }
891 }
892
893 #[test]
894 fn test_noise_model_defaults() {
895 let default_model = NoiseModel::default();
896
897 assert!(default_model.single_qubit_depolarizing < 0.01);
899 assert!(default_model.two_qubit_depolarizing < 0.02);
900 assert!(default_model.t1_relaxation > 30.0);
901 assert!(default_model.t2_dephasing > default_model.t1_relaxation);
902 assert!(default_model.readout_error < 0.05);
903 }
904}