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 const fn initialize() -> Result<()> {
30 Ok(())
32}
33
34#[must_use]
36pub const fn is_hardware_optimization_available() -> bool {
37 true
39}
40
41#[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#[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#[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#[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#[must_use]
96pub fn create_default_config(algorithm: QMLAlgorithmType) -> QMLConfig {
97 QMLConfig::for_algorithm(algorithm)
98}
99
100#[must_use]
102pub fn create_hardware_config(hardware: HardwareArchitecture) -> QMLConfig {
103 QMLConfig::for_hardware(hardware)
104}
105
106pub 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 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 assert!(opts.connectivity_graph[[0, 1]]);
195 assert!(opts.connectivity_graph[[1, 2]]);
196 assert!(!opts.connectivity_graph[[0, 2]]);
197
198 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}