src/norms.rs

Tue, 31 Dec 2024 09:12:43 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Tue, 31 Dec 2024 09:12:43 -0500
branch
dev
changeset 81
d2acaaddd9af
parent 33
75d65fa74eba
permissions
-rw-r--r--

Try to have Field as member type in Mappings etc.

0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1 /*!
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
2 Norms, projections, etc.
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
3 */
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
5 use serde::Serialize;
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
6 use crate::types::*;
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
7 use crate::euclidean::*;
81
d2acaaddd9af Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
8 pub use crate::types::{HasScalarField, HasRealField};
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
9
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
10 //
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
11 // Abstract norms
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
12 //
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13
6
d80b87b8acd0 Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
14 /// An exponent for norms.
d80b87b8acd0 Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
15 ///
33
75d65fa74eba typofix
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
16 // Just a collection of desirable attributes for a marker type
6
d80b87b8acd0 Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
17 pub trait NormExponent : Copy + Send + Sync + 'static {}
d80b87b8acd0 Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
18
d80b87b8acd0 Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
19
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
20 /// Exponent type for the 1-[`Norm`].
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21 #[derive(Copy,Debug,Clone,Serialize,Eq,PartialEq)]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 pub struct L1;
6
d80b87b8acd0 Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
23 impl NormExponent for L1 {}
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
24
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
25 /// Exponent type for the 2-[`Norm`].
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 #[derive(Copy,Debug,Clone,Serialize,Eq,PartialEq)]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27 pub struct L2;
6
d80b87b8acd0 Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
28 impl NormExponent for L2 {}
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
30 /// Exponent type for the ∞-[`Norm`].
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31 #[derive(Copy,Debug,Clone,Serialize,Eq,PartialEq)]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32 pub struct Linfinity;
6
d80b87b8acd0 Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
33 impl NormExponent for Linfinity {}
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
35 /// Exponent type for 2,1-[`Norm`].
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
36 /// (1-norm over a domain Ω, 2-norm of a vector at each point of the domain.)
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37 #[derive(Copy,Debug,Clone,Serialize,Eq,PartialEq)]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38 pub struct L21;
6
d80b87b8acd0 Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
39 impl NormExponent for L21 {}
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
41 /// A Huber/Moreau–Yosida smoothed [`L1`] norm. (Not a norm itself.)
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
42 ///
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
43 /// The parameter γ of this type is the smoothing factor. Zero means no smoothing, and higher
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
44 /// values more smoothing. Behaviour with γ < 0 is undefined.
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
45 #[derive(Copy,Debug,Clone,Serialize,Eq,PartialEq)]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46 pub struct HuberL1<F : Float>(pub F);
6
d80b87b8acd0 Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
47 impl<F : Float> NormExponent for HuberL1<F> {}
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
49 /// A Huber/Moreau–Yosida smoothed [`L21`] norm. (Not a norm itself.)
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
50 ///
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
51 /// The parameter γ of this type is the smoothing factor. Zero means no smoothing, and higher
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
52 /// values more smoothing. Behaviour with γ < 0 is undefined.
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53 #[derive(Copy,Debug,Clone,Serialize,Eq,PartialEq)]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
54 pub struct HuberL21<F : Float>(pub F);
6
d80b87b8acd0 Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
55 impl<F : Float> NormExponent for HuberL21<F> {}
d80b87b8acd0 Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
56
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
57 /// A normed space (type) with exponent or other type `Exponent` for the norm.
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
58 ///
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
59 /// Use as
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
60 /// ```
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
61 /// # use alg_tools::norms::{Norm, L1, L2, Linfinity};
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
62 /// # use alg_tools::loc::Loc;
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
63 /// let x = Loc([1.0, 2.0, 3.0]);
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
64 ///
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
65 /// println!("{}, {} {}", x.norm(L1), x.norm(L2), x.norm(Linfinity))
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
66 /// ```
81
d2acaaddd9af Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
67 pub trait Norm<Exponent : NormExponent> : HasScalarField {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
68 /// Calculate the norm.
81
d2acaaddd9af Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
69 fn norm(&self, _p : Exponent) -> Self::Field;
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
70 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
71
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
72 /// Indicates that the `Self`-[`Norm`] is dominated by the `Exponent`-`Norm` on the space
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
73 /// `Elem` with the corresponding field `F`.
81
d2acaaddd9af Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
74 pub trait Dominated<Exponent : NormExponent, Elem>
d2acaaddd9af Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
75 where Elem : HasScalarField {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
76 /// Indicates the factor $c$ for the inequality $‖x‖ ≤ C ‖x‖_p$.
81
d2acaaddd9af Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
77 fn norm_factor(&self, p : Exponent) -> Elem::Field;
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
78 /// Given a norm-value $‖x‖_p$, calculates $C‖x‖_p$ such that $‖x‖ ≤ C‖x‖_p$
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
79 #[inline]
81
d2acaaddd9af Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
80 fn from_norm(&self, p_norm : Elem::Field, p : Exponent) -> Elem::Field {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81 p_norm * self.norm_factor(p)
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
82 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
83 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
84
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
85 /// Trait for distances with respect to a norm.
81
d2acaaddd9af Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
86 pub trait Dist<Exponent : NormExponent> : Norm<Exponent> {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
87 /// Calculate the distance
81
d2acaaddd9af Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
88 fn dist(&self, other : &Self, _p : Exponent) -> Self::Field;
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
89 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
90
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
91 /// Trait for Euclidean projections to the `Exponent`-[`Norm`]-ball.
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
92 ///
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
93 /// Use as
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
94 /// ```
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
95 /// # use alg_tools::norms::{Projection, L2, Linfinity};
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
96 /// # use alg_tools::loc::Loc;
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
97 /// let x = Loc([1.0, 2.0, 3.0]);
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
98 ///
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
99 /// println!("{:?}, {:?}", x.proj_ball(1.0, L2), x.proj_ball(0.5, Linfinity));
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
100 /// ```
81
d2acaaddd9af Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
101 pub trait Projection<Exponent : NormExponent> : Norm<Exponent> + Euclidean {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
102 /// Projection of `self` to the `q`-norm-ball of radius ρ.
81
d2acaaddd9af Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
103 fn proj_ball(mut self, ρ : Self::Field, q : Exponent) -> Self {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
104 self.proj_ball_mut(ρ, q);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
105 self
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
106 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
107
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
108 /// In-place projection of `self` to the `q`-norm-ball of radius ρ.
81
d2acaaddd9af Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
109 fn proj_ball_mut(&mut self, ρ : Self::Field, _q : Exponent);
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
110 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
111
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
112 /*impl<F : Float, E : Euclidean<F>> Norm<F, L2> for E {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
113 #[inline]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
114 fn norm(&self, _p : L2) -> F { self.norm2() }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
115
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
116 fn dist(&self, other : &Self, _p : L2) -> F { self.dist2(other) }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
117 }*/
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
118
81
d2acaaddd9af Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
119 impl<E : Norm<L2> + Euclidean> Projection<L2> for E {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
120 #[inline]
81
d2acaaddd9af Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
121 fn proj_ball(self, ρ : Self::Field, _p : L2) -> Self { self.proj_ball2(ρ) }
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
122
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
123 #[inline]
81
d2acaaddd9af Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
124 fn proj_ball_mut(&mut self, ρ : Self::Field, _p : L2) { self.proj_ball2_mut(ρ) }
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
125 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
126
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
127 impl<F : Float> HuberL1<F> {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
128 fn apply(self, xnsq : F) -> F {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
129 let HuberL1(γ) = self;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
130 let xn = xnsq.sqrt();
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
131 if γ == F::ZERO {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
132 xn
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
133 } else {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
134 if xn > γ {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
135 xn-γ / F::TWO
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
136 } else if xn<(-γ) {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
137 -xn-γ / F::TWO
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
138 } else {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
139 xnsq / (F::TWO * γ)
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
140 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
141 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
142 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
143 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
144
81
d2acaaddd9af Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
145 impl<F : Float, E : Euclidean<RealField=F>> Norm<HuberL1<F>> for E {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
146 fn norm(&self, huber : HuberL1<F>) -> F {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
147 huber.apply(self.norm2_squared())
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
148 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
149 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
150
81
d2acaaddd9af Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
151 impl<F : Float, E : Euclidean<RealField=F>> Dist<HuberL1<F>> for E {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
152 fn dist(&self, other : &Self, huber : HuberL1<F>) -> F {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
153 huber.apply(self.dist2_squared(other))
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
154 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
155 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
156

mercurial