Wed, 30 Apr 2025 01:06:25 -0500
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)) }