QuantumReservoirComputer

Struct QuantumReservoirComputer 

Source
pub struct QuantumReservoirComputer { /* private fields */ }
Expand description

Main Quantum Reservoir Computer

Implementations§

Source§

impl QuantumReservoirComputer

Source

pub fn new(config: QRCConfig) -> Result<Self>

Create a new Quantum Reservoir Computer

Examples found in repository?
examples/quantum_ml_ultrathink_showcase.rs (line 236)
197fn quantum_reservoir_computing_demonstration() -> Result<()> {
198    println!("   Initializing Quantum Reservoir Computer...");
199
200    // Configure advanced QRC
201    let config = QRCConfig {
202        reservoir_qubits: 12,
203        input_qubits: 6,
204        readout_size: 16,
205        reservoir_dynamics: ReservoirDynamics {
206            evolution_time: 1.0,
207            coupling_strength: 0.15,
208            external_field: 0.08,
209            hamiltonian_type: HamiltonianType::TransverseFieldIsing,
210            random_interactions: true,
211            randomness_strength: 0.05,
212            memory_length: 20,
213        },
214        input_encoding: InputEncoding {
215            encoding_type: EncodingType::Amplitude,
216            normalization: NormalizationType::L2,
217            feature_mapping: FeatureMapping::Linear,
218            temporal_encoding: true,
219        },
220        training_config: QRCTrainingConfig {
221            epochs: 100,
222            learning_rate: 0.01,
223            batch_size: 16,
224            washout_period: 50,
225            ..Default::default()
226        },
227        temporal_config: TemporalConfig {
228            sequence_length: 20,
229            time_step: 0.1,
230            temporal_correlation: true,
231            memory_decay: 0.95,
232        },
233        ..Default::default()
234    };
235
236    let mut qrc = QuantumReservoirComputer::new(config)?;
237    println!("   QRC initialized with {} reservoir qubits", 20);
238
239    // Generate temporal sequence data
240    let training_data = generate_temporal_sequences(100, 20, 6, 8)?;
241    println!("   Generated {} temporal sequences", training_data.len());
242
243    // Train the reservoir readout
244    println!("   Training quantum reservoir readout...");
245    qrc.train(&training_data)?;
246
247    // Analyze reservoir dynamics
248    let dynamics = qrc.analyze_dynamics()?;
249    println!("   ✅ QRC Training Complete!");
250    println!("      Reservoir Capacity: {:.4}", dynamics.capacity);
251    println!("      Memory Function: {:.4}", dynamics.memory_function);
252    println!("      Spectral Radius: {:.4}", dynamics.spectral_radius);
253    println!(
254        "      Entanglement Measure: {:.4}",
255        dynamics.entanglement_measure
256    );
257
258    // Test prediction
259    let test_sequence =
260        Array2::from_shape_vec((15, 6), (0..90).map(|x| f64::from(x) * 0.01).collect())?;
261    let prediction = qrc.predict(&test_sequence)?;
262    println!("      Test prediction shape: {:?}", prediction.shape());
263
264    Ok(())
265}
266
267/// Demonstrate Quantum Graph Attention Networks
268fn quantum_graph_attention_demonstration() -> Result<()> {
269    println!("   Initializing Quantum Graph Attention Network...");
270
271    // Configure advanced QGAT
272    let config = QGATConfig {
273        node_qubits: 5,
274        edge_qubits: 3,
275        num_attention_heads: 8,
276        hidden_dim: 128,
277        output_dim: 32,
278        num_layers: 4,
279        attention_config: QGATAttentionConfig {
280            attention_type: QGATQuantumAttentionType::QuantumSelfAttention,
281            dropout_rate: 0.1,
282            scaled_attention: true,
283            temperature: 0.8,
284            multi_head: true,
285            normalization: AttentionNormalization::LayerNorm,
286        },
287        pooling_config: PoolingConfig {
288            pooling_type: PoolingType::QuantumGlobalPool,
289            pooling_ratio: 0.5,
290            learnable_pooling: true,
291            quantum_pooling: true,
292        },
293        training_config: QGATTrainingConfig {
294            epochs: 150,
295            learning_rate: 0.0005,
296            batch_size: 8,
297            loss_function: LossFunction::CrossEntropy,
298            ..Default::default()
299        },
300        ..Default::default()
301    };
302
303    let qgat = QuantumGraphAttentionNetwork::new(config)?;
304    println!("   QGAT initialized with {} attention heads", 8);
305
306    // Create complex graph data
307    let graphs = generate_complex_graphs(50)?;
308    println!("   Generated {} complex graphs", graphs.len());
309
310    // Test forward pass
311    let sample_graph = &graphs[0];
312    let output = qgat.forward(sample_graph)?;
313    println!("   ✅ QGAT Forward Pass Complete!");
314    println!(
315        "      Input graph: {} nodes, {} edges",
316        sample_graph.num_nodes, sample_graph.num_edges
317    );
318    println!("      Output shape: {:?}", output.shape());
319
320    // Analyze attention patterns
321    let attention_analysis = qgat.analyze_attention(sample_graph)?;
322    println!("      Attention Analysis:");
323    println!(
324        "         Number of attention heads: {}",
325        attention_analysis.attention_weights.len()
326    );
327    println!(
328        "         Average entropy: {:.4}",
329        attention_analysis.average_entropy
330    );
331
332    // Graph representation learning
333    let graph_embeddings = qgat.forward(sample_graph)?;
334    let embedding_norm = graph_embeddings.iter().map(|x| x * x).sum::<f64>().sqrt();
335    println!("      Graph embedding norm: {embedding_norm:.4}");
336
337    Ok(())
338}
339
340/// Advanced Integration Showcase
341fn advanced_integration_showcase() -> Result<()> {
342    println!("   Creating multi-algorithm quantum ML pipeline...");
343
344    // Step 1: Use QPINN to solve a PDE and extract features
345    println!("   Stage 1: QPINN feature extraction from PDE solution");
346    let pde_features = extract_pde_features_with_qpinn()?;
347    println!(
348        "      Extracted {} features from PDE solution",
349        pde_features.len()
350    );
351
352    // Step 2: Use QRC to process temporal dynamics
353    println!("   Stage 2: QRC temporal pattern recognition");
354    let temporal_patterns = process_temporal_with_qrc(&pde_features)?;
355    println!(
356        "      Identified {} temporal patterns",
357        temporal_patterns.nrows()
358    );
359
360    // Step 3: Use QGAT for relationship modeling
361    println!("   Stage 3: QGAT relationship modeling");
362    let relationship_graph = create_relationship_graph(&temporal_patterns)?;
363    let graph_insights = analyze_with_qgat(&relationship_graph)?;
364    println!(
365        "      Generated relationship insights: {:.4} complexity score",
366        graph_insights.sum() / graph_insights.len() as f64
367    );
368
369    // Step 4: QNODE for continuous optimization
370    println!("   Stage 4: QNODE continuous optimization");
371    let optimization_result = optimize_with_qnode(&graph_insights)?;
372    println!("      Optimization converged to: {optimization_result:.6}");
373
374    println!("   ✅ Multi-Algorithm Pipeline Complete!");
375    println!("      Successfully integrated 4 cutting-edge quantum algorithms");
376    println!("      Pipeline demonstrates quantum synergies and enhanced capabilities");
377
378    Ok(())
379}
380
381/// Comprehensive Benchmarking
382fn comprehensive_benchmarking() -> Result<()> {
383    println!("   Running comprehensive quantum advantage benchmarks...");
384
385    // Benchmark QNODE vs Classical NODE
386    println!("   Benchmarking QNODE vs Classical Neural ODE...");
387    let qnode_config = QNODEConfig::default();
388    let mut qnode = QuantumNeuralODE::new(qnode_config)?;
389    let test_data = generate_benchmark_data()?;
390    let qnode_benchmark = benchmark_qnode_vs_classical(&mut qnode, &test_data)?;
391
392    println!(
393        "      QNODE Quantum Advantage: {:.2}x",
394        qnode_benchmark.quantum_advantage
395    );
396    println!(
397        "      QNODE Speed Ratio: {:.2}x",
398        qnode_benchmark.classical_time / qnode_benchmark.quantum_time
399    );
400
401    // Benchmark QRC vs Classical RC
402    println!("   Benchmarking QRC vs Classical Reservoir Computing...");
403    let qrc_config = QRCConfig::default();
404    let mut qrc = QuantumReservoirComputer::new(qrc_config)?;
405    let qrc_test_data = generate_qrc_benchmark_data()?;
406    let qrc_benchmark = benchmark_qrc_vs_classical(&mut qrc, &qrc_test_data)?;
407
408    println!(
409        "      QRC Quantum Advantage: {:.2}x",
410        qrc_benchmark.quantum_advantage
411    );
412    println!(
413        "      QRC Accuracy Improvement: {:.2}%",
414        (qrc_benchmark.quantum_advantage - 1.0) * 100.0
415    );
416
417    // Benchmark QGAT vs Classical GAT
418    println!("   Benchmarking QGAT vs Classical Graph Attention...");
419    let qgat_config = QGATConfig::default();
420    let qgat = QuantumGraphAttentionNetwork::new(qgat_config)?;
421    let qgat_test_graphs = generate_benchmark_graphs()?;
422    let qgat_benchmark = benchmark_qgat_vs_classical(&qgat, &qgat_test_graphs)?;
423
424    println!(
425        "      QGAT Quantum Advantage: {:.2}x",
426        qgat_benchmark.quantum_advantage
427    );
428    println!(
429        "      QGAT Processing Speed: {:.2}x faster",
430        qgat_benchmark.classical_time / qgat_benchmark.quantum_time
431    );
432
433    // Overall analysis
434    let avg_quantum_advantage = (qnode_benchmark.quantum_advantage
435        + qrc_benchmark.quantum_advantage
436        + qgat_benchmark.quantum_advantage)
437        / 3.0;
438
439    println!("   ✅ Comprehensive Benchmarking Complete!");
440    println!("      Average Quantum Advantage: {avg_quantum_advantage:.2}x");
441    println!("      All algorithms demonstrate quantum superiority");
442
443    Ok(())
444}
Source

