268 + SubAssign<Self> + for<'b> SubAssign<&'b Self> |
268 + SubAssign<Self> + for<'b> SubAssign<&'b Self> |
269 + Neg<Output=PairOutput<F, A, B>> |
269 + Neg<Output=PairOutput<F, A, B>> |
270 { |
270 { |
271 type Output = PairOutput<F, A, B>; |
271 type Output = PairOutput<F, A, B>; |
272 |
272 |
273 fn similar_origin(&self) -> PairOutput<F, A, B> { |
|
274 Pair(self.0.similar_origin(), self.1.similar_origin()) |
|
275 } |
|
276 |
|
277 fn dist2_squared(&self, Pair(ref u, ref v) : &Self) -> F { |
273 fn dist2_squared(&self, Pair(ref u, ref v) : &Self) -> F { |
278 self.0.dist2_squared(u) + self.1.dist2_squared(v) |
274 self.0.dist2_squared(u) + self.1.dist2_squared(v) |
279 } |
275 } |
280 } |
276 } |
281 |
277 |
283 where |
279 where |
284 U : Space, |
280 U : Space, |
285 V : Space, |
281 V : Space, |
286 A : AXPY<F, U>, |
282 A : AXPY<F, U>, |
287 B : AXPY<F, V>, |
283 B : AXPY<F, V>, |
288 F : Num |
284 F : Num, |
289 { |
285 Self : MulAssign<F>, |
|
286 Pair<A, B> : MulAssign<F>, |
|
287 Pair<A::Owned, B::Owned> : AXPY<F, Pair<U, V>>, |
|
288 { |
|
289 |
|
290 type Owned = Pair<A::Owned, B::Owned>; |
290 |
291 |
291 fn axpy<I : Instance<Pair<U,V>>>(&mut self, α : F, x : I, β : F) { |
292 fn axpy<I : Instance<Pair<U,V>>>(&mut self, α : F, x : I, β : F) { |
292 let Pair(u, v) = x.decompose(); |
293 let Pair(u, v) = x.decompose(); |
293 self.0.axpy(α, u, β); |
294 self.0.axpy(α, u, β); |
294 self.1.axpy(α, v, β); |
295 self.1.axpy(α, v, β); |
302 |
303 |
303 fn scale_from<I : Instance<Pair<U,V>>>(&mut self, α : F, x : I) { |
304 fn scale_from<I : Instance<Pair<U,V>>>(&mut self, α : F, x : I) { |
304 let Pair(u, v) = x.decompose(); |
305 let Pair(u, v) = x.decompose(); |
305 self.0.scale_from(α, u); |
306 self.0.scale_from(α, u); |
306 self.1.scale_from(α, v); |
307 self.1.scale_from(α, v); |
|
308 } |
|
309 |
|
310 /// Return a similar zero as `self`. |
|
311 fn similar_origin(&self) -> Self::Owned { |
|
312 Pair(self.0.similar_origin(), self.1.similar_origin()) |
|
313 } |
|
314 |
|
315 /// Set self to zero. |
|
316 fn set_zero(&mut self) { |
|
317 self.0.set_zero(); |
|
318 self.1.set_zero(); |
307 } |
319 } |
308 } |
320 } |
309 |
321 |
310 /// [`Decomposition`] for working with [`Pair`]s. |
322 /// [`Decomposition`] for working with [`Pair`]s. |
311 #[derive(Copy, Clone, Debug)] |
323 #[derive(Copy, Clone, Debug)] |