29 pub weight : C, |
29 pub weight : C, |
30 /// The base [`Support`] or [`Apply`] being weighted. |
30 /// The base [`Support`] or [`Apply`] being weighted. |
31 pub base_fn : T, |
31 pub base_fn : T, |
32 } |
32 } |
33 |
33 |
|
34 impl<T, C> Weighted<T, C> |
|
35 where |
|
36 C : Constant, |
|
37 { |
|
38 /// Construct from an iterator. |
|
39 pub fn new(weight : C, base_fn : T) -> Self { |
|
40 Weighted{ weight, base_fn } |
|
41 } |
|
42 } |
|
43 |
34 impl<'a, T, V, D, F, C> Mapping<D> for Weighted<T, C> |
44 impl<'a, T, V, D, F, C> Mapping<D> for Weighted<T, C> |
35 where |
45 where |
36 F : Float, |
46 F : Float, |
37 D : Space, |
47 D : Space, |
38 T : Mapping<D, Codomain=V>, |
48 T : Mapping<D, Codomain=V>, |
60 #[inline] |
70 #[inline] |
61 fn differential_impl<I : Instance<D>>(&self, x : I) -> Self::Derivative { |
71 fn differential_impl<I : Instance<D>>(&self, x : I) -> Self::Derivative { |
62 self.base_fn.differential(x) * self.weight.value() |
72 self.base_fn.differential(x) * self.weight.value() |
63 } |
73 } |
64 } |
74 } |
|
75 |
|
76 /// A sum of [`Mapping`]s. |
|
77 #[derive(Serialize, Debug, Clone)] |
|
78 pub struct MappingSum<M>(Vec<M>); |
|
79 |
|
80 impl< M> MappingSum<M> { |
|
81 /// Construct from an iterator. |
|
82 pub fn new<I : IntoIterator<Item = M>>(iter : I) -> Self { |
|
83 MappingSum(iter.into_iter().collect()) |
|
84 } |
|
85 |
|
86 /// Iterate over the component functions of the sum |
|
87 pub fn iter(&self) -> std::slice::Iter<'_, M> { |
|
88 self.0.iter() |
|
89 } |
|
90 } |
|
91 |
|
92 impl<Domain, M> Mapping<Domain> for MappingSum<M> |
|
93 where |
|
94 Domain : Space + Clone, |
|
95 M : Mapping<Domain>, |
|
96 M::Codomain : std::iter::Sum + Clone |
|
97 { |
|
98 type Codomain = M::Codomain; |
|
99 |
|
100 fn apply<I : Instance<Domain>>(&self, x : I) -> Self::Codomain { |
|
101 let xr = x.ref_instance(); |
|
102 self.0.iter().map(|c| c.apply(xr)).sum() |
|
103 } |
|
104 } |
|
105 |
|
106 impl<Domain, M> DifferentiableImpl<Domain> for MappingSum< M> |
|
107 where |
|
108 Domain : Space + Clone, |
|
109 M : DifferentiableMapping<Domain>, |
|
110 M :: DerivativeDomain : std::iter::Sum |
|
111 { |
|
112 type Derivative = M::DerivativeDomain; |
|
113 |
|
114 fn differential_impl<I : Instance<Domain>>(&self, x : I) -> Self::Derivative { |
|
115 let xr = x.ref_instance(); |
|
116 self.0.iter().map(|c| c.differential(xr)).sum() |
|
117 } |
|
118 } |