pub fn process_sequence( &mut self, input_sequence: &Array2<f64>, ) -> Result<Array2<f64>>

Process a sequence of inputs through the reservoir

Source

pub fn train( &mut self, training_data: &[(Array2<f64>, Array2<f64>)], ) -> Result<()>

Train the readout layer on sequential data

Examples found in repository?
examples/quantum_ml_ultrathink_showcase.rs (line 245)
197fn quantum_reservoir_computing_demonstration() -> Result<()> {
198    println!("   Initializing Quantum Reservoir Computer...");
199
200    // Configure advanced QRC
201    let config = QRCConfig {
202        reservoir_qubits: 12,
203        input_qubits: 6,
204        readout_size: 16,
205        reservoir_dynamics: ReservoirDynamics {
206            evolution_time: 1.0,
207            coupling_strength: 0.15,
208            external_field: 0.08,
209            hamiltonian_type: HamiltonianType::TransverseFieldIsing,
210            random_interactions: true,
211            randomness_strength: 0.05,
212            memory_length: 20,
213        },
214        input_encoding: InputEncoding {
215            encoding_type: EncodingType::Amplitude,
216            normalization: NormalizationType::L2,
217            feature_mapping: FeatureMapping::Linear,
218            temporal_encoding: true,
219        },
220        training_config: QRCTrainingConfig {
221            epochs: 100,
222            learning_rate: 0.01,
223            batch_size: 16,
224            washout_period: 50,
225            ..Default::default()
226        },
227        temporal_config: TemporalConfig {
228            sequence_length: 20,
229            time_step: 0.1,
230            temporal_correlation: true,
231            memory_decay: 0.95,
232        },
233        ..Default::default()
234    };
235
236    let mut qrc = QuantumReservoirComputer::new(config)?;
237    println!("   QRC initialized with {} reservoir qubits", 20);
238
239    // Generate temporal sequence data
240    let training_data = generate_temporal_sequences(100, 20, 6, 8)?;
241    println!("   Generated {} temporal sequences", training_data.len());
242
243    // Train the reservoir readout
244    println!("   Training quantum reservoir readout...");
245    qrc.train(&training_data)?;
246
247    // Analyze reservoir dynamics
248    let dynamics = qrc.analyze_dynamics()?;
249    println!("   ✅ QRC Training Complete!");
250    println!("      Reservoir Capacity: {:.4}", dynamics.capacity);
251    println!("      Memory Function: {:.4}", dynamics.memory_function);
252    println!("      Spectral Radius: {:.4}", dynamics.spectral_radius);
253    println!(
254        "      Entanglement Measure: {:.4}",
255        dynamics.entanglement_measure
256    );
257
258    // Test prediction
259    let test_sequence =
260        Array2::from_shape_vec((15, 6), (0..90).map(|x| f64::from(x) * 0.01).collect())?;
261    let prediction = qrc.predict(&test_sequence)?;
262    println!("      Test prediction shape: {:?}", prediction.shape());
263
264    Ok(())
265}
Source

