# HG changeset patch # User Tuomo Valkonen # Date 1735660292 18000 # Node ID 981069ef919b2d2546cad60bf8e7deacbde754c9 # Parent 99ad55974e6201c1cd913dfe651a7fbf7848b2b1 Add add_mul to AXPY diff -r 99ad55974e62 -r 981069ef919b src/direct_product.rs --- a/src/direct_product.rs Mon Dec 30 15:46:28 2024 -0500 +++ b/src/direct_product.rs Tue Dec 31 10:51:32 2024 -0500 @@ -287,6 +287,11 @@ type Owned = Pair; + fn add_mul>>(self, α : F, x : I, β : F) -> Self::Owned { + let Pair(u, v) = x.decompose(); + Pair(self.0.add_mul(α, u, β), self.1.add_mul(α, v, β)) + } + fn axpy>>(&mut self, α : F, x : I, β : F) { let Pair(u, v) = x.decompose(); self.0.axpy(α, u, β); diff -r 99ad55974e62 -r 981069ef919b src/linops.rs --- a/src/linops.rs Mon Dec 30 15:46:28 2024 -0500 +++ b/src/linops.rs Tue Dec 31 10:51:32 2024 -0500 @@ -24,6 +24,9 @@ { type Owned : AXPY; + /// Computes `βy + αx`, where `y` is `Self`. + fn add_mul>(self, α : F, x : I, β : F) -> Self::Owned ; + /// Computes `y = βy + αx`, where `y` is `Self`. fn axpy>(&mut self, α : F, x : I, β : F); @@ -47,6 +50,7 @@ /// Efficient in-place application for [`Linear`] operators. #[replace_float_literals(F::cast_from(literal))] pub trait GEMV>::Codomain> : Linear { + /// Computes `y = αAx + βy`, where `A` is `Self`. fn gemv>(&self, y : &mut Y, α : F, x : I, β : F); diff -r 99ad55974e62 -r 981069ef919b src/loc.rs --- a/src/loc.rs Mon Dec 30 15:46:28 2024 -0500 +++ b/src/loc.rs Tue Dec 31 10:51:32 2024 -0500 @@ -709,6 +709,12 @@ type Owned = Self; #[inline] + fn add_mul>>(mut self, α : F, x : I, β : F) -> Self { + self.axpy(α, x, β); + self + } + + #[inline] fn axpy>>(&mut self, α : F, x : I, β : F) { x.eval(|x̃| { if β == F::ZERO { diff -r 99ad55974e62 -r 981069ef919b src/nalgebra_support.rs --- a/src/nalgebra_support.rs Mon Dec 30 15:46:28 2024 -0500 +++ b/src/nalgebra_support.rs Tue Dec 31 10:51:32 2024 -0500 @@ -91,6 +91,13 @@ type Owned = OVector; #[inline] + fn add_mul>>(self, α : E, x : I, β : E) -> Self::Owned { + let mut owned = self.into_owned(); + x.eval(|x̃| Matrix::axpy(&mut owned, α, x̃, β)); + owned + } + + #[inline] fn axpy>>(&mut self, α : E, x : I, β : E) { x.eval(|x̃| Matrix::axpy(self, α, x̃, β)) }