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