echo_state_network/
physical_reservoir.rs1use nalgebra as na;
2
3use crate::*;
4
5pub struct PhysicalReservoir {
6 input_log: Vec<Vec<f64>>,
7 reservoir_log: Vec<Vec<f64>>,
8 expected_log: Vec<Vec<f64>>,
9 output: Output,
10 _n_y: u64,
11 _n_x: u64,
12}
13
14impl PhysicalReservoir {
15 pub fn new(n_y: u64, n_x: u64) -> Self {
16 PhysicalReservoir {
17 input_log: vec![],
18 reservoir_log: vec![],
19 expected_log: vec![],
20 output: Output::new(n_y, n_x),
21 _n_y: n_y,
22 _n_x: n_x,
23 }
24 }
25
26 pub fn update(&mut self, input: &[f64], output: &[f64], expected: &[f64]) {
27 self.input_log.push(input.to_vec());
28 self.reservoir_log.push(output.to_vec());
29 self.expected_log.push(expected.to_vec());
30 }
31
32 pub fn offline_train(&mut self, optimizer: &mut Ridge) {
33 for (res, expected) in self.reservoir_log.iter().zip(self.expected_log.iter()) {
34 let x = na::DVector::from_vec(res.clone());
35 let d = na::DVector::from_vec(expected.clone());
36 optimizer.set_data(&x, &d);
37 }
38
39 let weight = optimizer.fit();
40 self.output.set_weight(weight);
41 }
42
43 pub fn readout_weight(&self) -> &na::DMatrix<f64> {
44 self.output.output_weight()
45 }
46}