src/direct_product.rs

branch
dev
changeset 62
d8305c9b6fdf
parent 60
848ecc05becf
child 63
f7b87d84864d
--- 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.

mercurial