src/linops.rs

branch
dev
changeset 133
2b13f8a0c8ba
parent 130
0a689881b0f1
child 139
f78885441218
--- a/src/linops.rs	Mon May 12 19:30:41 2025 -0500
+++ b/src/linops.rs	Mon May 12 20:40:14 2025 -0500
@@ -530,8 +530,7 @@
     type Codomain = <S::Codomain as Add<T::Codomain>>::Output;
 
     fn apply<I: Instance<Pair<A, B>>>(&self, x: I) -> Self::Codomain {
-        let Pair(a, b) = x.decompose();
-        self.0.apply(a) + self.1.apply(b)
+        x.eval_decompose(|Pair(a, b)| self.0.apply(a) + self.1.apply(b))
     }
 }
 
@@ -556,22 +555,25 @@
     Self: Linear<Pair<U, V>, Codomain = Y>,
 {
     fn gemv<I: Instance<Pair<U, V>>>(&self, y: &mut Y, α: F, x: I, β: F) {
-        let Pair(u, v) = x.decompose();
-        self.0.gemv(y, α, u, β);
-        self.1.gemv(y, α, v, F::ONE);
+        x.eval_decompose(|Pair(u, v)| {
+            self.0.gemv(y, α, u, β);
+            self.1.gemv(y, α, v, F::ONE);
+        })
     }
 
     fn apply_mut<I: Instance<Pair<U, V>>>(&self, y: &mut Y, x: I) {
-        let Pair(u, v) = x.decompose();
-        self.0.apply_mut(y, u);
-        self.1.apply_add(y, v);
+        x.eval_decompose(|Pair(u, v)| {
+            self.0.apply_mut(y, u);
+            self.1.apply_add(y, v);
+        })
     }
 
     /// Computes `y += Ax`, where `A` is `Self`
     fn apply_add<I: Instance<Pair<U, V>>>(&self, y: &mut Y, x: I) {
-        let Pair(u, v) = x.decompose();
-        self.0.apply_add(y, u);
-        self.1.apply_add(y, v);
+        x.eval_decompose(|Pair(u, v)| {
+            self.0.apply_add(y, u);
+            self.1.apply_add(y, v);
+        })
     }
 }
 
@@ -588,7 +590,7 @@
     type Codomain = Pair<S::Codomain, T::Codomain>;
 
     fn apply<I: Instance<A>>(&self, a: I) -> Self::Codomain {
-        Pair(self.0.apply(a.ref_instance()), self.1.apply(a))
+        Pair(a.eval_ref_decompose(|r| self.0.apply(r)), self.1.apply(a))
     }
 }
 
@@ -609,18 +611,18 @@
     Self: Linear<X, Codomain = Pair<A, B>>,
 {
     fn gemv<I: Instance<X>>(&self, y: &mut Pair<A, B>, α: F, x: I, β: F) {
-        self.0.gemv(&mut y.0, α, x.ref_instance(), β);
+        x.eval_ref_decompose(|r| self.0.gemv(&mut y.0, α, r, β));
         self.1.gemv(&mut y.1, α, x, β);
     }
 
     fn apply_mut<I: Instance<X>>(&self, y: &mut Pair<A, B>, x: I) {
-        self.0.apply_mut(&mut y.0, x.ref_instance());
+        x.eval_ref_decompose(|r| self.0.apply_mut(&mut y.0, r));
         self.1.apply_mut(&mut y.1, x);
     }
 
     /// Computes `y += Ax`, where `A` is `Self`
     fn apply_add<I: Instance<X>>(&self, y: &mut Pair<A, B>, x: I) {
-        self.0.apply_add(&mut y.0, x.ref_instance());
+        x.eval_ref_decompose(|r| self.0.apply_add(&mut y.0, r));
         self.1.apply_add(&mut y.1, x);
     }
 }
@@ -732,8 +734,7 @@
     type Codomain = Pair<S::Codomain, T::Codomain>;
 
     fn apply<I: Instance<Pair<A, B>>>(&self, x: I) -> Self::Codomain {
-        let Pair(a, b) = x.decompose();
-        Pair(self.0.apply(a), self.1.apply(b))
+        x.eval_decompose(|Pair(a, b)| Pair(self.0.apply(a), self.1.apply(b)))
     }
 }
 
@@ -758,22 +759,25 @@
     Self: Linear<Pair<U, V>, Codomain = Pair<A, B>>,
 {
     fn gemv<I: Instance<Pair<U, V>>>(&self, y: &mut Pair<A, B>, α: F, x: I, β: F) {
-        let Pair(u, v) = x.decompose();
-        self.0.gemv(&mut y.0, α, u, β);
-        self.1.gemv(&mut y.1, α, v, β);
+        x.eval_decompose(|Pair(u, v)| {
+            self.0.gemv(&mut y.0, α, u, β);
+            self.1.gemv(&mut y.1, α, v, β);
+        })
     }
 
     fn apply_mut<I: Instance<Pair<U, V>>>(&self, y: &mut Pair<A, B>, x: I) {
-        let Pair(u, v) = x.decompose();
-        self.0.apply_mut(&mut y.0, u);
-        self.1.apply_mut(&mut y.1, v);
+        x.eval_decompose(|Pair(u, v)| {
+            self.0.apply_mut(&mut y.0, u);
+            self.1.apply_mut(&mut y.1, v);
+        })
     }
 
     /// Computes `y += Ax`, where `A` is `Self`
     fn apply_add<I: Instance<Pair<U, V>>>(&self, y: &mut Pair<A, B>, x: I) {
-        let Pair(u, v) = x.decompose();
-        self.0.apply_add(&mut y.0, u);
-        self.1.apply_add(&mut y.1, v);
+        x.eval_decompose(|Pair(u, v)| {
+            self.0.apply_add(&mut y.0, u);
+            self.1.apply_add(&mut y.1, v);
+        })
     }
 }
 

mercurial