concision_linear/norm/layer/
config.rs

1/*
2    Appellation: config <module>
3    Contrib: FL03 <jo3mccain@icloud.com>
4*/
5use super::EPSILON;
6use nd::prelude::{Axis, Dimension, Ix2};
7
8pub struct Config<D = Ix2> {
9    pub axis: Option<Axis>,
10    pub dim: D,
11    pub eps: f64,
12}
13
14impl<D> Config<D>
15where
16    D: Dimension,
17{
18    pub fn new() -> ConfigBuilder<D> {
19        ConfigBuilder::new()
20    }
21
22    pub fn axis(&self) -> Option<&Axis> {
23        self.axis.as_ref()
24    }
25
26    pub fn axis_mut(&mut self) -> &mut Option<Axis> {
27        &mut self.axis
28    }
29
30    pub fn eps(&self) -> f64 {
31        self.eps
32    }
33
34    pub fn eps_mut(&mut self) -> &mut f64 {
35        &mut self.eps
36    }
37
38    pub fn dim(&self) -> D::Pattern {
39        self.raw_dim().into_pattern()
40    }
41
42    pub fn dim_mut(&mut self) -> &mut D {
43        &mut self.dim
44    }
45
46    pub fn ndim(&self) -> usize {
47        self.dim.ndim()
48    }
49
50    pub fn raw_dim(&self) -> D {
51        self.dim.clone()
52    }
53
54    pub fn shape(&self) -> &[usize] {
55        self.dim.slice()
56    }
57
58    pub fn shape_mut(&mut self) -> &mut [usize] {
59        self.dim.slice_mut()
60    }
61}
62
63impl<D> Default for Config<D>
64where
65    D: Default,
66{
67    fn default() -> Self {
68        Self {
69            axis: None,
70            dim: D::default(),
71            eps: EPSILON,
72        }
73    }
74}
75
76pub struct ConfigBuilder<D = Ix2> {
77    axis: Option<Axis>,
78    dim: D,
79    eps: f64,
80}
81
82impl<D> ConfigBuilder<D>
83where
84    D: Dimension,
85{
86    pub fn new() -> Self {
87        Self {
88            axis: None,
89            dim: D::default(),
90            eps: 1e-5,
91        }
92    }
93
94    pub fn axis(mut self, axis: Axis) -> Self {
95        self.axis = Some(axis);
96        self
97    }
98
99    pub fn dim(mut self, dim: D) -> Self {
100        self.dim = dim;
101        self
102    }
103
104    pub fn eps(mut self, eps: f64) -> Self {
105        self.eps = eps;
106        self
107    }
108
109    pub fn build(self) -> Config<D> {
110        Config {
111            axis: self.axis,
112            dim: self.dim,
113            eps: self.eps,
114        }
115    }
116}