quantrs2_sim/qml/
mod.rs

1//! Quantum Machine Learning (QML) module.
2//!
3//! This module provides comprehensive quantum machine learning algorithms
4//! with hardware-aware optimization, adaptive training strategies, and
5//! support for various quantum computing architectures.
6
7pub mod benchmarks;
8pub mod circuit;
9pub mod config;
10pub mod trainer;
11
12// Re-export commonly used types and structs
13pub use benchmarks::{
14    benchmark_gradient_methods, benchmark_optimizers, benchmark_quantum_ml_algorithms,
15    run_comprehensive_benchmarks,
16};
17pub use circuit::{HardwareOptimizations, ParameterizedQuantumCircuit};
18pub use config::{
19    GradientMethod, HardwareArchitecture, OptimizerType, QMLAlgorithmType, QMLConfig,
20};
21pub use trainer::{
22    CompilationStats, HardwareAwareCompiler, HardwareMetrics, OptimizerState, QuantumMLTrainer,
23    TrainingHistory, TrainingResult,
24};
25
26use crate::error::Result;
27
28/// Initialize the QML subsystem
29pub const fn initialize() -> Result<()> {
30    // Perform any necessary initialization
31    Ok(())
32}
33
34/// Check if hardware-aware optimization is available
35#[must_use]
36pub const fn is_hardware_optimization_available() -> bool {
37    // In practice, this would check for hardware-specific libraries
38    true
39}
40
41/// Get supported hardware architectures
42#[must_use]
43pub fn get_supported_architectures() -> Vec<HardwareArchitecture> {
44    vec![
45        HardwareArchitecture::NISQ,
46        HardwareArchitecture::FaultTolerant,
47        HardwareArchitecture::Superconducting,
48        HardwareArchitecture::TrappedIon,
49        HardwareArchitecture::Photonic,
50        HardwareArchitecture::NeutralAtom,
51        HardwareArchitecture::ClassicalSimulation,
52    ]
53}
54
55/// Get supported QML algorithms
56#[must_use]
57pub fn get_supported_algorithms() -> Vec<QMLAlgorithmType> {
58    vec![
59        QMLAlgorithmType::VQE,
60        QMLAlgorithmType::QAOA,
61        QMLAlgorithmType::QCNN,
62        QMLAlgorithmType::QSVM,
63        QMLAlgorithmType::QRL,
64        QMLAlgorithmType::QGAN,
65        QMLAlgorithmType::QBM,
66    ]
67}
68
69/// Get supported gradient methods
70#[must_use]
71pub fn get_supported_gradient_methods() -> Vec<GradientMethod> {
72    vec![
73        GradientMethod::ParameterShift,
74        GradientMethod::FiniteDifferences,
75        GradientMethod::AutomaticDifferentiation,
76        GradientMethod::NaturalGradients,
77        GradientMethod::StochasticParameterShift,
78    ]
79}
80
81/// Get supported optimizers
82#[must_use]
83pub fn get_supported_optimizers() -> Vec<OptimizerType> {
84    vec![
85        OptimizerType::Adam,
86        OptimizerType::SGD,
87        OptimizerType::RMSprop,
88        OptimizerType::LBFGS,
89        OptimizerType::QuantumNaturalGradient,
90        OptimizerType::SPSA,
91    ]
92}
93
94/// Create a default configuration for a specific algorithm
95#[must_use]
96pub fn create_default_config(algorithm: QMLAlgorithmType) -> QMLConfig {
97    QMLConfig::for_algorithm(algorithm)
98}
99
100/// Create a configuration optimized for specific hardware
101#[must_use]
102pub fn create_hardware_config(hardware: HardwareArchitecture) -> QMLConfig {
103    QMLConfig::for_hardware(hardware)
104}
105
106/// Validate QML configuration
107pub fn validate_config(config: &QMLConfig) -> Result<()> {
108    config
109        .validate()
110        .map_err(crate::error::SimulatorError::InvalidInput)
111}
112
113#[cfg(test)]
114mod tests {
115    use super::*;
116    use scirs2_core::ndarray::Array1;
117
118    #[test]
119    fn test_qml_initialization() {
120        let result = initialize();
121        assert!(result.is_ok());
122    }
123
124    #[test]
125    fn test_supported_architectures() {
126        let archs = get_supported_architectures();
127        assert!(!archs.is_empty());
128        assert!(archs.contains(&HardwareArchitecture::NISQ));
129    }
130
131    #[test]
132    fn test_supported_algorithms() {
133        let algos = get_supported_algorithms();
134        assert!(!algos.is_empty());
135        assert!(algos.contains(&QMLAlgorithmType::VQE));
136    }
137
138    #[test]
139    fn test_default_config_creation() {
140        let config = create_default_config(QMLAlgorithmType::VQE);
141        assert_eq!(config.algorithm_type, QMLAlgorithmType::VQE);
142        assert!(validate_config(&config).is_ok());
143    }
144
145    #[test]
146    fn test_hardware_config_creation() {
147        let config = create_hardware_config(HardwareArchitecture::Superconducting);
148        assert_eq!(
149            config.hardware_architecture,
150            HardwareArchitecture::Superconducting
151        );
152        assert!(validate_config(&config).is_ok());
153    }
154
155    #[test]
156    fn test_config_validation() {
157        let mut config = QMLConfig::default();
158        assert!(validate_config(&config).is_ok());
159
160        // Test invalid configuration
161        config.num_qubits = 0;
162        assert!(validate_config(&config).is_err());
163    }
164
165    #[test]
166    fn test_parameterized_circuit_creation() {
167        use crate::circuit_interfaces::InterfaceCircuit;
168
169        let circuit = InterfaceCircuit::new(4, 0);
170        let parameters = Array1::from_vec(vec![0.1, 0.2, 0.3, 0.4]);
171        let parameter_names = vec![
172            "p0".to_string(),
173            "p1".to_string(),
174            "p2".to_string(),
175            "p3".to_string(),
176        ];
177
178        let pqc = ParameterizedQuantumCircuit::new(
179            circuit,
180            parameters,
181            parameter_names,
182            HardwareArchitecture::NISQ,
183        );
184
185        assert_eq!(pqc.num_parameters(), 4);
186        assert_eq!(pqc.num_qubits(), 4);
187    }
188
189    #[test]
190    fn test_hardware_optimizations() {
191        let opts = HardwareOptimizations::for_hardware(HardwareArchitecture::Superconducting, 4);
192
193        // Test connectivity for superconducting (linear)
194        assert!(opts.connectivity_graph[[0, 1]]);
195        assert!(opts.connectivity_graph[[1, 2]]);
196        assert!(!opts.connectivity_graph[[0, 2]]);
197
198        // Test gate fidelities
199        assert!(opts.gate_fidelities.contains_key("X"));
200        assert!(opts.gate_fidelities.contains_key("CNOT"));
201    }
202
203    #[test]
204    fn test_trainer_creation() {
205        use crate::circuit_interfaces::InterfaceCircuit;
206
207        let config = QMLConfig::default();
208        let circuit = InterfaceCircuit::new(config.num_qubits, 0);
209        let parameters = Array1::zeros(config.num_parameters);
210        let parameter_names = (0..config.num_parameters)
211            .map(|i| format!("param_{i}"))
212            .collect();
213
214        let pqc = ParameterizedQuantumCircuit::new(
215            circuit,
216            parameters,
217            parameter_names,
218            config.hardware_architecture,
219        );
220
221        let trainer = QuantumMLTrainer::new(config, pqc, None);
222        assert!(trainer.is_ok());
223    }
224
225    #[test]
226    fn test_optimizer_state() {
227        let state = OptimizerState::new(4, 0.01);
228        assert_eq!(state.parameters.len(), 4);
229        assert_eq!(state.learning_rate, 0.01);
230        assert_eq!(state.iteration, 0);
231    }
232
233    #[test]
234    fn test_training_history() {
235        let mut history = TrainingHistory::default();
236        history.loss_history.push(1.0);
237        history.loss_history.push(0.5);
238        history.loss_history.push(0.2);
239
240        assert_eq!(history.latest_loss(), Some(0.2));
241        assert_eq!(history.best_loss(), Some(0.2));
242    }
243}