quantrs2_ml/quantum_advanced_diffusion/
functions.rs

1//! Auto-generated module
2//!
3//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
4
5use 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}