1use 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
16pub 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 #[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 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 #[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 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 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}