concision_neural/model/layout/
features.rs1use super::ModelLayout;
6
7#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
11#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
12pub struct ModelFeatures {
13 pub(crate) input: usize,
15 pub(crate) hidden: usize,
17 pub(crate) layers: usize,
19 pub(crate) output: usize,
21}
22
23impl ModelFeatures {
24 pub fn new(input: usize, hidden: usize, layers: usize, output: usize) -> Self {
25 Self {
26 input,
27 hidden,
28 layers,
29 output,
30 }
31 }
32 pub const fn input(&self) -> usize {
34 self.input
35 }
36 #[inline]
38 pub const fn input_mut(&mut self) -> &mut usize {
39 &mut self.input
40 }
41 pub const fn hidden(&self) -> usize {
43 self.hidden
44 }
45 #[inline]
47 pub const fn hidden_mut(&mut self) -> &mut usize {
48 &mut self.hidden
49 }
50 pub const fn layers(&self) -> usize {
52 self.layers
53 }
54 #[inline]
56 pub const fn layers_mut(&mut self) -> &mut usize {
57 &mut self.layers
58 }
59 pub const fn output(&self) -> usize {
61 self.output
62 }
63 #[inline]
65 pub const fn output_mut(&mut self) -> &mut usize {
66 &mut self.output
67 }
68 #[inline]
69 pub fn set_input(&mut self, input: usize) -> &mut Self {
71 self.input = input;
72 self
73 }
74 #[inline]
75 pub fn set_hidden(&mut self, hidden: usize) -> &mut Self {
77 self.hidden = hidden;
78 self
79 }
80 #[inline]
81 pub fn set_layers(&mut self, layers: usize) -> &mut Self {
83 self.layers = layers;
84 self
85 }
86 #[inline]
87 pub fn set_output(&mut self, output: usize) -> &mut Self {
89 self.output = output;
90 self
91 }
92 pub fn with_input(self, input: usize) -> Self {
94 Self { input, ..self }
95 }
96
97 pub fn with_hidden(self, hidden: usize) -> Self {
100 Self { hidden, ..self }
101 }
102 pub fn with_layers(self, layers: usize) -> Self {
105 Self { layers, ..self }
106 }
107 pub fn with_output(self, output: usize) -> Self {
110 Self { output, ..self }
111 }
112 pub fn dim_input(&self) -> (usize, usize) {
114 (self.input(), self.hidden())
115 }
116 pub fn dim_hidden(&self) -> (usize, usize) {
118 (self.hidden(), self.hidden())
119 }
120 pub fn dim_output(&self) -> (usize, usize) {
122 (self.hidden(), self.output())
123 }
124 pub fn size(&self) -> usize {
126 self.size_input() + self.size_hidden() + self.size_output()
127 }
128 pub fn size_input(&self) -> usize {
130 self.input() * self.hidden()
131 }
132 pub fn size_hidden(&self) -> usize {
134 self.hidden() * self.hidden() * self.layers()
135 }
136 pub fn size_output(&self) -> usize {
138 self.hidden() * self.output()
139 }
140}
141
142impl ModelLayout for ModelFeatures {
143 fn input(&self) -> usize {
144 self.input()
145 }
146 fn input_mut(&mut self) -> &mut usize {
147 self.input_mut()
148 }
149 fn hidden(&self) -> usize {
150 self.hidden()
151 }
152 fn hidden_mut(&mut self) -> &mut usize {
153 self.hidden_mut()
154 }
155 fn layers(&self) -> usize {
156 self.layers()
157 }
158 fn layers_mut(&mut self) -> &mut usize {
159 self.layers_mut()
160 }
161 fn output(&self) -> usize {
162 self.output()
163 }
164 fn output_mut(&mut self) -> &mut usize {
165 self.output_mut()
166 }
167}
168
169impl Default for ModelFeatures {
170 fn default() -> Self {
171 Self {
172 input: 16,
173 hidden: 64,
174 layers: 3,
175 output: 16,
176 }
177 }
178}
179
180impl core::fmt::Display for ModelFeatures {
181 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
182 write!(
183 f,
184 "{{ input: {}, hidden: {}, layers: {}, output: {} }}",
185 self.input, self.hidden, self.layers, self.output
186 )
187 }
188}