pub fn predict(&mut self, input_sequence: &Array2<f64>) -> Result<Array2<f64>>

Predict on new sequential data

Examples found in repository?
examples/quantum_ml_ultrathink_showcase.rs (line 261)
197fn quantum_reservoir_computing_demonstration() -> Result<()> {
198    println!("   Initializing Quantum Reservoir Computer...");
199
200    // Configure advanced QRC
201    let config = QRCConfig {
202        reservoir_qubits: 12,
203        input_qubits: 6,
204        readout_size: 16,
205        reservoir_dynamics: ReservoirDynamics {
206            evolution_time: 1.0,
207            coupling_strength: 0.15,
208            external_field: 0.08,
209            hamiltonian_type: HamiltonianType::TransverseFieldIsing,
210            random_interactions: true,
211            randomness_strength: 0.05,
212            memory_length: 20,
213        },
214        input_encoding: InputEncoding {
215            encoding_type: EncodingType::Amplitude,
216            normalization: NormalizationType::L2,
217            feature_mapping: FeatureMapping::Linear,
218            temporal_encoding: true,
219        },
220        training_config: QRCTrainingConfig {
221            epochs: 100,
222            learning_rate: 0.01,
223            batch_size: 16,
224            washout_period: 50,
225            ..Default::default()
226        },
227        temporal_config: TemporalConfig {
228            sequence_length: 20,
229            time_step: 0.1,
230            temporal_correlation: true,
231            memory_decay: 0.95,
232        },
233        ..Default::default()
234    };
235
236    let mut qrc = QuantumReservoirComputer::new(config)?;
237    println!("   QRC initialized with {} reservoir qubits", 20);
238
239    // Generate temporal sequence data
240    let training_data = generate_temporal_sequences(100, 20, 6, 8)?;
241    println!("   Generated {} temporal sequences", training_data.len());
242
243    // Train the reservoir readout
244    println!("   Training quantum reservoir readout...");
245    qrc.train(&training_data)?;
246
247    // Analyze reservoir dynamics
248    let dynamics = qrc.analyze_dynamics()?;
249    println!("   ✅ QRC Training Complete!");
250    println!("      Reservoir Capacity: {:.4}", dynamics.capacity);
251    println!("      Memory Function: {:.4}", dynamics.memory_function);
252    println!("      Spectral Radius: {:.4}", dynamics.spectral_radius);
253    println!(
254        "      Entanglement Measure: {:.4}",
255        dynamics.entanglement_measure
256    );
257
258    // Test prediction
259    let test_sequence =
260        Array2::from_shape_vec((15, 6), (0..90).map(|x| f64::from(x) * 0.01).collect())?;
261    let prediction = qrc.predict(&test_sequence)?;
262    println!("      Test prediction shape: {:?}", prediction.shape());
263
264    Ok(())
265}
Source

