concision_core/nn/traits/
layer.rs1use crate::activate::{Activator, ActivatorGradient};
7use concision_params::RawParams;
8use concision_traits::{Backward, Forward};
9
10pub trait RawLayer<F, A>
14where
15 F: Activator<A>,
16 Self::Params<A>: RawParams<Elem = A>,
17{
18 type Params<_T>;
19 fn rho(&self) -> &F;
21 fn params(&self) -> &Self::Params<A>;
23 fn forward<X, Y, Z>(&self, input: &X) -> Z
25 where
26 F: Activator<Y, Output = Z>,
27 Self::Params<A>: Forward<X, Output = Y>,
28 {
29 let y = self.params().forward(input);
30 self.rho().activate(y)
31 }
32}
33pub trait RawLayerMut<F, A>: RawLayer<F, A>
37where
38 F: Activator<A>,
39 Self::Params<A>: RawParams<Elem = A>,
40{
41 fn params_mut(&mut self) -> &mut Self::Params<A>;
43 fn backward<X, Y, Z, Dt>(&mut self, input: X, error: Y, gamma: A)
45 where
46 A: Clone,
47 F: ActivatorGradient<Y, Rel = F, Delta = Dt>,
48 Self::Params<A>: Backward<X, Dt, Elem = A>,
49 {
50 let delta = self.rho().activate_gradient(error);
51 self.params_mut().backward(&input, &delta, gamma)
52 }
53 fn set_params(&mut self, params: Self::Params<A>) {
55 *self.params_mut() = params;
56 }
57 fn replace_params(&mut self, params: Self::Params<A>) -> Self::Params<A> {
59 core::mem::replace(self.params_mut(), params)
60 }
61 fn swap_params(&mut self, other: &mut Self::Params<A>) {
63 core::mem::swap(self.params_mut(), other);
64 }
65}