1pub mod benchmarks;
8pub mod circuit;
9pub mod config;
10pub mod trainer;
11
12pub 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
28pub fn initialize() -> Result<()> {
30 Ok(())
32}
33
34pub fn is_hardware_optimization_available() -> bool {
36 true
38}
39
40pub fn get_supported_architectures() -> Vec<HardwareArchitecture> {
42 vec![
43 HardwareArchitecture::NISQ,
44 HardwareArchitecture::FaultTolerant,
45 HardwareArchitecture::Superconducting,
46 HardwareArchitecture::TrappedIon,
47 HardwareArchitecture::Photonic,
48 HardwareArchitecture::NeutralAtom,
49 HardwareArchitecture::ClassicalSimulation,
50 ]
51}
52
53pub fn get_supported_algorithms() -> Vec<QMLAlgorithmType> {
55 vec![
56 QMLAlgorithmType::VQE,
57 QMLAlgorithmType::QAOA,
58 QMLAlgorithmType::QCNN,
59 QMLAlgorithmType::QSVM,
60 QMLAlgorithmType::QRL,
61 QMLAlgorithmType::QGAN,
62 QMLAlgorithmType::QBM,
63 ]
64}
65
66pub fn get_supported_gradient_methods() -> Vec<GradientMethod> {
68 vec![
69 GradientMethod::ParameterShift,
70 GradientMethod::FiniteDifferences,
71 GradientMethod::AutomaticDifferentiation,
72 GradientMethod::NaturalGradients,
73 GradientMethod::StochasticParameterShift,
74 ]
75}
76
77pub fn get_supported_optimizers() -> Vec<OptimizerType> {
79 vec![
80 OptimizerType::Adam,
81 OptimizerType::SGD,
82 OptimizerType::RMSprop,
83 OptimizerType::LBFGS,
84 OptimizerType::QuantumNaturalGradient,
85 OptimizerType::SPSA,
86 ]
87}
88
89pub fn create_default_config(algorithm: QMLAlgorithmType) -> QMLConfig {
91 QMLConfig::for_algorithm(algorithm)
92}
93
94pub fn create_hardware_config(hardware: HardwareArchitecture) -> QMLConfig {
96 QMLConfig::for_hardware(hardware)
97}
98
99pub fn validate_config(config: &QMLConfig) -> Result<()> {
101 config
102 .validate()
103 .map_err(|e| crate::error::SimulatorError::InvalidInput(e))
104}
105
106#[cfg(test)]
107mod tests {
108 use super::*;
109 use scirs2_core::ndarray::Array1;
110
111 #[test]
112 fn test_qml_initialization() {
113 let result = initialize();
114 assert!(result.is_ok());
115 }
116
117 #[test]
118 fn test_supported_architectures() {
119 let archs = get_supported_architectures();
120 assert!(!archs.is_empty());
121 assert!(archs.contains(&HardwareArchitecture::NISQ));
122 }
123
124 #[test]
125 fn test_supported_algorithms() {
126 let algos = get_supported_algorithms();
127 assert!(!algos.is_empty());
128 assert!(algos.contains(&QMLAlgorithmType::VQE));
129 }
130
131 #[test]
132 fn test_default_config_creation() {
133 let config = create_default_config(QMLAlgorithmType::VQE);
134 assert_eq!(config.algorithm_type, QMLAlgorithmType::VQE);
135 assert!(validate_config(&config).is_ok());
136 }
137
138 #[test]
139 fn test_hardware_config_creation() {
140 let config = create_hardware_config(HardwareArchitecture::Superconducting);
141 assert_eq!(
142 config.hardware_architecture,
143 HardwareArchitecture::Superconducting
144 );
145 assert!(validate_config(&config).is_ok());
146 }
147
148 #[test]
149 fn test_config_validation() {
150 let mut config = QMLConfig::default();
151 assert!(validate_config(&config).is_ok());
152
153 config.num_qubits = 0;
155 assert!(validate_config(&config).is_err());
156 }
157
158 #[test]
159 fn test_parameterized_circuit_creation() {
160 use crate::circuit_interfaces::InterfaceCircuit;
161
162 let circuit = InterfaceCircuit::new(4, 0);
163 let parameters = Array1::from_vec(vec![0.1, 0.2, 0.3, 0.4]);
164 let parameter_names = vec![
165 "p0".to_string(),
166 "p1".to_string(),
167 "p2".to_string(),
168 "p3".to_string(),
169 ];
170
171 let pqc = ParameterizedQuantumCircuit::new(
172 circuit,
173 parameters,
174 parameter_names,
175 HardwareArchitecture::NISQ,
176 );
177
178 assert_eq!(pqc.num_parameters(), 4);
179 assert_eq!(pqc.num_qubits(), 4);
180 }
181
182 #[test]
183 fn test_hardware_optimizations() {
184 let opts = HardwareOptimizations::for_hardware(HardwareArchitecture::Superconducting, 4);
185
186 assert!(opts.connectivity_graph[[0, 1]]);
188 assert!(opts.connectivity_graph[[1, 2]]);
189 assert!(!opts.connectivity_graph[[0, 2]]);
190
191 assert!(opts.gate_fidelities.contains_key("X"));
193 assert!(opts.gate_fidelities.contains_key("CNOT"));
194 }
195
196 #[test]
197 fn test_trainer_creation() {
198 use crate::circuit_interfaces::InterfaceCircuit;
199
200 let config = QMLConfig::default();
201 let circuit = InterfaceCircuit::new(config.num_qubits, 0);
202 let parameters = Array1::zeros(config.num_parameters);
203 let parameter_names = (0..config.num_parameters)
204 .map(|i| format!("param_{}", i))
205 .collect();
206
207 let pqc = ParameterizedQuantumCircuit::new(
208 circuit,
209 parameters,
210 parameter_names,
211 config.hardware_architecture,
212 );
213
214 let trainer = QuantumMLTrainer::new(config, pqc, None);
215 assert!(trainer.is_ok());
216 }
217
218 #[test]
219 fn test_optimizer_state() {
220 let state = OptimizerState::new(4, 0.01);
221 assert_eq!(state.parameters.len(), 4);
222 assert_eq!(state.learning_rate, 0.01);
223 assert_eq!(state.iteration, 0);
224 }
225
226 #[test]
227 fn test_training_history() {
228 let mut history = TrainingHistory::default();
229 history.loss_history.push(1.0);
230 history.loss_history.push(0.5);
231 history.loss_history.push(0.2);
232
233 assert_eq!(history.latest_loss(), Some(0.2));
234 assert_eq!(history.best_loss(), Some(0.2));
235 }
236}