quantrs2_sim/quantum_reservoir_computing/
quantumreservoircomputer_encoding.rs1use 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 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 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 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 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 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}