Skip to main content

quantrs2_sim/quantum_algorithms/
functions.rs

1//! Auto-generated module
2//!
3//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
4
5use crate::error::{Result, SimulatorError};
6use crate::statevector::StateVectorSimulator;
7use scirs2_core::ndarray::{Array1, Array2};
8use scirs2_core::Complex64;
9use std::collections::HashMap;
10
11use super::types::{
12    AlgorithmResourceStats, EnhancedPhaseEstimation, OptimizationLevel, OptimizedGroverAlgorithm,
13    OptimizedShorAlgorithm, QuantumAlgorithmConfig,
14};
15
16/// Benchmark quantum algorithms
17pub fn benchmark_quantum_algorithms() -> Result<HashMap<String, f64>> {
18    let mut results = HashMap::new();
19    let shor_start = std::time::Instant::now();
20    let config = QuantumAlgorithmConfig::default();
21    let mut shor = OptimizedShorAlgorithm::new(config)?;
22    let _shor_result = shor.factor(15)?;
23    results.insert(
24        "shor_15".to_string(),
25        shor_start.elapsed().as_secs_f64() * 1000.0,
26    );
27    let grover_start = std::time::Instant::now();
28    let config = QuantumAlgorithmConfig::default();
29    let mut grover = OptimizedGroverAlgorithm::new(config)?;
30    let oracle = |x: usize| x == 5 || x == 10;
31    let _grover_result = grover.search(4, oracle, 2)?;
32    results.insert(
33        "grover_4qubits".to_string(),
34        grover_start.elapsed().as_secs_f64() * 1000.0,
35    );
36    let qpe_start = std::time::Instant::now();
37    let config = QuantumAlgorithmConfig::default();
38    let mut qpe = EnhancedPhaseEstimation::new(config)?;
39    let eigenstate = Array1::from_vec(vec![Complex64::new(1.0, 0.0), Complex64::new(0.0, 0.0)]);
40    let unitary = |sim: &mut StateVectorSimulator, target_qubit: usize| -> Result<()> {
41        sim.apply_z_public(target_qubit)?;
42        Ok(())
43    };
44    let _qpe_result = qpe.estimate_eigenvalues(unitary, &eigenstate, 1e-3)?;
45    results.insert(
46        "phase_estimation".to_string(),
47        qpe_start.elapsed().as_secs_f64() * 1000.0,
48    );
49    Ok(results)
50}
51#[cfg(test)]
52mod tests {
53    use super::*;
54
55    /// `dense_system_unitary` must recover the operator's actual matrix from the opaque
56    /// closure, since raising it to the `2^i` powers a phase estimation needs depends on
57    /// having the matrix rather than on re-applying the closure.
58    #[test]
59    fn dense_system_unitary_recovers_the_operator_matrix() {
60        let z_operator = |sim: &mut StateVectorSimulator, target: usize| -> Result<()> {
61            sim.apply_z_public(target)?;
62            Ok(())
63        };
64        let matrix = EnhancedPhaseEstimation::dense_system_unitary(&z_operator, 1)
65            .expect("dense unitary should be constructible");
66
67        assert_eq!(matrix.dim(), (2, 2));
68        let expected = [
69            ((0, 0), Complex64::new(1.0, 0.0)),
70            ((0, 1), Complex64::new(0.0, 0.0)),
71            ((1, 0), Complex64::new(0.0, 0.0)),
72            ((1, 1), Complex64::new(-1.0, 0.0)),
73        ];
74        for ((row, column), value) in expected {
75            assert!(
76                (matrix[[row, column]] - value).norm() < 1e-12,
77                "Z matrix entry ({row},{column}) was {}, expected {value}",
78                matrix[[row, column]]
79            );
80        }
81
82        // Z^2 = I, so squaring (the operation used to build U^(2^i)) must return identity.
83        let squared = matrix.dot(&matrix);
84        assert!((squared[[0, 0]] - Complex64::new(1.0, 0.0)).norm() < 1e-12);
85        assert!((squared[[1, 1]] - Complex64::new(1.0, 0.0)).norm() < 1e-12);
86    }
87
88    /// The controlled application must touch only the amplitudes whose control bit is set,
89    /// and must apply the operator to the low-order system register within each block.
90    #[test]
91    fn apply_controlled_system_unitary_respects_the_control_qubit() {
92        let z_operator = |sim: &mut StateVectorSimulator, target: usize| -> Result<()> {
93            sim.apply_z_public(target)?;
94            Ok(())
95        };
96        let z_matrix = EnhancedPhaseEstimation::dense_system_unitary(&z_operator, 1)
97            .expect("dense unitary should be constructible");
98
99        // Layout: system qubit is bit 0, control qubit is bit 1, so index = control<<1 | system.
100        // |control=1, system=1> must pick up Z's -1 phase.
101        let mut simulator = StateVectorSimulator::new();
102        simulator
103            .set_state(vec![
104                Complex64::new(0.0, 0.0),
105                Complex64::new(0.0, 0.0),
106                Complex64::new(0.0, 0.0),
107                Complex64::new(1.0, 0.0),
108            ])
109            .expect("state should be settable");
110        EnhancedPhaseEstimation::apply_controlled_system_unitary(&mut simulator, &z_matrix, 1, 1)
111            .expect("controlled application should succeed");
112        let state = simulator.get_state();
113        assert!((state[3] - Complex64::new(-1.0, 0.0)).norm() < 1e-12);
114
115        // |control=0, system=1> must be left untouched.
116        let mut simulator = StateVectorSimulator::new();
117        simulator
118            .set_state(vec![
119                Complex64::new(0.0, 0.0),
120                Complex64::new(1.0, 0.0),
121                Complex64::new(0.0, 0.0),
122                Complex64::new(0.0, 0.0),
123            ])
124            .expect("state should be settable");
125        EnhancedPhaseEstimation::apply_controlled_system_unitary(&mut simulator, &z_matrix, 1, 1)
126            .expect("controlled application should succeed");
127        let state = simulator.get_state();
128        assert!((state[1] - Complex64::new(1.0, 0.0)).norm() < 1e-12);
129    }
130
131    #[test]
132    fn test_shor_algorithm_creation() {
133        let config = QuantumAlgorithmConfig::default();
134        let shor = OptimizedShorAlgorithm::new(config);
135        assert!(shor.is_ok());
136    }
137    #[test]
138    fn test_shor_trivial_cases() {
139        let config = QuantumAlgorithmConfig::default();
140        let mut shor =
141            OptimizedShorAlgorithm::new(config).expect("Shor algorithm creation should succeed");
142        let result = shor.factor(14).expect("Factoring 14 should succeed");
143        assert!(result.factors.contains(&2));
144        assert!(result.factors.contains(&7));
145    }
146    #[test]
147    fn test_grover_algorithm_creation() {
148        let config = QuantumAlgorithmConfig::default();
149        let grover = OptimizedGroverAlgorithm::new(config);
150        assert!(grover.is_ok());
151    }
152    #[test]
153    fn test_grover_optimal_iterations() {
154        let config = QuantumAlgorithmConfig::default();
155        let grover = OptimizedGroverAlgorithm::new(config)
156            .expect("Grover algorithm creation should succeed");
157        let num_items = 16;
158        let num_targets = 1;
159        let iterations = grover.calculate_optimal_iterations(num_items, num_targets);
160        assert!((3..=4).contains(&iterations));
161    }
162    #[test]
163    fn test_phase_estimation_creation() {
164        let config = QuantumAlgorithmConfig::default();
165        let qpe = EnhancedPhaseEstimation::new(config);
166        assert!(qpe.is_ok());
167    }
168    #[test]
169    fn test_continued_fractions() {
170        let config = QuantumAlgorithmConfig::default();
171        let _shor =
172            OptimizedShorAlgorithm::new(config).expect("Shor algorithm creation should succeed");
173        let convergents = OptimizedShorAlgorithm::continued_fractions(0.375, 100);
174        assert!(!convergents.is_empty());
175        assert!(convergents.iter().any(|&(num, den)| num == 3 && den == 8));
176    }
177    #[test]
178    fn test_modular_exponentiation() {
179        let config = QuantumAlgorithmConfig::default();
180        let _shor =
181            OptimizedShorAlgorithm::new(config).expect("Shor algorithm creation should succeed");
182        assert_eq!(OptimizedShorAlgorithm::mod_exp(2, 3, 5), 3);
183        assert_eq!(OptimizedShorAlgorithm::mod_exp(3, 4, 7), 4);
184    }
185    #[test]
186    fn test_phase_estimation_simple() {
187        let config = QuantumAlgorithmConfig::default();
188        let mut qpe =
189            EnhancedPhaseEstimation::new(config).expect("Phase estimation creation should succeed");
190        let eigenstate = Array1::from_vec(vec![Complex64::new(1.0, 0.0), Complex64::new(0.0, 0.0)]);
191        let z_unitary =
192            |sim: &mut StateVectorSimulator, _target_qubit: usize| -> Result<()> { Ok(()) };
193        let result = qpe.estimate_eigenvalues(z_unitary, &eigenstate, 1e-2);
194        assert!(result.is_ok());
195        let qpe_result = result.expect("Phase estimation should succeed");
196        assert!(!qpe_result.eigenvalues.is_empty());
197        assert_eq!(qpe_result.eigenvalues.len(), qpe_result.precisions.len());
198    }
199    #[test]
200    fn test_grover_search_functionality() {
201        let config = QuantumAlgorithmConfig::default();
202        let mut grover = OptimizedGroverAlgorithm::new(config)
203            .expect("Grover algorithm creation should succeed");
204        let oracle = |x: usize| x == 3;
205        let result = grover.search(3, oracle, 1);
206        if let Err(e) = &result {
207            eprintln!("Grover search failed: {e:?}");
208        }
209        assert!(result.is_ok());
210        let grover_result = result.expect("Grover search should succeed");
211        assert_eq!(grover_result.iterations, grover_result.optimal_iterations);
212        assert!(grover_result.success_probability >= 0.0);
213        assert!(grover_result.success_probability <= 1.0);
214    }
215    #[test]
216    fn test_shor_algorithm_classical_cases() {
217        let config = QuantumAlgorithmConfig::default();
218        let mut shor =
219            OptimizedShorAlgorithm::new(config).expect("Shor algorithm creation should succeed");
220        let result = shor.factor(10).expect("Factoring 10 should succeed");
221        assert!(!result.factors.is_empty());
222        assert!(result.factors.contains(&2) || result.factors.contains(&5));
223        let result = shor.factor(7).expect("Factoring 7 should succeed");
224        if !result.factors.is_empty() {
225            let product: u64 = result.factors.iter().product();
226            assert_eq!(product, 7);
227        }
228    }
229    #[test]
230    fn test_quantum_algorithm_benchmarks() {
231        let benchmarks = benchmark_quantum_algorithms();
232        assert!(benchmarks.is_ok());
233        let results = benchmarks.expect("Benchmarks should succeed");
234        assert!(results.contains_key("shor_15"));
235        assert!(results.contains_key("grover_4qubits"));
236        assert!(results.contains_key("phase_estimation"));
237        for (algorithm, time) in results {
238            assert!(
239                time >= 0.0,
240                "Algorithm {algorithm} had negative execution time"
241            );
242        }
243    }
244    #[test]
245    fn test_grover_optimal_iterations_calculation() {
246        let config = QuantumAlgorithmConfig::default();
247        let grover = OptimizedGroverAlgorithm::new(config)
248            .expect("Grover algorithm creation should succeed");
249        assert_eq!(grover.calculate_optimal_iterations(4, 1), 1);
250        assert_eq!(grover.calculate_optimal_iterations(16, 1), 3);
251        let iterations_64_1 = grover.calculate_optimal_iterations(64, 1);
252        assert!((6..=8).contains(&iterations_64_1));
253    }
254    #[test]
255    fn test_phase_estimation_precision_control() {
256        let config = QuantumAlgorithmConfig {
257            precision_tolerance: 1e-3,
258            ..Default::default()
259        };
260        let mut qpe =
261            EnhancedPhaseEstimation::new(config).expect("Phase estimation creation should succeed");
262        let eigenstate = Array1::from_vec(vec![Complex64::new(1.0, 0.0)]);
263        let identity_op =
264            |_sim: &mut StateVectorSimulator, _target: usize| -> Result<()> { Ok(()) };
265        let result = qpe.estimate_eigenvalues(identity_op, &eigenstate, 1e-3);
266        assert!(result.is_ok());
267        let qpe_result = result.expect("Phase estimation should succeed");
268        assert!(qpe_result.precisions[0] <= 1e-3);
269        assert!(qpe_result.phase_qubits >= 3);
270    }
271    #[test]
272    fn test_grover_multiple_targets() {
273        let config = QuantumAlgorithmConfig::default();
274        let mut grover = OptimizedGroverAlgorithm::new(config)
275            .expect("Grover algorithm creation should succeed");
276        let oracle = |x: usize| x == 2 || x == 5;
277        let result = grover.search(3, oracle, 2);
278        assert!(result.is_ok());
279        let grover_result = result.expect("Grover search should succeed");
280        assert!(grover_result.success_probability >= 0.0);
281        assert!(grover_result.success_probability <= 1.0);
282        assert!(grover_result.iterations > 0);
283    }
284    #[test]
285    fn test_grover_four_qubits() {
286        let config = QuantumAlgorithmConfig::default();
287        let mut grover = OptimizedGroverAlgorithm::new(config)
288            .expect("Grover algorithm creation should succeed");
289        let oracle = |x: usize| x == 7;
290        let result = grover.search(4, oracle, 1);
291        assert!(result.is_ok());
292        let grover_result = result.expect("Grover search should succeed");
293        assert!(grover_result.resource_stats.qubits_used >= 4);
294        assert!(grover_result.iterations >= 2 && grover_result.iterations <= 5);
295    }
296    #[test]
297    fn test_shor_perfect_square() {
298        let config = QuantumAlgorithmConfig::default();
299        let mut shor =
300            OptimizedShorAlgorithm::new(config).expect("Shor algorithm creation should succeed");
301        let result = shor.factor(16).expect("Factoring 16 should succeed");
302        assert!(result.factors.contains(&4) || result.factors.contains(&2));
303    }
304    #[test]
305    fn test_shor_semiprime() {
306        let config = QuantumAlgorithmConfig::default();
307        let mut shor =
308            OptimizedShorAlgorithm::new(config).expect("Shor algorithm creation should succeed");
309        let result = shor.factor(15).expect("Factoring 15 should succeed");
310        assert!(result.execution_time_ms >= 0.0);
311        if !result.factors.is_empty() {
312            for &factor in &result.factors {
313                assert!(15 % factor == 0 || factor == 15);
314            }
315        }
316    }
317    #[test]
318    fn test_optimization_levels() {
319        let levels = vec![
320            OptimizationLevel::Basic,
321            OptimizationLevel::Memory,
322            OptimizationLevel::Speed,
323            OptimizationLevel::Hardware,
324            OptimizationLevel::Maximum,
325        ];
326        for level in levels {
327            let config = QuantumAlgorithmConfig {
328                optimization_level: level,
329                ..Default::default()
330            };
331            let grover = OptimizedGroverAlgorithm::new(config.clone());
332            assert!(grover.is_ok());
333            let shor = OptimizedShorAlgorithm::new(config.clone());
334            assert!(shor.is_ok());
335            let qpe = EnhancedPhaseEstimation::new(config);
336            assert!(qpe.is_ok());
337        }
338    }
339    #[test]
340    fn test_resource_stats() {
341        let config = QuantumAlgorithmConfig::default();
342        let mut shor =
343            OptimizedShorAlgorithm::new(config).expect("Shor algorithm creation should succeed");
344        let result = shor.factor(6).expect("Factoring 6 should succeed");
345        let stats = &result.resource_stats;
346        assert!(!result.factors.is_empty() || stats.qubits_used == 0);
347    }
348    #[test]
349    fn test_grover_resource_stats() {
350        let config = QuantumAlgorithmConfig::default();
351        let mut grover = OptimizedGroverAlgorithm::new(config)
352            .expect("Grover algorithm creation should succeed");
353        let oracle = |x: usize| x == 1;
354        let result = grover
355            .search(2, oracle, 1)
356            .expect("Grover search should succeed");
357        assert!(result.resource_stats.qubits_used > 0);
358        assert!(result.resource_stats.gate_count > 0);
359    }
360    #[test]
361    fn test_phase_estimation_resource_stats() {
362        let config = QuantumAlgorithmConfig::default();
363        let mut qpe =
364            EnhancedPhaseEstimation::new(config).expect("Phase estimation creation should succeed");
365        let eigenstate = Array1::from_vec(vec![Complex64::new(1.0, 0.0)]);
366        let identity_op =
367            |_sim: &mut StateVectorSimulator, _target: usize| -> Result<()> { Ok(()) };
368        let result = qpe
369            .estimate_eigenvalues(identity_op, &eigenstate, 1e-2)
370            .expect("Phase estimation should succeed");
371        assert!(result.resource_stats.qubits_used > 0);
372    }
373    #[test]
374    fn test_config_defaults() {
375        let config = QuantumAlgorithmConfig::default();
376        assert_eq!(config.optimization_level, OptimizationLevel::Maximum);
377        assert!(config.use_classical_preprocessing);
378        assert!(config.enable_error_mitigation);
379        assert_eq!(config.max_circuit_depth, 1000);
380        assert!((config.precision_tolerance - 1e-10).abs() < 1e-15);
381        assert!(config.enable_parallel);
382    }
383    #[test]
384    fn test_shor_result_structure() {
385        let config = QuantumAlgorithmConfig::default();
386        let mut shor =
387            OptimizedShorAlgorithm::new(config).expect("Shor algorithm creation should succeed");
388        let result = shor.factor(6).expect("Factoring 6 should succeed");
389        assert_eq!(result.n, 6);
390        assert!(result.execution_time_ms >= 0.0);
391        assert!(result.classical_preprocessing_ms >= 0.0);
392        assert!(result.quantum_computation_ms >= 0.0);
393        assert!(result.success_probability >= 0.0);
394        assert!(result.success_probability <= 1.0);
395    }
396    #[test]
397    fn test_grover_result_structure() {
398        let config = QuantumAlgorithmConfig::default();
399        let mut grover = OptimizedGroverAlgorithm::new(config)
400            .expect("Grover algorithm creation should succeed");
401        let oracle = |x: usize| x == 0;
402        let result = grover
403            .search(2, oracle, 1)
404            .expect("Grover search should succeed");
405        assert!(result.resource_stats.qubits_used > 0);
406        assert!(result.success_probability >= 0.0);
407        assert!(result.success_probability <= 1.0);
408        assert!(result.execution_time_ms >= 0.0);
409    }
410    #[test]
411    fn test_modular_exponentiation_edge_cases() {
412        let config = QuantumAlgorithmConfig::default();
413        let _shor =
414            OptimizedShorAlgorithm::new(config).expect("Shor algorithm creation should succeed");
415        assert_eq!(OptimizedShorAlgorithm::mod_exp(1, 100, 7), 1);
416        assert_eq!(OptimizedShorAlgorithm::mod_exp(5, 0, 7), 1);
417        assert_eq!(OptimizedShorAlgorithm::mod_exp(2, 10, 1024), 0);
418    }
419    #[test]
420    fn test_continued_fractions_edge_cases() {
421        let config = QuantumAlgorithmConfig::default();
422        let _shor =
423            OptimizedShorAlgorithm::new(config).expect("Shor algorithm creation should succeed");
424        let convergents = OptimizedShorAlgorithm::continued_fractions(0.5, 10);
425        assert!(convergents.iter().any(|&(num, den)| num == 1 && den == 2));
426        let convergents = OptimizedShorAlgorithm::continued_fractions(1.0 / 3.0, 20);
427        assert!(convergents.iter().any(|&(num, den)| num == 1 && den == 3));
428    }
429    #[test]
430    fn test_grover_iterations_scaling() {
431        let config = QuantumAlgorithmConfig::default();
432        let grover = OptimizedGroverAlgorithm::new(config)
433            .expect("Grover algorithm creation should succeed");
434        let iter_8 = grover.calculate_optimal_iterations(8, 1);
435        let iter_32 = grover.calculate_optimal_iterations(32, 1);
436        let ratio = iter_32 as f64 / iter_8 as f64;
437        assert!((1.5..=2.5).contains(&ratio));
438    }
439    #[test]
440    fn test_error_mitigation_disabled() {
441        let config = QuantumAlgorithmConfig {
442            enable_error_mitigation: false,
443            ..Default::default()
444        };
445        let mut grover = OptimizedGroverAlgorithm::new(config)
446            .expect("Grover algorithm creation should succeed");
447        let oracle = |x: usize| x == 1;
448        let result = grover.search(2, oracle, 1);
449        assert!(result.is_ok());
450    }
451    #[test]
452    fn test_parallel_disabled() {
453        let config = QuantumAlgorithmConfig {
454            enable_parallel: false,
455            ..Default::default()
456        };
457        let mut shor =
458            OptimizedShorAlgorithm::new(config).expect("Shor algorithm creation should succeed");
459        let result = shor.factor(6);
460        assert!(result.is_ok());
461    }
462    #[test]
463    fn test_algorithm_resource_stats_default() {
464        let stats = AlgorithmResourceStats::default();
465        assert_eq!(stats.qubits_used, 0);
466        assert_eq!(stats.gate_count, 0);
467        assert_eq!(stats.circuit_depth, 0);
468        assert_eq!(stats.cnot_count, 0);
469        assert_eq!(stats.t_gate_count, 0);
470        assert_eq!(stats.memory_usage_bytes, 0);
471        assert_eq!(stats.measurement_count, 0);
472    }
473    #[test]
474    fn test_shor_small_numbers() {
475        let config = QuantumAlgorithmConfig::default();
476        let mut shor =
477            OptimizedShorAlgorithm::new(config).expect("Shor algorithm creation should succeed");
478        for n in [4, 6, 8, 9, 10, 12] {
479            let result = shor.factor(n);
480            assert!(result.is_ok(), "Failed to factor {n}");
481        }
482    }
483    #[test]
484    fn test_grover_single_qubit() {
485        let config = QuantumAlgorithmConfig::default();
486        let mut grover = OptimizedGroverAlgorithm::new(config)
487            .expect("Grover algorithm creation should succeed");
488        let oracle = |x: usize| x == 1;
489        let result = grover.search(1, oracle, 1);
490        assert!(result.is_ok());
491    }
492}