pub fn get_training_history(&self) -> &[TrainingMetrics]

Get training history

Source

pub fn get_reservoir_states(&self) -> &[Array1<f64>]

Get reservoir states for analysis

Source

pub fn analyze_dynamics(&self) -> Result<DynamicsAnalysis>

Analyze reservoir dynamics

Examples found in repository?
examples/quantum_ml_ultrathink_showcase.rs (line 248)
197fn quantum_reservoir_computing_demonstration() -> Result<()> {
198    println!("   Initializing Quantum Reservoir Computer...");
199
200    // Configure advanced QRC
201    let config = QRCConfig {
202        reservoir_qubits: 12,
203        input_qubits: 6,
204        readout_size: 16,
205        reservoir_dynamics: ReservoirDynamics {
206            evolution_time: 1.0,
207            coupling_strength: 0.15,
208            external_field: 0.08,
209            hamiltonian_type: HamiltonianType::TransverseFieldIsing,
210            random_interactions: true,
211            randomness_strength: 0.05,
212            memory_length: 20,
213        },
214        input_encoding: InputEncoding {
215            encoding_type: EncodingType::Amplitude,
216            normalization: NormalizationType::L2,
217            feature_mapping: FeatureMapping::Linear,
218            temporal_encoding: true,
219        },
220        training_config: QRCTrainingConfig {
221            epochs: 100,
222            learning_rate: 0.01,
223            batch_size: 16,
224            washout_period: 50,
225            ..Default::default()
226        },
227        temporal_config: TemporalConfig {
228            sequence_length: 20,
229            time_step: 0.1,
230            temporal_correlation: true,
231            memory_decay: 0.95,
232        },
233        ..Default::default()
234    };
235
236    let mut qrc = QuantumReservoirComputer::new(config)?;
237    println!("   QRC initialized with {} reservoir qubits", 20);
238
239    // Generate temporal sequence data
240    let training_data = generate_temporal_sequences(100, 20, 6, 8)?;
241    println!("   Generated {} temporal sequences", training_data.len());
242
243    // Train the reservoir readout
244    println!("   Training quantum reservoir readout...");
245    qrc.train(&training_data)?;
246
247    // Analyze reservoir dynamics
248    let dynamics = qrc.analyze_dynamics()?;
249    println!("   ✅ QRC Training Complete!");
250    println!("      Reservoir Capacity: {:.4}", dynamics.capacity);
251    println!("      Memory Function: {:.4}", dynamics.memory_function);
252    println!("      Spectral Radius: {:.4}", dynamics.spectral_radius);
253    println!(
254        "      Entanglement Measure: {:.4}",
255        dynamics.entanglement_measure
256    );
257
258    // Test prediction
259    let test_sequence =
260        Array2::from_shape_vec((15, 6), (0..90).map(|x| f64::from(x) * 0.01).collect())?;
261    let prediction = qrc.predict(&test_sequence)?;
262    println!("      Test prediction shape: {:?}", prediction.shape());
263
264    Ok(())
265}

Trait Implementations§

Source§

impl Clone for QuantumReservoirComputer

Source§

fn clone(&self) -> QuantumReservoirComputer

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for QuantumReservoirComputer

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V