concision_neural/types/
features.rs

1/*
2    Appellation: features <module>
3    Contrib: @FL03
4*/
5
6#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
7#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
8pub struct ModelFeatures {
9    /// the number of input features
10    pub(crate) input: usize,
11    /// the dimension of hidden layers
12    pub(crate) hidden: usize,
13    /// the number of hidden layers
14    pub(crate) layers: usize,
15    /// the number of output features
16    pub(crate) output: usize,
17}
18
19impl ModelFeatures {
20    pub fn new(input: usize, hidden: usize, layers: usize, output: usize) -> Self {
21        Self {
22            input,
23            hidden,
24            layers,
25            output,
26        }
27    }
28
29    gsw! {
30        input: usize,
31        hidden: usize,
32        layers: usize,
33        output: usize,
34    }
35    /// the dimension of the input layer; (input, hidden)
36    pub fn d_input(&self) -> (usize, usize) {
37        (self.input, self.hidden)
38    }
39    /// the dimension of the hidden layers; (hidden, hidden)
40    pub fn d_hidden(&self) -> (usize, usize) {
41        (self.hidden, self.hidden)
42    }
43    /// the dimension of the output layer; (hidden, output)
44    pub fn d_output(&self) -> (usize, usize) {
45        (self.hidden, self.output)
46    }
47    /// the total number of parameters in the model
48    pub fn size(&self) -> usize {
49        self.input * self.hidden
50            + self.hidden * self.hidden * self.layers
51            + self.hidden * self.output
52    }
53    /// the total number of input parameters in the model
54    pub fn size_input(&self) -> usize {
55        self.input * self.hidden
56    }
57    /// the total number of hidden parameters in the model
58    pub fn size_hidden(&self) -> usize {
59        self.hidden * self.hidden * self.layers
60    }
61    /// the total number of output parameters in the model
62    pub fn size_output(&self) -> usize {
63        self.hidden * self.output
64    }
65}
66
67impl Default for ModelFeatures {
68    fn default() -> Self {
69        Self {
70            input: 16,
71            hidden: 64,
72            layers: 3,
73            output: 16,
74        }
75    }
76}
77
78impl core::fmt::Display for ModelFeatures {
79    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
80        write!(
81            f,
82            "ModelFeatures {{ input: {}, hidden: {}, layers: {}, output: {} }}",
83            self.input, self.hidden, self.layers, self.output
84        )
85    }
86}