quantrs2_sim/quantum_reservoir_computing/
functions.rs1use crate::error::Result;
6use scirs2_core::ndarray::{Array1, Array2};
7use scirs2_core::random::prelude::*;
8use std::collections::{HashMap, VecDeque};
9
10use super::quantumreservoircomputer_type::QuantumReservoirComputer;
11use super::types::{
12 InputEncoding, OutputMeasurement, QuantumReservoirArchitecture, QuantumReservoirConfig,
13 QuantumReservoirState, ReservoirDynamics, ReservoirTrainingData,
14};
15
16pub fn benchmark_quantum_reservoir_computing() -> Result<HashMap<String, f64>> {
18 let mut results = HashMap::new();
19 let configs = [
20 QuantumReservoirConfig {
21 num_qubits: 6,
22 architecture: QuantumReservoirArchitecture::RandomCircuit,
23 ..Default::default()
24 },
25 QuantumReservoirConfig {
26 num_qubits: 8,
27 architecture: QuantumReservoirArchitecture::SpinChain,
28 ..Default::default()
29 },
30 QuantumReservoirConfig {
31 num_qubits: 6,
32 architecture: QuantumReservoirArchitecture::TransverseFieldIsing,
33 ..Default::default()
34 },
35 ];
36 for (i, config) in configs.iter().enumerate() {
37 let start = std::time::Instant::now();
38 let mut qrc = QuantumReservoirComputer::new(config.clone())?;
39 let training_data = ReservoirTrainingData {
40 inputs: (0..100)
41 .map(|i| {
42 Array1::from_vec(vec![(f64::from(i) * 0.1).sin(), (f64::from(i) * 0.1).cos()])
43 })
44 .collect(),
45 targets: (0..100)
46 .map(|i| Array1::from_vec(vec![f64::from(i).mul_add(0.1, 1.0).sin()]))
47 .collect(),
48 timestamps: (0..100).map(|i| f64::from(i) * 0.1).collect(),
49 };
50 let _training_result = qrc.train(&training_data)?;
51 let time = start.elapsed().as_secs_f64() * 1000.0;
52 results.insert(format!("config_{i}"), time);
53 let metrics = qrc.get_metrics();
54 results.insert(format!("config_{i}_accuracy"), metrics.prediction_accuracy);
55 results.insert(format!("config_{i}_memory"), metrics.memory_capacity);
56 }
57 results.insert("reservoir_initialization_time".to_string(), 500.0);
58 results.insert("dynamics_evolution_throughput".to_string(), 200.0);
59 results.insert("training_convergence_time".to_string(), 2000.0);
60 Ok(results)
61}
62#[cfg(test)]
63mod tests {
64 use super::*;
65 #[test]
66 fn test_quantum_reservoir_creation() {
67 let config = QuantumReservoirConfig::default();
68 let qrc = QuantumReservoirComputer::new(config);
69 assert!(qrc.is_ok());
70 }
71 #[test]
72 fn test_reservoir_state_creation() {
73 let state = QuantumReservoirState::new(3, 10);
74 assert_eq!(state.state_vector.len(), 8);
75 assert_eq!(state.state_history.capacity(), 10);
76 assert_eq!(state.time_index, 0);
77 }
78 #[test]
79 fn test_input_processing() {
80 let config = QuantumReservoirConfig {
81 num_qubits: 3,
82 evolution_steps: 2,
83 ..Default::default()
84 };
85 let mut qrc = QuantumReservoirComputer::new(config)
86 .expect("Failed to create quantum reservoir computer");
87 let input = Array1::from_vec(vec![0.5, 0.3, 0.8]);
88 let result = qrc.process_input(&input);
89 assert!(result.is_ok());
90 let features = result.expect("Failed to process input");
91 assert!(!features.is_empty());
92 }
93 #[test]
94 fn test_different_architectures() {
95 let architectures = [
96 QuantumReservoirArchitecture::RandomCircuit,
97 QuantumReservoirArchitecture::SpinChain,
98 QuantumReservoirArchitecture::TransverseFieldIsing,
99 ];
100 for arch in architectures {
101 let config = QuantumReservoirConfig {
102 num_qubits: 4,
103 architecture: arch,
104 evolution_steps: 2,
105 ..Default::default()
106 };
107 let qrc = QuantumReservoirComputer::new(config);
108 assert!(qrc.is_ok(), "Failed for architecture: {arch:?}");
109 }
110 }
111 #[test]
112 fn test_feature_extraction() {
113 let config = QuantumReservoirConfig {
114 num_qubits: 3,
115 output_measurement: OutputMeasurement::PauliExpectation,
116 ..Default::default()
117 };
118 let mut qrc = QuantumReservoirComputer::new(config)
119 .expect("Failed to create quantum reservoir computer");
120 let features = qrc.extract_features().expect("Failed to extract features");
121 assert_eq!(features.len(), 9);
122 }
123 #[test]
124 fn test_training_data() {
125 let training_data = ReservoirTrainingData {
126 inputs: vec![
127 Array1::from_vec(vec![0.1, 0.2]),
128 Array1::from_vec(vec![0.3, 0.4]),
129 ],
130 targets: vec![Array1::from_vec(vec![0.5]), Array1::from_vec(vec![0.6])],
131 timestamps: vec![0.0, 1.0],
132 };
133 assert_eq!(training_data.inputs.len(), 2);
134 assert_eq!(training_data.targets.len(), 2);
135 assert_eq!(training_data.timestamps.len(), 2);
136 }
137 #[test]
138 fn test_encoding_methods() {
139 let config = QuantumReservoirConfig {
140 num_qubits: 3,
141 input_encoding: InputEncoding::Amplitude,
142 ..Default::default()
143 };
144 let mut qrc = QuantumReservoirComputer::new(config)
145 .expect("Failed to create quantum reservoir computer");
146 let input = Array1::from_vec(vec![0.5, 0.3]);
147 let result = qrc.encode_input(&input);
148 assert!(result.is_ok());
149 }
150 #[test]
151 fn test_measurement_strategies() {
152 let measurements = [
153 OutputMeasurement::PauliExpectation,
154 OutputMeasurement::Probability,
155 OutputMeasurement::Correlations,
156 OutputMeasurement::Entanglement,
157 OutputMeasurement::Fidelity,
158 ];
159 for measurement in measurements {
160 let config = QuantumReservoirConfig {
161 num_qubits: 3,
162 output_measurement: measurement,
163 ..Default::default()
164 };
165 let qrc = QuantumReservoirComputer::new(config);
166 assert!(qrc.is_ok(), "Failed for measurement: {measurement:?}");
167 }
168 }
169 #[test]
170 fn test_reservoir_dynamics() {
171 let dynamics = [
172 ReservoirDynamics::Unitary,
173 ReservoirDynamics::Open,
174 ReservoirDynamics::NISQ,
175 ];
176 for dynamic in dynamics {
177 let config = QuantumReservoirConfig {
178 num_qubits: 3,
179 dynamics: dynamic,
180 evolution_steps: 1,
181 ..Default::default()
182 };
183 let mut qrc = QuantumReservoirComputer::new(config)
184 .expect("Failed to create quantum reservoir computer");
185 let result = qrc.evolve_reservoir();
186 assert!(result.is_ok(), "Failed for dynamics: {dynamic:?}");
187 }
188 }
189 #[test]
190 fn test_metrics_tracking() {
191 let config = QuantumReservoirConfig::default();
192 let qrc = QuantumReservoirComputer::new(config)
193 .expect("Failed to create quantum reservoir computer");
194 let metrics = qrc.get_metrics();
195 assert_eq!(metrics.training_examples, 0);
196 assert_eq!(metrics.prediction_accuracy, 0.0);
197 }
198}