src/linops.rs

branch
dev
changeset 151
402d717bb5c0
parent 150
c4e394a9c84c
child 152
dab30b331f49
--- a/src/linops.rs	Mon Sep 01 13:51:03 2025 -0500
+++ b/src/linops.rs	Mon Sep 01 20:55:34 2025 -0500
@@ -36,6 +36,8 @@
     + Sub<Self, Output = Self::Owned>
     + Sub<Self::Owned, Output = Self::Owned>
     + Neg
+    + for<'b> Add<&'b Self, Output = <Self as VectorSpace>::Owned>
+    + for<'b> Sub<&'b Self, Output = <Self as VectorSpace>::Owned>
 {
     type Field: Num;
     type Owned: ClosedSpace
@@ -69,6 +71,8 @@
     + AddAssign<Self::Owned>
     + SubAssign<Self>
     + SubAssign<Self::Owned>
+    + for<'b> AddAssign<&'b Self>
+    + for<'b> SubAssign<&'b Self>
 where
     X: Space,
 {
@@ -89,6 +93,9 @@
     fn set_zero(&mut self);
 }
 
+pub trait ClosedVectorSpace: Instance<Self> + VectorSpace<Owned = Self> {}
+impl<X: Instance<X> + VectorSpace<Owned = Self>> ClosedVectorSpace for X {}
+
 /// Efficient in-place application for [`Linear`] operators.
 #[replace_float_literals(F::cast_from(literal))]
 pub trait GEMV<F: Num, X: Space, Y = <Self as Mapping<X>>::Codomain>: Linear<X> {
@@ -141,7 +148,7 @@
     X: Space,
     Yʹ: Space,
 {
-    type AdjointCodomain: Space;
+    type AdjointCodomain: ClosedSpace;
     type Adjoint<'a>: Linear<Yʹ, Codomain = Self::AdjointCodomain>
     where
         Self: 'a;
@@ -163,7 +170,7 @@
 pub trait Preadjointable<X: Space, Ypre: Space = <Self as Mapping<X>>::Codomain>:
     Linear<X>
 {
-    type PreadjointCodomain: Space;
+    type PreadjointCodomain: ClosedSpace;
     type Preadjoint<'a>: Linear<Ypre, Codomain = Self::PreadjointCodomain>
     where
         Self: 'a;
@@ -190,10 +197,10 @@
 }
 
 impl<X: Space> Mapping<X> for IdOp<X> {
-    type Codomain = X::OwnedVariant;
+    type Codomain = X::OwnedSpace;
 
-    fn apply<I: Instance<X>>(&self, x: I) -> X {
-        x.own()
+    fn apply<I: Instance<X>>(&self, x: I) -> Self::Codomain {
+        x.own().into_owned()
     }
 }
 
@@ -226,10 +233,10 @@
     }
 }
 
-impl<X: Clone + Space> Adjointable<X, X> for IdOp<X> {
-    type AdjointCodomain = X;
+impl<X: Clone + Space> Adjointable<X, X::OwnedSpace> for IdOp<X> {
+    type AdjointCodomain = X::OwnedSpace;
     type Adjoint<'a>
-        = IdOp<X>
+        = IdOp<X::OwnedSpace>
     where
         X: 'a;
 
@@ -238,10 +245,10 @@
     }
 }
 
-impl<X: Clone + Space> Preadjointable<X, X> for IdOp<X> {
-    type PreadjointCodomain = X;
+impl<X: Clone + Space> Preadjointable<X, X::OwnedSpace> for IdOp<X> {
+    type PreadjointCodomain = X::OwnedSpace;
     type Preadjoint<'a>
-        = IdOp<X>
+        = IdOp<X::OwnedSpace>
     where
         X: 'a;
 
@@ -297,7 +304,7 @@
 where
     F: Num,
     X: VectorSpace<Field = F> + HasDual<F>,
-    X::DualSpace: VectorSpace<Owned = X::DualSpace>,
+    X::DualSpace: ClosedVectorSpace,
 {
     type AdjointCodomain = X::DualSpace;
     type Adjoint<'b>
@@ -460,9 +467,9 @@
     X: HasDual<F, DualSpace = Xprime>,
     Y: HasDual<F, DualSpace = Yprime>,
     F: Float,
-    Xprime: VectorSpace<Field = F, Owned = Xprime>,
-    Xprime::Owned: AXPY<Field = F>,
-    Yprime: Space + Instance<Yprime>,
+    Xprime: ClosedVectorSpace<Field = F>,
+    //Xprime::Owned: AXPY<Field = F>,
+    Yprime: ClosedSpace,
     OY: OriginGenerator<Y>,
     OXprime: OriginGenerator<X::DualSpace>,
 {
@@ -540,7 +547,7 @@
     S: Mapping<A>,
     T: Mapping<B>,
     S::Codomain: Add<T::Codomain>,
-    <S::Codomain as Add<T::Codomain>>::Output: Space,
+    <S::Codomain as Add<T::Codomain>>::Output: ClosedSpace,
 {
     type Codomain = <S::Codomain as Add<T::Codomain>>::Output;
 
@@ -556,7 +563,7 @@
     S: Linear<A>,
     T: Linear<B>,
     S::Codomain: Add<T::Codomain>,
-    <S::Codomain as Add<T::Codomain>>::Output: Space,
+    <S::Codomain as Add<T::Codomain>>::Output: ClosedSpace,
 {
 }
 
@@ -693,7 +700,7 @@
     A: Space,
     Xʹ: Space,
     Yʹ: Space,
-    R: Space + ClosedAdd,
+    R: ClosedSpace + ClosedAdd,
     S: Adjointable<A, Xʹ, AdjointCodomain = R>,
     T: Adjointable<A, Yʹ, AdjointCodomain = R>,
     Self: Linear<A>,
@@ -718,7 +725,7 @@
     A: Space,
     Xʹ: Space,
     Yʹ: Space,
-    R: Space + ClosedAdd,
+    R: ClosedSpace + ClosedAdd,
     S: Preadjointable<A, Xʹ, PreadjointCodomain = R>,
     T: Preadjointable<A, Yʹ, PreadjointCodomain = R>,
     Self: Linear<A>,
@@ -802,7 +809,7 @@
     B: Space,
     Xʹ: Space,
     Yʹ: Space,
-    R: Space,
+    R: ClosedSpace,
     S: Adjointable<A, Xʹ>,
     T: Adjointable<B, Yʹ>,
     Self: Linear<Pair<A, B>>,
@@ -825,7 +832,7 @@
     B: Space,
     Xʹ: Space,
     Yʹ: Space,
-    R: Space,
+    R: ClosedSpace,
     S: Preadjointable<A, Xʹ>,
     T: Preadjointable<B, Yʹ>,
     Self: Linear<Pair<A, B>>,
@@ -856,7 +863,7 @@
             S: BoundedLinear<A, ExpA, ExpR, F>,
             T: BoundedLinear<B, ExpB, ExpR, F>,
             S::Codomain: Add<T::Codomain>,
-            <S::Codomain as Add<T::Codomain>>::Output: Space,
+            <S::Codomain as Add<T::Codomain>>::Output: ClosedSpace,
             ExpA: NormExponent,
             ExpB: NormExponent,
             ExpR: NormExponent,
@@ -912,7 +919,8 @@
 impl<Domain, F> Mapping<Domain> for Scaled<F>
 where
     F: Float,
-    Domain: Space + ClosedMul<F>,
+    Domain: Space + Mul<F>,
+    <Domain as Mul<F>>::Output: ClosedSpace,
 {
     type Codomain = <Domain as Mul<F>>::Output;
 
@@ -925,6 +933,7 @@
 impl<Domain, F> Linear<Domain> for Scaled<F>
 where
     F: Float,
-    Domain: Space + ClosedMul<F>,
+    Domain: Space + Mul<F>,
+    <Domain as Mul<F>>::Output: ClosedSpace,
 {
 }

mercurial