188 EitherSupport::Right(ref b) => b.apply(x), |
188 EitherSupport::Right(ref b) => b.apply(x), |
189 } |
189 } |
190 } |
190 } |
191 } |
191 } |
192 |
192 |
193 impl<F, S1, S2, X> Differentiable<X> for EitherSupport<S1, S2> |
193 impl<F, D, S1, S2, X : Clone> Differentiable<X> for EitherSupport<S1, S2> |
194 where S1 : Differentiable<X, Output=F>, |
194 where S1 : Differentiable<X, Output=D> + Apply<X, Output = F>, |
195 S2 : Differentiable<X, Output=F> { |
195 S2 : Differentiable<X, Output=D> + Apply<X, Output = F> { |
196 type Output = F; |
196 type Output = D; |
197 #[inline] |
197 |
198 fn differential(&self, x : X) -> F { |
198 #[inline] |
|
199 fn differential(&self, x : X) -> D { |
199 match self { |
200 match self { |
200 EitherSupport::Left(ref a) => a.differential(x), |
201 EitherSupport::Left(ref a) => a.differential(x), |
201 EitherSupport::Right(ref b) => b.differential(x), |
202 EitherSupport::Right(ref b) => b.differential(x), |
|
203 } |
|
204 } |
|
205 |
|
206 #[inline] |
|
207 fn linearisation_error(&self, x : X, y : X) -> F { |
|
208 match self { |
|
209 EitherSupport::Left(ref a) => a.linearisation_error(x, y), |
|
210 EitherSupport::Right(ref b) => b.linearisation_error(x, y), |
|
211 } |
|
212 } |
|
213 |
|
214 #[inline] |
|
215 fn linearisation_error_gen(&self, x : X, y : X, z : X) -> F { |
|
216 match self { |
|
217 EitherSupport::Left(ref a) => a.linearisation_error_gen(x, y, z), |
|
218 EitherSupport::Right(ref b) => b.linearisation_error_gen(x, y, z), |
202 } |
219 } |
203 } |
220 } |
204 } |
221 } |
205 |
222 |
206 macro_rules! make_either_scalarop_rhs { |
223 macro_rules! make_either_scalarop_rhs { |