20 pub trait AXPY<F, X = Self> : Space + std::ops::MulAssign<F> |
20 pub trait AXPY<F, X = Self> : Space + std::ops::MulAssign<F> |
21 where |
21 where |
22 F : Num, |
22 F : Num, |
23 X : Space, |
23 X : Space, |
24 { |
24 { |
25 type Owned : AXPY<F, X>; |
|
26 |
|
27 /// Computes `βy + αx`, where `y` is `Self`. |
25 /// Computes `βy + αx`, where `y` is `Self`. |
28 fn add_mul<I : Instance<X>>(self, α : F, x : I, β : F) -> Self::Owned ; |
26 fn add_mul<I : Instance<X>>(self, α : F, x : I, β : F) -> X; |
29 |
27 |
30 /// Computes `y = βy + αx`, where `y` is `Self`. |
28 /// Computes `y = βy + αx`, where `y` is `Self`. |
31 fn axpy<I : Instance<X>>(&mut self, α : F, x : I, β : F); |
29 fn axpy<I : Instance<X>>(&mut self, α : F, x : I, β : F); |
32 |
30 |
33 /// Copies `x` to `self`. |
31 /// Copies `x` to `self`. |
39 fn scale_from<I : Instance<X>>(&mut self, α : F, x : I) { |
37 fn scale_from<I : Instance<X>>(&mut self, α : F, x : I) { |
40 self.axpy(α, x, 0.0) |
38 self.axpy(α, x, 0.0) |
41 } |
39 } |
42 |
40 |
43 /// Return a similar zero as `self`. |
41 /// Return a similar zero as `self`. |
44 fn similar_origin(&self) -> Self::Owned; |
42 fn similar_origin(&self) -> X; |
45 |
43 |
46 /// Set self to zero. |
44 /// Set self to zero. |
47 fn set_zero(&mut self); |
45 fn set_zero(&mut self); |
48 } |
46 } |
49 |
47 |
50 /// Efficient in-place application for [`Linear`] operators. |
48 /// Efficient in-place application for [`Linear`] operators. |
51 #[replace_float_literals(F::cast_from(literal))] |
49 #[replace_float_literals(F::cast_from(literal))] |
52 pub trait GEMV<F : Num, X : Space, Y : AXPY<F> = <Self as Mapping<X>>::Codomain> : Linear<X> { |
50 pub trait GEMV<F : Num, X : Space, Y : AXPY<F> = <Self as Mapping<X>>::Codomain> |
|
51 : Linear<X, Codomain=Y> |
|
52 { |
53 |
53 |
54 /// Computes `αAx + βy`, where `A` is `Self`. |
54 /// Computes `αAx + βy`, where `A` is `Self`. |
55 fn apply_add_mul<I : Instance<X>>(&self, y : Y, α : F, x : I, β : F) -> Y::Owned { |
55 fn apply_add_mul<I : Instance<X>>(&self, y : Y, α : F, x : I, β : F) -> Y { |
56 y.add_mul(α, self.apply(x), β) |
56 y.add_mul(α, self.apply(x), β) |
57 } |
57 } |
58 |
58 |
59 /// Computes `y = αAx + βy`, where `A` is `Self`. |
59 /// Computes `y = αAx + βy`, where `A` is `Self`. |
60 fn gemv<I : Instance<X>>(&self, y : &mut Y, α : F, x : I, β : F); |
60 fn gemv<I : Instance<X>>(&self, y : &mut Y, α : F, x : I, β : F); |