| 1 |
1 |
| 2 use std::iter::Chain; |
2 use std::iter::Chain; |
| 3 use std::sync::Arc; |
3 use std::sync::Arc; |
| 4 |
4 |
| 5 use crate::types::*; |
5 use crate::types::*; |
| 6 use crate::mapping::{Apply, Differentiable}; |
6 use crate::mapping::{ |
| |
7 Instance, |
| |
8 Mapping, |
| |
9 DifferentiableImpl, |
| |
10 DifferentiableMapping, |
| |
11 Space, |
| |
12 }; |
| 7 use crate::iter::{Mappable, MapF, MapZ}; |
13 use crate::iter::{Mappable, MapF, MapZ}; |
| 8 use crate::sets::Cube; |
14 use crate::sets::Cube; |
| 9 use crate::loc::Loc; |
15 use crate::loc::Loc; |
| 10 |
16 |
| 11 use super::support::*; |
17 use super::support::*; |
| 175 EitherSupport::Right(ref b) => b.global_analysis(), |
181 EitherSupport::Right(ref b) => b.global_analysis(), |
| 176 } |
182 } |
| 177 } |
183 } |
| 178 } |
184 } |
| 179 |
185 |
| 180 impl<F, S1, S2, X> Apply<X> for EitherSupport<S1, S2> |
186 impl<F, S1, S2, X> Mapping<X> for EitherSupport<S1, S2> |
| 181 where S1 : Apply<X, Output=F>, |
187 where |
| 182 S2 : Apply<X, Output=F> { |
188 F : Space, |
| 183 type Output = F; |
189 X : Space, |
| 184 #[inline] |
190 S1 : Mapping<X, Codomain=F>, |
| 185 fn apply(&self, x : X) -> F { |
191 S2 : Mapping<X, Codomain=F>, |
| |
192 { |
| |
193 type Codomain = F; |
| |
194 |
| |
195 #[inline] |
| |
196 fn apply<I : Instance<X>>(&self, x : I) -> F { |
| 186 match self { |
197 match self { |
| 187 EitherSupport::Left(ref a) => a.apply(x), |
198 EitherSupport::Left(ref a) => a.apply(x), |
| 188 EitherSupport::Right(ref b) => b.apply(x), |
199 EitherSupport::Right(ref b) => b.apply(x), |
| 189 } |
200 } |
| 190 } |
201 } |
| 191 } |
202 } |
| 192 |
203 |
| 193 impl<F, S1, S2, X> Differentiable<X> for EitherSupport<S1, S2> |
204 impl<X, S1, S2, O> DifferentiableImpl<X> for EitherSupport<S1, S2> |
| 194 where S1 : Differentiable<X, Derivative=F>, |
205 where |
| 195 S2 : Differentiable<X, Derivative=F> { |
206 O : Space, |
| 196 type Derivative = F; |
207 X : Space, |
| 197 #[inline] |
208 S1 : DifferentiableMapping<X, DerivativeDomain=O>, |
| 198 fn differential(&self, x : X) -> F { |
209 S2 : DifferentiableMapping<X, DerivativeDomain=O>, |
| |
210 { |
| |
211 type Derivative = O; |
| |
212 |
| |
213 #[inline] |
| |
214 fn differential_impl<I : Instance<X>>(&self, x : I) -> O { |
| 199 match self { |
215 match self { |
| 200 EitherSupport::Left(ref a) => a.differential(x), |
216 EitherSupport::Left(ref a) => a.differential(x), |
| 201 EitherSupport::Right(ref b) => b.differential(x), |
217 EitherSupport::Right(ref b) => b.differential(x), |
| 202 } |
218 } |
| 203 } |
219 } |