quantrs2_sim/quantum_reservoir_computing_enhanced/
mod.rs1mod analysis;
28mod config;
29mod reservoir;
30mod state;
31mod time_series;
32pub mod types;
33
34pub use analysis::*;
36pub use config::*;
37pub use reservoir::*;
38pub use state::*;
39pub use time_series::*;
40pub use types::*;
41
42use crate::error::Result;
43use scirs2_core::ndarray::Array1;
44use std::collections::HashMap;
45
46pub fn benchmark_enhanced_quantum_reservoir_computing() -> Result<HashMap<String, f64>> {
48 let mut results = HashMap::new();
49
50 let configs = vec![
52 QuantumReservoirConfig {
53 num_qubits: 6,
54 architecture: QuantumReservoirArchitecture::RandomCircuit,
55 learning_config: AdvancedLearningConfig {
56 algorithm: LearningAlgorithm::Ridge,
57 ..Default::default()
58 },
59 ..Default::default()
60 },
61 QuantumReservoirConfig {
62 num_qubits: 8,
63 architecture: QuantumReservoirArchitecture::ScaleFree,
64 learning_config: AdvancedLearningConfig {
65 algorithm: LearningAlgorithm::LASSO,
66 ..Default::default()
67 },
68 ..Default::default()
69 },
70 QuantumReservoirConfig {
71 num_qubits: 6,
72 architecture: QuantumReservoirArchitecture::HierarchicalModular,
73 learning_config: AdvancedLearningConfig {
74 algorithm: LearningAlgorithm::RecursiveLeastSquares,
75 ..Default::default()
76 },
77 memory_config: MemoryAnalysisConfig {
78 enable_capacity_estimation: true,
79 enable_nonlinear: true,
80 ..Default::default()
81 },
82 ..Default::default()
83 },
84 QuantumReservoirConfig {
85 num_qubits: 8,
86 architecture: QuantumReservoirArchitecture::Grid,
87 dynamics: ReservoirDynamics::Floquet,
88 input_encoding: InputEncoding::Angle,
89 output_measurement: OutputMeasurement::TemporalCorrelations,
90 ..Default::default()
91 },
92 ];
93
94 for (i, config) in configs.into_iter().enumerate() {
95 let start = std::time::Instant::now();
96
97 let mut qrc = QuantumReservoirComputerEnhanced::new(config)?;
98
99 let training_data = ReservoirTrainingData::new(
101 (0..200)
102 .map(|i| {
103 Array1::from_vec(vec![
104 (f64::from(i) * 0.1).sin(),
105 (f64::from(i) * 0.1).cos(),
106 (f64::from(i) * 0.05).sin() * (f64::from(i) * 0.2).cos(),
107 ])
108 })
109 .collect(),
110 (0..200)
111 .map(|i| Array1::from_vec(vec![f64::from(i).mul_add(0.1, 1.0).sin()]))
112 .collect(),
113 (0..200).map(|i| f64::from(i) * 0.1).collect(),
114 );
115
116 let training_result = qrc.train(&training_data)?;
118
119 let time = start.elapsed().as_secs_f64() * 1000.0;
120 results.insert(format!("enhanced_config_{i}"), time);
121
122 let metrics = qrc.get_metrics();
124 results.insert(
125 format!("enhanced_config_{i}_accuracy"),
126 metrics.prediction_accuracy,
127 );
128 results.insert(
129 format!("enhanced_config_{i}_memory_capacity"),
130 training_result.memory_capacity,
131 );
132 results.insert(
133 format!("enhanced_config_{i}_nonlinear_capacity"),
134 training_result.nonlinear_capacity,
135 );
136 results.insert(
137 format!("enhanced_config_{i}_processing_capacity"),
138 training_result.processing_capacity,
139 );
140 results.insert(
141 format!("enhanced_config_{i}_quantum_advantage"),
142 metrics.quantum_advantage,
143 );
144 results.insert(
145 format!("enhanced_config_{i}_efficiency"),
146 metrics.reservoir_efficiency,
147 );
148
149 let memory_analyzer = qrc.get_memory_analysis();
151 if let Some(&linear_capacity) = memory_analyzer.capacity_estimates.get("linear") {
152 results.insert(
153 format!("enhanced_config_{i}_linear_memory"),
154 linear_capacity,
155 );
156 }
157 if let Some(&total_capacity) = memory_analyzer.capacity_estimates.get("total") {
158 results.insert(format!("enhanced_config_{i}_total_memory"), total_capacity);
159 }
160 }
161
162 Ok(results)
163}
164
165#[cfg(test)]
166mod tests {
167 use super::*;
168
169 #[test]
170 fn test_enhanced_quantum_reservoir_creation() {
171 let config = QuantumReservoirConfig::default();
172 let qrc = QuantumReservoirComputerEnhanced::new(config);
173 assert!(qrc.is_ok());
174 }
175
176 #[test]
177 fn test_enhanced_reservoir_state_creation() {
178 let state = QuantumReservoirState::new(3, 10);
179 assert_eq!(state.state_vector.len(), 8); assert_eq!(state.state_history.capacity(), 10);
181 assert_eq!(state.time_index, 0);
182 assert!(state.memory_metrics.total_capacity >= 0.0);
183 }
184
185 #[test]
186 fn test_enhanced_input_processing() {
187 let config = QuantumReservoirConfig {
188 num_qubits: 3,
189 evolution_steps: 2,
190 ..Default::default()
191 };
192 let mut qrc = QuantumReservoirComputerEnhanced::new(config).expect("Failed to create QRC");
193
194 let input = Array1::from_vec(vec![0.5, 0.3, 0.8]);
195 let result = qrc.process_input(&input);
196 assert!(result.is_ok());
197
198 let features = result.expect("Failed to process input");
199 assert!(!features.is_empty());
200 }
201
202 #[test]
203 fn test_enhanced_architectures() {
204 let architectures = vec![
205 QuantumReservoirArchitecture::RandomCircuit,
206 QuantumReservoirArchitecture::SpinChain,
207 QuantumReservoirArchitecture::ScaleFree,
208 QuantumReservoirArchitecture::HierarchicalModular,
209 QuantumReservoirArchitecture::Ring,
210 QuantumReservoirArchitecture::Grid,
211 ];
212
213 for arch in architectures {
214 let config = QuantumReservoirConfig {
215 num_qubits: 4,
216 architecture: arch,
217 evolution_steps: 2,
218 ..Default::default()
219 };
220
221 let qrc = QuantumReservoirComputerEnhanced::new(config);
222 assert!(qrc.is_ok(), "Failed for architecture: {arch:?}");
223 }
224 }
225
226 #[test]
227 fn test_advanced_learning_algorithms() {
228 let algorithms = vec![
229 LearningAlgorithm::Ridge,
230 LearningAlgorithm::LASSO,
231 LearningAlgorithm::ElasticNet,
232 LearningAlgorithm::RecursiveLeastSquares,
233 ];
234
235 for algorithm in algorithms {
236 let config = QuantumReservoirConfig {
237 num_qubits: 3,
238 learning_config: AdvancedLearningConfig {
239 algorithm,
240 ..Default::default()
241 },
242 ..Default::default()
243 };
244
245 let qrc = QuantumReservoirComputerEnhanced::new(config);
246 assert!(qrc.is_ok(), "Failed for algorithm: {algorithm:?}");
247 }
248 }
249
250 #[test]
251 fn test_enhanced_encoding_methods() {
252 let encodings = vec![
253 InputEncoding::Amplitude,
254 InputEncoding::Phase,
255 InputEncoding::BasisState,
256 InputEncoding::Angle,
257 ];
258
259 for encoding in encodings {
260 let config = QuantumReservoirConfig {
261 num_qubits: 3,
262 input_encoding: encoding,
263 ..Default::default()
264 };
265 let mut qrc =
266 QuantumReservoirComputerEnhanced::new(config).expect("Failed to create QRC");
267
268 let input = Array1::from_vec(vec![0.5, 0.3]);
269 let result = qrc.encode_input(&input);
270 assert!(result.is_ok(), "Failed for encoding: {encoding:?}");
271 }
272 }
273
274 #[test]
275 fn test_enhanced_measurement_strategies() {
276 let measurements = vec![
277 OutputMeasurement::PauliExpectation,
278 OutputMeasurement::Probability,
279 OutputMeasurement::Correlations,
280 OutputMeasurement::Entanglement,
281 OutputMeasurement::QuantumFisherInformation,
282 OutputMeasurement::Variance,
283 OutputMeasurement::QuantumCoherence,
284 OutputMeasurement::Purity,
285 OutputMeasurement::TemporalCorrelations,
286 ];
287
288 for measurement in measurements {
289 let config = QuantumReservoirConfig {
290 num_qubits: 3,
291 output_measurement: measurement,
292 ..Default::default()
293 };
294
295 let qrc = QuantumReservoirComputerEnhanced::new(config);
296 assert!(qrc.is_ok(), "Failed for measurement: {measurement:?}");
297 }
298 }
299
300 #[test]
301 fn test_enhanced_reservoir_dynamics() {
302 let dynamics = vec![
303 ReservoirDynamics::Unitary,
304 ReservoirDynamics::Open,
305 ReservoirDynamics::NISQ,
306 ReservoirDynamics::Floquet,
307 ];
308
309 for dynamic in dynamics {
310 let config = QuantumReservoirConfig {
311 num_qubits: 3,
312 dynamics: dynamic,
313 evolution_steps: 1,
314 ..Default::default()
315 };
316
317 let mut qrc =
318 QuantumReservoirComputerEnhanced::new(config).expect("Failed to create QRC");
319 let result = qrc.evolve_reservoir();
320 assert!(result.is_ok(), "Failed for dynamics: {dynamic:?}");
321 }
322 }
323
324 #[test]
325 fn test_memory_analysis() {
326 let config = QuantumReservoirConfig {
327 num_qubits: 4,
328 memory_config: MemoryAnalysisConfig {
329 enable_capacity_estimation: true,
330 enable_nonlinear: true,
331 enable_ipc: true,
332 ..Default::default()
333 },
334 ..Default::default()
335 };
336
337 let qrc = QuantumReservoirComputerEnhanced::new(config).expect("Failed to create QRC");
338 let memory_analyzer = qrc.get_memory_analysis();
339
340 assert!(memory_analyzer.config.enable_capacity_estimation);
341 assert!(memory_analyzer.config.enable_nonlinear);
342 assert!(memory_analyzer.config.enable_ipc);
343 }
344
345 #[test]
346 fn test_enhanced_training_data() {
347 let training_data = ReservoirTrainingData::new(
348 vec![
349 Array1::from_vec(vec![0.1, 0.2]),
350 Array1::from_vec(vec![0.3, 0.4]),
351 ],
352 vec![Array1::from_vec(vec![0.5]), Array1::from_vec(vec![0.6])],
353 vec![0.0, 1.0],
354 )
355 .with_features(vec![
356 Array1::from_vec(vec![0.7, 0.8]),
357 Array1::from_vec(vec![0.9, 1.0]),
358 ])
359 .with_labels(vec![0, 1])
360 .with_weights(vec![1.0, 1.0]);
361
362 assert_eq!(training_data.len(), 2);
363 assert!(training_data.features.is_some());
364 assert!(training_data.labels.is_some());
365 assert!(training_data.sample_weights.is_some());
366
367 let (train, test) = training_data.train_test_split(0.5);
368 assert_eq!(train.len(), 1);
369 assert_eq!(test.len(), 1);
370 }
371
372 #[test]
373 fn test_time_series_predictor() {
374 let config = TimeSeriesConfig::default();
375 let predictor = TimeSeriesPredictor::new(&config);
376
377 assert_eq!(predictor.arima_params.ar_coeffs.len(), config.ar_order);
378 assert_eq!(predictor.arima_params.ma_coeffs.len(), config.ma_order);
379 assert_eq!(predictor.nar_state.order, config.nar_order);
380 }
381
382 #[test]
383 fn test_enhanced_metrics_tracking() {
384 let config = QuantumReservoirConfig::default();
385 let qrc = QuantumReservoirComputerEnhanced::new(config).expect("Failed to create QRC");
386
387 let metrics = qrc.get_metrics();
388 assert_eq!(metrics.training_examples, 0);
389 assert_eq!(metrics.prediction_accuracy, 0.0);
390 assert_eq!(metrics.memory_capacity, 0.0);
391 assert_eq!(metrics.nonlinear_memory_capacity, 0.0);
392 assert_eq!(metrics.quantum_advantage, 0.0);
393 }
394
395 #[test]
396 fn test_enhanced_feature_sizes() {
397 let measurements = vec![
398 (OutputMeasurement::PauliExpectation, 24), (OutputMeasurement::QuantumFisherInformation, 8), (OutputMeasurement::Variance, 24), (OutputMeasurement::Purity, 1), ];
403
404 for (measurement, expected_size) in measurements {
405 let config = QuantumReservoirConfig {
406 num_qubits: 8,
407 output_measurement: measurement,
408 ..Default::default()
409 };
410
411 let feature_size = QuantumReservoirComputerEnhanced::calculate_feature_size(&config);
412 assert_eq!(
413 feature_size, expected_size,
414 "Feature size mismatch for {:?}: expected {}, got {}",
415 measurement, expected_size, feature_size
416 );
417 }
418 }
419}