concision_linear/norm/layer/
config.rs1use 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}