esp_idf_unda/network/serialize/
ser_layer.rs

1use crate::network::{layer::{layers::Layer, dense::Dense}, input::Input, activations::Activations};
2
3pub struct SerializedLayer {
4    pub name: char,
5    pub rows: usize,
6    pub cols: usize,
7    pub weights: String,
8    pub bias: String
9}
10
11impl SerializedLayer {
12    pub fn from(&self, activation: Activations) -> Box<dyn Layer> {
13        match self.name {
14            'D' => {
15                let weights_f32: Vec<f32> = self.weights.split(" ").into_iter().map(|val| val.parse().unwrap()).collect();
16                let bias_f32: Vec<f32> = self.bias.split(" ").into_iter().map(|val| val.parse().unwrap()).collect();
17                let dense_layer: Dense = Dense::new_ser(self.rows, self.cols, weights_f32, bias_f32, activation);
18                return Box::new(dense_layer)
19            },
20            _ => panic!("Not a supported type"),
21        };
22    }
23    fn flatten_string(data: &Vec<Vec<f32>>) -> String {
24        data.to_param()
25            .into_iter()
26            .map(|d| d.to_string() + " ")
27            .collect::<String>().trim_end().to_string()
28    }
29    pub fn to_string(&self) -> String {
30        format!("{}|{}|{}|{}|{}", self.name, self.rows, self.cols, self.weights, self.bias)
31    }
32    pub fn from_string(data: String) -> Self {
33        let mut parse_res = data.split("|");
34        let name: char = parse_res.next().unwrap().chars().next().unwrap();
35        let rows: usize = str::parse(parse_res.next().unwrap()).unwrap();
36        let cols: usize = str::parse(parse_res.next().unwrap()).unwrap();
37        let weights = parse_res.next().unwrap().to_string();
38        let bias = parse_res.next().unwrap().to_string();
39
40        Self { name, rows, cols, weights, bias }
41    }
42}
43