Skip to main content

quantrs2_sim/quantum_reservoir_computing/
quantumreservoircomputer_encoding.rs

1//! # QuantumReservoirComputer - encoding Methods
2//!
3//! This module contains method implementations for `QuantumReservoirComputer`.
4//!
5//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
6
7use crate::error::Result;
8use scirs2_core::ndarray::{Array1, Array2};
9use scirs2_core::random::prelude::*;
10
11use super::types::{InputEncoding, OutputMeasurement, ReservoirDynamics};
12
13use super::quantumreservoircomputer_type::QuantumReservoirComputer;
14
15impl QuantumReservoirComputer {
16    /// Process input through quantum reservoir
17    pub fn process_input(&mut self, input: &Array1<f64>) -> Result<Array1<f64>> {
18        let start_time = std::time::Instant::now();
19        self.encode_input(input)?;
20        self.evolve_reservoir()?;
21        let features = self.extract_features()?;
22        let processing_time = start_time.elapsed().as_secs_f64() * 1000.0;
23        self.update_processing_time(processing_time);
24        Ok(features)
25    }
26    /// Encode input data into quantum state
27    pub(super) fn encode_input(&mut self, input: &Array1<f64>) -> Result<()> {
28        match self.config.input_encoding {
29            InputEncoding::Amplitude => {
30                self.encode_amplitude(input)?;
31            }
32            InputEncoding::Phase => {
33                self.encode_phase(input)?;
34            }
35            InputEncoding::BasisState => {
36                self.encode_basis_state(input)?;
37            }
38            _ => {
39                self.encode_amplitude(input)?;
40            }
41        }
42        Ok(())
43    }
44    /// Evolve quantum reservoir through dynamics
45    pub(super) fn evolve_reservoir(&mut self) -> Result<()> {
46        match self.config.dynamics {
47            ReservoirDynamics::Unitary => {
48                self.evolve_unitary()?;
49            }
50            ReservoirDynamics::Open => {
51                self.evolve_open_system()?;
52            }
53            ReservoirDynamics::NISQ => {
54                self.evolve_nisq()?;
55            }
56            ReservoirDynamics::Adiabatic => {
57                self.evolve_adiabatic()?;
58            }
59            ReservoirDynamics::Floquet => {
60                self.evolve_unitary()?;
61            }
62            ReservoirDynamics::QuantumWalk => {
63                self.evolve_unitary()?;
64            }
65            ReservoirDynamics::ContinuousTime => {
66                self.evolve_open_system()?;
67            }
68            ReservoirDynamics::DigitalQuantum => {
69                self.evolve_unitary()?;
70            }
71            ReservoirDynamics::Variational => {
72                self.evolve_unitary()?;
73            }
74            ReservoirDynamics::HamiltonianLearning => {
75                self.evolve_unitary()?;
76            }
77            ReservoirDynamics::ManyBodyLocalized => {
78                self.evolve_unitary()?;
79            }
80            ReservoirDynamics::QuantumChaotic => {
81                self.evolve_unitary()?;
82            }
83        }
84        Ok(())
85    }
86    /// Extract features from reservoir state
87    pub(super) fn extract_features(&mut self) -> Result<Array1<f64>> {
88        match self.config.output_measurement {
89            OutputMeasurement::PauliExpectation => self.measure_pauli_expectations(),
90            OutputMeasurement::Probability => self.measure_probabilities(),
91            OutputMeasurement::Correlations => self.measure_correlations(),
92            OutputMeasurement::Entanglement => self.measure_entanglement(),
93            OutputMeasurement::Fidelity => self.measure_fidelity(),
94            OutputMeasurement::QuantumFisherInformation => self.measure_pauli_expectations(),
95            OutputMeasurement::Variance => self.measure_pauli_expectations(),
96            OutputMeasurement::HigherOrderMoments => self.measure_pauli_expectations(),
97            OutputMeasurement::SpectralProperties => self.measure_pauli_expectations(),
98            OutputMeasurement::QuantumCoherence => self.measure_entanglement(),
99            _ => self.measure_pauli_expectations(),
100        }
101    }
102    /// Update processing time metrics
103    pub(super) fn update_processing_time(&mut self, time_ms: f64) {
104        let count = self.metrics.training_examples as f64;
105        self.metrics.avg_processing_time_ms =
106            self.metrics.avg_processing_time_ms.mul_add(count, time_ms) / (count + 1.0);
107    }
108}