--- a/src/norms.rs Thu May 01 08:40:33 2025 -0500 +++ b/src/norms.rs Thu May 01 13:06:58 2025 -0500 @@ -92,7 +92,7 @@ /// /// println!("{}, {} {}", x.norm(L1), x.norm(L2), x.norm(Linfinity)) /// ``` -pub trait Norm<F: Num, Exponent: NormExponent> { +pub trait Norm<Exponent: NormExponent, F: Num = f64> { /// Calculate the norm. fn norm(&self, _p: Exponent) -> F; } @@ -110,7 +110,7 @@ } /// Trait for distances with respect to a norm. -pub trait Dist<F: Num, Exponent: NormExponent>: Norm<F, Exponent> + Space { +pub trait Dist<F: Num, Exponent: NormExponent>: Norm<Exponent, F> + Space { /// Calculate the distance fn dist<I: Instance<Self>>(&self, other: I, _p: Exponent) -> F; } @@ -125,7 +125,7 @@ /// /// println!("{:?}, {:?}", x.proj_ball(1.0, L2), x.proj_ball(0.5, Linfinity)); /// ``` -pub trait Projection<F: Num, Exponent: NormExponent>: Norm<F, Exponent> + Sized +pub trait Projection<F: Num, Exponent: NormExponent>: Norm<Exponent, F> + Sized where F: Float, { @@ -139,14 +139,14 @@ fn proj_ball_mut(&mut self, ρ: F, q: Exponent); } -/*impl<F : Float, E : Euclidean<F>> Norm<F, L2> for E { +/*impl<F : Float, E : Euclidean<F>> Norm<L2, F> for E { #[inline] fn norm(&self, _p : L2) -> F { self.norm2() } fn dist(&self, other : &Self, _p : L2) -> F { self.dist2(other) } }*/ -impl<F: Float, E: Euclidean<F> + Norm<F, L2>> Projection<F, L2> for E { +impl<F: Float, E: Euclidean<F> + Norm<L2, F>> Projection<F, L2> for E { #[inline] fn proj_ball(self, ρ: F, _p: L2) -> Self { self.proj_ball2(ρ) @@ -176,7 +176,7 @@ } } -impl<F: Float, E: Euclidean<F> + Normed<F, NormExp = L2>> Norm<F, HuberL1<F>> for E { +impl<F: Float, E: Euclidean<F> + Normed<F, NormExp = L2>> Norm<HuberL1<F>, F> for E { fn norm(&self, huber: HuberL1<F>) -> F { huber.apply(self.norm2_squared()) } @@ -188,7 +188,7 @@ } } -// impl<F : Float, E : Norm<F, L2>> Norm<F, L21> for Vec<E> { +// impl<F : Float, E : Norm<L2, F>> Norm<L21, F> for Vec<E> { // fn norm(&self, _l21 : L21) -> F { // self.iter().map(|e| e.norm(L2)).sum() // } @@ -204,7 +204,7 @@ where F: Float, E: NormExponent, - Domain: Space + Norm<F, E>, + Domain: Space + Norm<E, F>, { type Codomain = F; @@ -214,7 +214,7 @@ } } -pub trait Normed<F: Num = f64>: Space + Norm<F, Self::NormExp> { +pub trait Normed<F: Num = f64>: Space + Norm<Self::NormExp, F> { type NormExp: NormExponent; fn norm_exponent(&self) -> Self::NormExp; @@ -283,7 +283,7 @@ impl<C, F, D> Norm<F, Weighted<$exponent, C>> for D where F: Float, - D: Norm<F, $exponent>, + D: Norm<$exponent, F>, C: Constant<Type = F>, { fn norm(&self, e: Weighted<$exponent, C>) -> F {