More Normed usage dev

Wed, 30 Apr 2025 01:06:25 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Wed, 30 Apr 2025 01:06:25 -0500
branch
dev
changeset 109
943c6b3b9414
parent 108
6be459f08b66
child 110
a1278320be26

More Normed usage

src/convex.rs file | annotate | diff | comparison | revisions
src/mapping/dataterm.rs file | annotate | diff | comparison | revisions
src/mapping/quadratic.rs file | annotate | diff | comparison | revisions
src/norms.rs file | annotate | diff | comparison | revisions
--- a/src/convex.rs	Wed Apr 30 00:48:56 2025 -0500
+++ b/src/convex.rs	Wed Apr 30 01:06:25 2025 -0500
@@ -16,10 +16,8 @@
 ///
 /// TODO: should constrain `Mapping::Codomain` to implement a partial order,
 /// but this makes everything complicated with little benefit.
-pub trait ConvexMapping<Domain: Space, F: Num = f64>: Mapping<Domain, Codomain = F> {
-    /// Returns (a lower estimate of) the factor of strong convexity.
-    ///
-    /// TODO: should include a specification of the respective norm.
+pub trait ConvexMapping<Domain: Normed<F>, F: Num = f64>: Mapping<Domain, Codomain = F> {
+    /// Returns (a lower estimate of) the factor of strong convexity in the norm of `Domain`.
     fn factor_of_strong_convexity(&self) -> F {
         F::ZERO
     }
@@ -43,7 +41,7 @@
 /// but a `Preconjugable` mapping has to be convex.
 pub trait Preconjugable<Domain, Predual, F: Num = f64>: ConvexMapping<Domain, F>
 where
-    Domain: Space,
+    Domain: Normed<F>,
     Predual: HasDual<F>,
 {
     type Preconjugate<'a>: Mapping<Predual, Codomain = F>
@@ -90,7 +88,7 @@
 
 impl<Domain, E, F> ConvexMapping<Domain, F> for NormMapping<F, E>
 where
-    Domain: Space,
+    Domain: Normed<F>,
     E: NormExponent,
     F: Float,
     Self: Mapping<Domain, Codomain = F>,
@@ -116,7 +114,7 @@
 
 impl<Domain, E, F> ConvexMapping<Domain, F> for NormConstraint<F, E>
 where
-    Domain: Space,
+    Domain: Normed<F>,
     E: NormExponent,
     F: Float,
     Self: Mapping<Domain, Codomain = F>,
@@ -127,7 +125,7 @@
 where
     E: HasDualExponent,
     F: Float,
-    Domain: HasDual<F> + Norm<F, E> + Space,
+    Domain: HasDual<F> + Norm<F, E> + Normed<F>,
     <Domain as HasDual<F>>::DualSpace: Norm<F, E::DualExp>,
 {
     type Conjugate<'a>
@@ -209,7 +207,7 @@
 
 impl<F, E, Domain> Mapping<Domain> for NormProjection<F, E>
 where
-    Domain: Space + Projection<F, E>,
+    Domain: Normed<F> + Projection<F, E>,
     F: Float,
     E: NormExponent,
 {
@@ -239,7 +237,7 @@
     }
 }
 
-impl<Domain: Space, F: Num> ConvexMapping<Domain, F> for Zero<Domain, F> {}
+impl<Domain: Normed<F>, F: Float> ConvexMapping<Domain, F> for Zero<Domain, F> {}
 
 impl<Domain: HasDual<F>, F: Float> Conjugable<Domain, F> for Zero<Domain, F> {
     type Conjugate<'a>
@@ -255,7 +253,7 @@
 
 impl<Domain, Predual, F: Float> Preconjugable<Domain, Predual, F> for Zero<Domain, F>
 where
-    Domain: Space,
+    Domain: Normed<F>,
     Predual: HasDual<F>,
 {
     type Preconjugate<'a>
--- a/src/mapping/dataterm.rs	Wed Apr 30 00:48:56 2025 -0500
+++ b/src/mapping/dataterm.rs	Wed Apr 30 01:06:25 2025 -0500
@@ -5,11 +5,11 @@
 
 #![allow(non_snake_case)]
 
-use super::{DifferentiableImpl, DifferentiableMapping, /*LipschitzDifferentiableImpl,*/ Mapping,};
+use super::{DifferentiableImpl, DifferentiableMapping, LipschitzDifferentiableImpl, Mapping};
 use crate::convex::ConvexMapping;
 use crate::instance::{Instance, Space};
-use crate::linops::{/*BoundedLinear,*/ Linear, Preadjointable};
-//use crate::norms::{Norm, NormExponent, L2};
+use crate::linops::{BoundedLinear, Linear, Preadjointable};
+use crate::norms::{Normed, L2};
 use crate::types::Float;
 use std::ops::Sub;
 //use serde::{Deserialize, Serialize};
@@ -72,10 +72,10 @@
 impl<F, X, A, G> ConvexMapping<X, F> for DataTerm<F, X, A, G>
 where
     F: Float,
-    X: Space,
+    X: Normed<F>,
     A: Linear<X>,
     G: ConvexMapping<A::Codomain, F>,
-    A::Codomain: for<'a> Sub<&'a A::Codomain, Output = A::Codomain>,
+    A::Codomain: Normed<F> + for<'a> Sub<&'a A::Codomain, Output = A::Codomain>,
 {
 }
 
@@ -103,22 +103,18 @@
     }
 }
 
-/*
-impl<'a, F, X, ExpX, Y, ExpY, A, G> LipschitzDifferentiableImpl<X, ExpX> for DataTerm<F, X, A, G>
+impl<'a, F, X, Y, A, G> LipschitzDifferentiableImpl<X, X::NormExp> for DataTerm<F, X, A, G>
 where
     F: Float,
-    X: Space + Clone + Norm<F, ExpX>,
-    Y: Space + Norm<F, ExpY>,
-    ExpX: NormExponent,
-    ExpY: NormExponent,
-    A: Clone + BoundedLinear<X, ExpX, L2, F, Codomain = Y>,
-    G: Mapping<Y, Codomain = F> + LipschitzDifferentiableImpl<Y, ExpY>,
+    X: Normed<F> + Clone,
+    Y: Normed<F>,
+    A: Clone + BoundedLinear<X, X::NormExp, L2, F, Codomain = Y>,
+    G: Mapping<Y, Codomain = F> + LipschitzDifferentiableImpl<Y, Y::NormExp>,
     Self: DifferentiableImpl<X>,
 {
     type FloatType = F;
 
-    fn diff_lipschitz_factor(&self, seminorm: ExpX) -> Option<F> {
+    fn diff_lipschitz_factor(&self, seminorm: X::NormExp) -> Option<F> {
         Some(self.opA.opnorm_bound(seminorm, L2).powi(2))
     }
 }
-*/
--- a/src/mapping/quadratic.rs	Wed Apr 30 00:48:56 2025 -0500
+++ b/src/mapping/quadratic.rs	Wed Apr 30 01:06:25 2025 -0500
@@ -10,7 +10,7 @@
 use crate::euclidean::Euclidean;
 use crate::instance::{Instance, Space};
 use crate::linops::{BoundedLinear, Linear, Preadjointable};
-use crate::norms::{Norm, NormExponent, L2};
+use crate::norms::{Norm, NormExponent, Normed, L2};
 use crate::types::Float;
 use std::marker::PhantomData;
 
@@ -59,7 +59,7 @@
     }
 }
 
-impl<'a, F: Float, X: Space, A: Linear<X>> ConvexMapping<X, F> for Quadratic<'a, F, X, A> where
+impl<'a, F: Float, X: Normed<F>, A: Linear<X>> ConvexMapping<X, F> for Quadratic<'a, F, X, A> where
     A::Codomain: Euclidean<F>
 {
 }
--- a/src/norms.rs	Wed Apr 30 00:48:56 2025 -0500
+++ b/src/norms.rs	Wed Apr 30 01:06:25 2025 -0500
@@ -176,13 +176,13 @@
     }
 }
 
-impl<F: Float, E: Euclidean<F>> Norm<F, HuberL1<F>> for E {
+impl<F: Float, E: Euclidean<F> + Normed<F, NormExp = L2>> Norm<F, HuberL1<F>> for E {
     fn norm(&self, huber: HuberL1<F>) -> F {
         huber.apply(self.norm2_squared())
     }
 }
 
-impl<F: Float, E: Euclidean<F>> Dist<F, HuberL1<F>> for E {
+impl<F: Float, E: Euclidean<F> + Normed<F, NormExp = L2>> Dist<F, HuberL1<F>> for E {
     fn dist<I: Instance<Self>>(&self, other: I, huber: HuberL1<F>) -> F {
         huber.apply(self.dist2_squared(other))
     }

mercurial