--- a/src/direct_product.rs Tue Dec 31 08:30:43 2024 -0500 +++ b/src/direct_product.rs Sat Dec 21 23:32:20 2024 -0500 @@ -270,10 +270,6 @@ { type Output = PairOutput<F, A, B>; - fn similar_origin(&self) -> PairOutput<F, A, B> { - Pair(self.0.similar_origin(), self.1.similar_origin()) - } - fn dist2_squared(&self, Pair(ref u, ref v) : &Self) -> F { self.0.dist2_squared(u) + self.1.dist2_squared(v) } @@ -285,9 +281,14 @@ V : Space, A : AXPY<F, U>, B : AXPY<F, V>, - F : Num + F : Num, + Self : MulAssign<F>, + Pair<A, B> : MulAssign<F>, + Pair<A::Owned, B::Owned> : AXPY<F, Pair<U, V>>, { + type Owned = Pair<A::Owned, B::Owned>; + fn axpy<I : Instance<Pair<U,V>>>(&mut self, α : F, x : I, β : F) { let Pair(u, v) = x.decompose(); self.0.axpy(α, u, β); @@ -305,6 +306,17 @@ self.0.scale_from(α, u); self.1.scale_from(α, v); } + + /// Return a similar zero as `self`. + fn similar_origin(&self) -> Self::Owned { + Pair(self.0.similar_origin(), self.1.similar_origin()) + } + + /// Set self to zero. + fn set_zero(&mut self) { + self.0.set_zero(); + self.1.set_zero(); + } } /// [`Decomposition`] for working with [`Pair`]s.