125 fn diff_ref(&self) -> Differential<'_, Domain, Self> { |
125 fn diff_ref(&self) -> Differential<'_, Domain, Self> { |
126 Differential{ g : Cow::Borrowed(self), _space : PhantomData } |
126 Differential{ g : Cow::Borrowed(self), _space : PhantomData } |
127 } |
127 } |
128 } |
128 } |
129 |
129 |
130 /// A sum of [`Mapping`]s. |
|
131 #[derive(Serialize, Debug, Clone)] |
|
132 pub struct Sum<Domain, M> { |
|
133 components : Vec<M>, |
|
134 _domain : PhantomData<Domain>, |
|
135 } |
|
136 |
|
137 impl<Domain, M> Sum<Domain, M> { |
|
138 /// Construct from an iterator. |
|
139 pub fn new<I : Iterator<Item = M>>(iter : I) -> Self { |
|
140 Sum { components : iter.collect(), _domain : PhantomData } |
|
141 } |
|
142 |
|
143 /// Iterate over the component functions of the sum |
|
144 pub fn iter(&self) -> std::slice::Iter<'_, M> { |
|
145 self.components.iter() |
|
146 } |
|
147 } |
|
148 |
|
149 |
|
150 impl<Domain, M> Mapping<Domain> for Sum<Domain, M> |
|
151 where |
|
152 Domain : Space + Clone, |
|
153 M : Mapping<Domain>, |
|
154 M::Codomain : std::iter::Sum + Clone |
|
155 { |
|
156 type Codomain = M::Codomain; |
|
157 |
|
158 fn apply<I : Instance<Domain>>(&self, x : I) -> Self::Codomain { |
|
159 let xr = x.ref_instance(); |
|
160 self.components.iter().map(|c| c.apply(xr)).sum() |
|
161 } |
|
162 } |
|
163 |
|
164 impl<Domain, M> DifferentiableImpl<Domain> for Sum<Domain, M> |
|
165 where |
|
166 Domain : Space + Clone, |
|
167 M : DifferentiableMapping<Domain>, |
|
168 M :: DerivativeDomain : std::iter::Sum |
|
169 { |
|
170 type Derivative = M::DerivativeDomain; |
|
171 |
|
172 fn differential_impl<I : Instance<Domain>>(&self, x : I) -> Self::Derivative { |
|
173 let xr = x.ref_instance(); |
|
174 self.components.iter().map(|c| c.differential(xr)).sum() |
|
175 } |
|
176 } |
|
177 |
130 |
178 /// Container for the differential [`Mapping`] of a [`Differentiable`] mapping. |
131 /// Container for the differential [`Mapping`] of a [`Differentiable`] mapping. |
179 pub struct Differential<'a, X, G : Clone> { |
132 pub struct Differential<'a, X, G : Clone> { |
180 g : Cow<'a, G>, |
133 g : Cow<'a, G>, |
181 _space : PhantomData<X> |
134 _space : PhantomData<X> |