quantrs2_ml/quantum_advanced_diffusion/
functions.rs1use crate::error::{MLError, Result};
6use crate::quantum_advanced_diffusion::types::*;
7use scirs2_core::ndarray::{s, Array1, Array2, Array3, ArrayView1, Axis};
8use scirs2_core::random::prelude::*;
9use scirs2_core::random::ChaCha20Rng;
10use scirs2_core::random::{Rng, SeedableRng};
11use scirs2_core::Complex64;
12use std::f64::consts::PI;
13#[cfg(test)]
14mod tests {
15 use super::*;
16 use quantrs2_circuit::builder::Circuit;
17 #[test]
18 fn test_quantum_advanced_diffusion_creation() {
19 let config = QuantumAdvancedDiffusionConfig::default();
20 let model = QuantumAdvancedDiffusionModel::new(config);
21 assert!(model.is_ok());
22 }
23 #[test]
24 fn test_quantum_noise_schedule() {
25 let config = QuantumAdvancedDiffusionConfig::default();
26 let (betas, alphas, alphas_cumprod) =
27 QuantumAdvancedDiffusionModel::compute_quantum_schedule(&config)
28 .expect("Failed to compute quantum schedule");
29 assert_eq!(betas.len(), config.num_timesteps);
30 assert_eq!(alphas.len(), config.num_timesteps);
31 assert_eq!(alphas_cumprod.len(), config.num_timesteps);
32 for i in 1..alphas_cumprod.len() {
33 assert!(alphas_cumprod[i] <= alphas_cumprod[i - 1]);
34 }
35 }
36 #[test]
37 fn test_quantum_forward_diffusion() {
38 let config = QuantumAdvancedDiffusionConfig {
39 data_dim: 4,
40 num_qubits: 8,
41 num_timesteps: 100,
42 ..Default::default()
43 };
44 let model =
45 QuantumAdvancedDiffusionModel::new(config).expect("Failed to create diffusion model");
46 let x0 = Array1::from_vec(vec![0.5, -0.3, 0.8, -0.1]);
47 let result = model.quantum_forward_diffusion(&x0, 50);
48 assert!(result.is_ok());
49 let (xt, quantum_noise, quantum_state) = result.expect("Forward diffusion should succeed");
50 assert_eq!(xt.len(), 4);
51 assert_eq!(quantum_noise.len(), 4);
52 assert!(quantum_state.entanglement_measure >= 0.0);
53 assert!(quantum_state.entanglement_measure <= 1.0);
54 }
55 #[test]
56 fn test_quantum_denoising_network() {
57 let config = QuantumAdvancedDiffusionConfig {
58 data_dim: 8,
59 num_qubits: 4,
60 ..Default::default()
61 };
62 let network = QuantumDenoisingNetwork::new(&config);
63 assert!(network.is_ok());
64 let network = network.expect("Failed to create denoising network");
65 assert!(!network.quantum_layers.is_empty());
66 assert!(!network.classical_layers.is_empty());
67 }
68 #[test]
69 fn test_quantum_generation() {
70 let config = QuantumAdvancedDiffusionConfig {
71 data_dim: 2,
72 num_qubits: 4,
73 num_timesteps: 10,
74 ..Default::default()
75 };
76 let model =
77 QuantumAdvancedDiffusionModel::new(config).expect("Failed to create diffusion model");
78 let result = model.quantum_generate(3, None, None);
79 assert!(result.is_ok());
80 let output = result.expect("Quantum generation should succeed");
81 assert_eq!(output.samples.shape(), &[3, 2]);
82 assert_eq!(output.generation_metrics.len(), 3);
83 }
84 #[test]
85 fn test_multi_scale_noise_schedule() {
86 let config = QuantumAdvancedDiffusionConfig {
87 noise_schedule: QuantumNoiseSchedule::MultiScale {
88 scales: vec![1.0, 0.5, 0.25],
89 weights: Array1::from_vec(vec![0.5, 0.3, 0.2]),
90 coherence_times: Array1::from_vec(vec![10.0, 5.0, 2.0]),
91 },
92 ..Default::default()
93 };
94 let result = QuantumAdvancedDiffusionModel::compute_quantum_schedule(&config);
95 assert!(result.is_ok());
96 let (betas, _, _) = result.expect("Multi-scale noise schedule should compute");
97 assert!(betas.iter().all(|&beta| beta >= 0.0 && beta <= 1.0));
98 }
99 #[test]
100 fn test_quantum_metrics_computation() {
101 let quantum_state = QuantumState {
102 classical_data: Array1::from_vec(vec![0.1, 0.2, 0.3]),
103 quantum_phase: Complex64::new(0.8, 0.6),
104 entanglement_measure: 0.7,
105 coherence_time: 0.9,
106 fidelity: 0.85,
107 };
108 assert!((quantum_state.quantum_phase.norm() - 1.0).abs() < 1e-10);
109 assert!(quantum_state.entanglement_measure >= 0.0);
110 assert!(quantum_state.entanglement_measure <= 1.0);
111 assert!(quantum_state.fidelity >= 0.0);
112 assert!(quantum_state.fidelity <= 1.0);
113 }
114}