280 A : AXPY<F, U>, |
280 A : AXPY<F, U>, |
281 B : AXPY<F, V>, |
281 B : AXPY<F, V>, |
282 F : Num, |
282 F : Num, |
283 Self : MulAssign<F>, |
283 Self : MulAssign<F>, |
284 Pair<A, B> : MulAssign<F>, |
284 Pair<A, B> : MulAssign<F>, |
285 Pair<A::Owned, B::Owned> : AXPY<F, Pair<U, V>>, |
285 { |
286 { |
286 |
287 |
287 fn add_mul<I : Instance<Pair<U,V>>>(self, α : F, x : I, β : F) -> Pair<U, V> { |
288 type Owned = Pair<A::Owned, B::Owned>; |
|
289 |
|
290 fn add_mul<I : Instance<Pair<U,V>>>(self, α : F, x : I, β : F) -> Self::Owned { |
|
291 let Pair(u, v) = x.decompose(); |
288 let Pair(u, v) = x.decompose(); |
292 Pair(self.0.add_mul(α, u, β), self.1.add_mul(α, v, β)) |
289 Pair(self.0.add_mul(α, u, β), self.1.add_mul(α, v, β)) |
293 } |
290 } |
294 |
291 |
295 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) { |
309 self.0.scale_from(α, u); |
306 self.0.scale_from(α, u); |
310 self.1.scale_from(α, v); |
307 self.1.scale_from(α, v); |
311 } |
308 } |
312 |
309 |
313 /// Return a similar zero as `self`. |
310 /// Return a similar zero as `self`. |
314 fn similar_origin(&self) -> Self::Owned { |
311 fn similar_origin(&self) -> Pair<U, V> { |
315 Pair(self.0.similar_origin(), self.1.similar_origin()) |
312 Pair(self.0.similar_origin(), self.1.similar_origin()) |
316 } |
313 } |
317 |
314 |
318 /// Set self to zero. |
315 /// Set self to zero. |
319 fn set_zero(&mut self) { |
316 fn set_zero(&mut self) { |