echo_state_network/
physical_reservoir.rs

1use 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}