src/norms.rs

branch
dev
changeset 124
6aa955ad8122
parent 113
d97fcf22a61c
child 131
8264d72aa347
child 138
593912dc3293
--- 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 {

mercurial