| 277 fn dist2_squared(&self, Pair(ref u, ref v) : &Self) -> F { |
277 fn dist2_squared(&self, Pair(ref u, ref v) : &Self) -> F { |
| 278 self.0.dist2_squared(u) + self.1.dist2_squared(v) |
278 self.0.dist2_squared(u) + self.1.dist2_squared(v) |
| 279 } |
279 } |
| 280 } |
280 } |
| 281 |
281 |
| 282 impl<F, A, B, U, V> AXPY<F, Pair<U, V>> for Pair<A, B> |
282 impl<F, A, B> AXPY for Pair<A, B> |
| 283 where |
283 where |
| 284 U : Space, |
284 A : AXPY<Field=F>, |
| 285 V : Space, |
285 B : AXPY<Field=F>, |
| 286 A : AXPY<F, U>, |
286 F : Num + AXPY |
| 287 B : AXPY<F, V>, |
287 { |
| 288 F : Num |
288 type Field = F; |
| 289 { |
289 |
| 290 |
290 fn axpy<I : Instance<Pair<A,B>>>(&mut self, α : F, x : I, β : F) { |
| 291 fn axpy<I : Instance<Pair<U,V>>>(&mut self, α : F, x : I, β : F) { |
|
| 292 let Pair(u, v) = x.decompose(); |
291 let Pair(u, v) = x.decompose(); |
| 293 self.0.axpy(α, u, β); |
292 self.0.axpy(α, u, β); |
| 294 self.1.axpy(α, v, β); |
293 self.1.axpy(α, v, β); |
| 295 } |
294 } |
| 296 |
295 |
| 297 fn copy_from<I : Instance<Pair<U,V>>>(&mut self, x : I) { |
296 fn copy_from<I : Instance<Pair<A,B>>>(&mut self, x : I) { |
| 298 let Pair(u, v) = x.decompose(); |
297 let Pair(u, v) = x.decompose(); |
| 299 self.0.copy_from(u); |
298 self.0.copy_from(u); |
| 300 self.1.copy_from(v); |
299 self.1.copy_from(v); |
| 301 } |
300 } |
| 302 |
301 |
| 303 fn scale_from<I : Instance<Pair<U,V>>>(&mut self, α : F, x : I) { |
302 fn scale_from<I : Instance<Pair<A,B>>>(&mut self, α : F, x : I) { |
| 304 let Pair(u, v) = x.decompose(); |
303 let Pair(u, v) = x.decompose(); |
| 305 self.0.scale_from(α, u); |
304 self.0.scale_from(α, u); |
| 306 self.1.scale_from(α, v); |
305 self.1.scale_from(α, v); |
| 307 } |
306 } |
| 308 } |
307 } |