--- 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, { }