Tue, 24 Dec 2024 00:24:10 -0500
Weighted norms
0 | 1 | /*! |
2 | Norms, projections, etc. | |
3 | */ | |
4 | ||
5 | 5 | use serde::Serialize; |
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
6 | use std::marker::PhantomData; |
0 | 7 | use crate::types::*; |
5 | 8 | use crate::euclidean::*; |
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
9 | use crate::mapping::{Mapping, Space, Instance}; |
70 | 10 | use crate::operator_arithmetic::{Constant, Weighted}; |
0 | 11 | |
12 | // | |
13 | // Abstract norms | |
14 | // | |
15 | ||
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
16 | #[derive(Copy,Clone,Debug)] |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
17 | /// Helper structure to convert a [`NormExponent`] into a [`Mapping`] |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
18 | pub struct NormMapping<F : Float, E : NormExponent>{ |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
19 | pub(crate) exponent : E, |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
20 | _phantoms : PhantomData<F> |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
21 | } |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
22 | |
6
d80b87b8acd0
Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
23 | /// An exponent for norms. |
d80b87b8acd0
Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
24 | /// |
33 | 25 | // Just a collection of desirable attributes for a marker type |
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
26 | pub trait NormExponent : Copy + Send + Sync + 'static { |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
27 | /// Return the norm as a mappin |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
28 | fn as_mapping<F : Float>(self) -> NormMapping<F, Self> { |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
29 | NormMapping{ exponent : self, _phantoms : PhantomData } |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
30 | } |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
31 | } |
6
d80b87b8acd0
Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
32 | |
5 | 33 | /// Exponent type for the 1-[`Norm`]. |
0 | 34 | #[derive(Copy,Debug,Clone,Serialize,Eq,PartialEq)] |
35 | pub struct L1; | |
6
d80b87b8acd0
Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
36 | impl NormExponent for L1 {} |
0 | 37 | |
5 | 38 | /// Exponent type for the 2-[`Norm`]. |
0 | 39 | #[derive(Copy,Debug,Clone,Serialize,Eq,PartialEq)] |
40 | pub struct L2; | |
6
d80b87b8acd0
Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
41 | impl NormExponent for L2 {} |
0 | 42 | |
5 | 43 | /// Exponent type for the ∞-[`Norm`]. |
0 | 44 | #[derive(Copy,Debug,Clone,Serialize,Eq,PartialEq)] |
45 | pub struct Linfinity; | |
6
d80b87b8acd0
Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
46 | impl NormExponent for Linfinity {} |
0 | 47 | |
5 | 48 | /// Exponent type for 2,1-[`Norm`]. |
49 | /// (1-norm over a domain Ω, 2-norm of a vector at each point of the domain.) | |
0 | 50 | #[derive(Copy,Debug,Clone,Serialize,Eq,PartialEq)] |
51 | pub struct L21; | |
6
d80b87b8acd0
Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
52 | impl NormExponent for L21 {} |
0 | 53 | |
70 | 54 | impl<C : Constant, E : NormExponent> NormExponent for Weighted<E, C> {} |
55 | ||
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
56 | /// Norms for pairs (a, b). ‖(a,b)‖ = ‖(‖a‖_A, ‖b‖_B)‖_J |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
57 | /// For use with [`crate::direct_product::Pair`] |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
58 | #[derive(Copy,Debug,Clone,Serialize,Eq,PartialEq)] |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
59 | pub struct PairNorm<A, B, J>(pub A, pub B, pub J); |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
60 | |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
61 | impl<A, B, J> NormExponent for PairNorm<A, B, J> |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
62 | where A : NormExponent, B : NormExponent, J : NormExponent {} |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
63 | |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
64 | |
5 | 65 | /// A Huber/Moreau–Yosida smoothed [`L1`] norm. (Not a norm itself.) |
66 | /// | |
67 | /// The parameter γ of this type is the smoothing factor. Zero means no smoothing, and higher | |
68 | /// values more smoothing. Behaviour with γ < 0 is undefined. | |
0 | 69 | #[derive(Copy,Debug,Clone,Serialize,Eq,PartialEq)] |
70 | 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
|
71 | impl<F : Float> NormExponent for HuberL1<F> {} |
0 | 72 | |
5 | 73 | /// A Huber/Moreau–Yosida smoothed [`L21`] norm. (Not a norm itself.) |
74 | /// | |
75 | /// The parameter γ of this type is the smoothing factor. Zero means no smoothing, and higher | |
76 | /// values more smoothing. Behaviour with γ < 0 is undefined. | |
0 | 77 | #[derive(Copy,Debug,Clone,Serialize,Eq,PartialEq)] |
78 | 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
|
79 | impl<F : Float> NormExponent for HuberL21<F> {} |
d80b87b8acd0
Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
80 | |
0 | 81 | |
5 | 82 | /// A normed space (type) with exponent or other type `Exponent` for the norm. |
83 | /// | |
84 | /// Use as | |
85 | /// ``` | |
86 | /// # use alg_tools::norms::{Norm, L1, L2, Linfinity}; | |
87 | /// # use alg_tools::loc::Loc; | |
88 | /// let x = Loc([1.0, 2.0, 3.0]); | |
89 | /// | |
90 | /// println!("{}, {} {}", x.norm(L1), x.norm(L2), x.norm(Linfinity)) | |
91 | /// ``` | |
6
d80b87b8acd0
Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
92 | pub trait Norm<F : Num, Exponent : NormExponent> { |
5 | 93 | /// Calculate the norm. |
0 | 94 | fn norm(&self, _p : Exponent) -> F; |
95 | } | |
96 | ||
5 | 97 | /// Indicates that the `Self`-[`Norm`] is dominated by the `Exponent`-`Norm` on the space |
98 | /// `Elem` with the corresponding field `F`. | |
6
d80b87b8acd0
Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
99 | pub trait Dominated<F : Num, Exponent : NormExponent, Elem> { |
0 | 100 | /// Indicates the factor $c$ for the inequality $‖x‖ ≤ C ‖x‖_p$. |
101 | fn norm_factor(&self, p : Exponent) -> F; | |
102 | /// Given a norm-value $‖x‖_p$, calculates $C‖x‖_p$ such that $‖x‖ ≤ C‖x‖_p$ | |
103 | #[inline] | |
104 | fn from_norm(&self, p_norm : F, p : Exponent) -> F { | |
105 | p_norm * self.norm_factor(p) | |
106 | } | |
107 | } | |
108 | ||
5 | 109 | /// Trait for distances with respect to a norm. |
64
4f6ca107ccb1
More Instance parametrisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
110 | pub trait Dist<F : Num, Exponent : NormExponent> : Norm<F, Exponent> + Space { |
0 | 111 | /// Calculate the distance |
64
4f6ca107ccb1
More Instance parametrisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
112 | fn dist<I : Instance<Self>>(&self, other : I, _p : Exponent) -> F; |
0 | 113 | } |
114 | ||
5 | 115 | /// Trait for Euclidean projections to the `Exponent`-[`Norm`]-ball. |
116 | /// | |
117 | /// Use as | |
118 | /// ``` | |
119 | /// # use alg_tools::norms::{Projection, L2, Linfinity}; | |
120 | /// # use alg_tools::loc::Loc; | |
121 | /// let x = Loc([1.0, 2.0, 3.0]); | |
122 | /// | |
123 | /// println!("{:?}, {:?}", x.proj_ball(1.0, L2), x.proj_ball(0.5, Linfinity)); | |
124 | /// ``` | |
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
125 | pub trait Projection<F : Num, Exponent : NormExponent> : Norm<F, Exponent> + Sized |
6
d80b87b8acd0
Added NormExponent trait for exponents of norms
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
126 | where F : Float { |
5 | 127 | /// Projection of `self` to the `q`-norm-ball of radius ρ. |
0 | 128 | fn proj_ball(mut self, ρ : F, q : Exponent) -> Self { |
129 | self.proj_ball_mut(ρ, q); | |
130 | self | |
131 | } | |
132 | ||
5 | 133 | /// In-place projection of `self` to the `q`-norm-ball of radius ρ. |
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
134 | fn proj_ball_mut(&mut self, ρ : F, q : Exponent); |
0 | 135 | } |
136 | ||
137 | /*impl<F : Float, E : Euclidean<F>> Norm<F, L2> for E { | |
138 | #[inline] | |
139 | fn norm(&self, _p : L2) -> F { self.norm2() } | |
140 | ||
141 | fn dist(&self, other : &Self, _p : L2) -> F { self.dist2(other) } | |
142 | }*/ | |
143 | ||
144 | impl<F : Float, E : Euclidean<F> + Norm<F, L2>> Projection<F, L2> for E { | |
145 | #[inline] | |
146 | fn proj_ball(self, ρ : F, _p : L2) -> Self { self.proj_ball2(ρ) } | |
147 | ||
148 | #[inline] | |
149 | fn proj_ball_mut(&mut self, ρ : F, _p : L2) { self.proj_ball2_mut(ρ) } | |
150 | } | |
151 | ||
152 | impl<F : Float> HuberL1<F> { | |
153 | fn apply(self, xnsq : F) -> F { | |
154 | let HuberL1(γ) = self; | |
155 | let xn = xnsq.sqrt(); | |
156 | if γ == F::ZERO { | |
157 | xn | |
158 | } else { | |
159 | if xn > γ { | |
5 | 160 | xn-γ / F::TWO |
0 | 161 | } else if xn<(-γ) { |
5 | 162 | -xn-γ / F::TWO |
0 | 163 | } else { |
5 | 164 | xnsq / (F::TWO * γ) |
0 | 165 | } |
166 | } | |
167 | } | |
168 | } | |
169 | ||
170 | impl<F : Float, E : Euclidean<F>> Norm<F, HuberL1<F>> for E { | |
171 | fn norm(&self, huber : HuberL1<F>) -> F { | |
172 | huber.apply(self.norm2_squared()) | |
173 | } | |
174 | } | |
175 | ||
176 | impl<F : Float, E : Euclidean<F>> Dist<F, HuberL1<F>> for E { | |
64
4f6ca107ccb1
More Instance parametrisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
177 | fn dist<I : Instance<Self>>(&self, other : I, huber : HuberL1<F>) -> F { |
0 | 178 | huber.apply(self.dist2_squared(other)) |
179 | } | |
180 | } | |
181 | ||
70 | 182 | impl<C, F, E, D> Norm<F, Weighted<E, C>> for D |
183 | where | |
184 | F : Float, | |
185 | D : Norm<F, E>, | |
186 | C : Constant<Type = F>, | |
187 | E : NormExponent, | |
188 | { | |
189 | fn norm(&self, e : Weighted<E, C>) -> F { | |
190 | let v = e.weight.value(); | |
191 | assert!(v > F::ZERO); | |
192 | v * self.norm(e.base_fn) | |
193 | } | |
194 | } | |
195 | ||
64
4f6ca107ccb1
More Instance parametrisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
196 | // impl<F : Float, E : Norm<F, L2>> Norm<F, L21> for Vec<E> { |
4f6ca107ccb1
More Instance parametrisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
197 | // fn norm(&self, _l21 : L21) -> F { |
4f6ca107ccb1
More Instance parametrisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
198 | // self.iter().map(|e| e.norm(L2)).sum() |
4f6ca107ccb1
More Instance parametrisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
199 | // } |
4f6ca107ccb1
More Instance parametrisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
200 | // } |
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
201 | |
64
4f6ca107ccb1
More Instance parametrisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
202 | // impl<F : Float, E : Dist<F, L2>> Dist<F, L21> for Vec<E> { |
4f6ca107ccb1
More Instance parametrisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
203 | // fn dist<I : Instance<Self>>(&self, other : I, _l21 : L21) -> F { |
4f6ca107ccb1
More Instance parametrisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
204 | // self.iter().zip(other.iter()).map(|(e, g)| e.dist(g, L2)).sum() |
4f6ca107ccb1
More Instance parametrisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
205 | // } |
4f6ca107ccb1
More Instance parametrisation
Tuomo Valkonen <tuomov@iki.fi>
parents:
63
diff
changeset
|
206 | // } |
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
207 | |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
208 | impl<E, F, Domain> Mapping<Domain> for NormMapping<F, E> |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
209 | where |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
210 | F : Float, |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
211 | E : NormExponent, |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
212 | Domain : Space + Norm<F, E>, |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
213 | { |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
214 | type Codomain = F; |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
215 | |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
216 | #[inline] |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
217 | fn apply<I : Instance<Domain>>(&self, x : I) -> F { |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
218 | x.eval(|r| r.norm(self.exponent)) |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
219 | } |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
220 | } |
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
33
diff
changeset
|
221 | |
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
222 | pub trait Normed<F : Num = f64> : Space + Norm<F, Self::NormExp> { |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
223 | type NormExp : NormExponent; |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
224 | |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
225 | fn norm_exponent(&self) -> Self::NormExp; |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
226 | |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
227 | #[inline] |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
228 | fn norm_(&self) -> F { |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
229 | self.norm(self.norm_exponent()) |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
230 | } |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
231 | |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
232 | // fn similar_origin(&self) -> Self; |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
233 | |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
234 | fn is_zero(&self) -> bool; |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
235 | } |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
236 | |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
237 | pub trait HasDual<F : Num = f64> : Normed<F> { |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
238 | type DualSpace : Normed<F>; |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
239 | } |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
240 | |
63
f7b87d84864d
Extra reflexivity and hilbert-like requirements for Euclidean. Fuse Dot into Euclidean.
Tuomo Valkonen <tuomov@iki.fi>
parents:
60
diff
changeset
|
241 | /// Automatically implemented trait for reflexive spaces |
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
242 | pub trait Reflexive<F : Num = f64> : HasDual<F> |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
243 | where |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
244 | Self::DualSpace : HasDual<F, DualSpace = Self> |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
245 | { } |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
246 | |
63
f7b87d84864d
Extra reflexivity and hilbert-like requirements for Euclidean. Fuse Dot into Euclidean.
Tuomo Valkonen <tuomov@iki.fi>
parents:
60
diff
changeset
|
247 | impl<F : Num, X : HasDual<F>> Reflexive<F> for X |
f7b87d84864d
Extra reflexivity and hilbert-like requirements for Euclidean. Fuse Dot into Euclidean.
Tuomo Valkonen <tuomov@iki.fi>
parents:
60
diff
changeset
|
248 | where |
f7b87d84864d
Extra reflexivity and hilbert-like requirements for Euclidean. Fuse Dot into Euclidean.
Tuomo Valkonen <tuomov@iki.fi>
parents:
60
diff
changeset
|
249 | X::DualSpace : HasDual<F, DualSpace = X> |
f7b87d84864d
Extra reflexivity and hilbert-like requirements for Euclidean. Fuse Dot into Euclidean.
Tuomo Valkonen <tuomov@iki.fi>
parents:
60
diff
changeset
|
250 | { } |
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
251 | |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
252 | pub trait HasDualExponent : NormExponent { |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
253 | type DualExp : NormExponent; |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
254 | |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
255 | fn dual_exponent(&self) -> Self::DualExp; |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
256 | } |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
257 | |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
258 | impl HasDualExponent for L2 { |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
259 | type DualExp = L2; |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
260 | |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
261 | #[inline] |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
262 | fn dual_exponent(&self) -> Self::DualExp { |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
263 | L2 |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
264 | } |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
265 | } |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
266 | |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
267 | impl HasDualExponent for L1 { |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
268 | type DualExp = Linfinity; |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
269 | |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
270 | #[inline] |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
271 | fn dual_exponent(&self) -> Self::DualExp { |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
272 | Linfinity |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
273 | } |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
274 | } |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
275 | |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
276 | |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
277 | impl HasDualExponent for Linfinity { |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
278 | type DualExp = L1; |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
279 | |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
280 | #[inline] |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
281 | fn dual_exponent(&self) -> Self::DualExp { |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
282 | L1 |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
283 | } |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
284 | } |
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
285 | |
70 | 286 | impl<C : Constant, E : HasDualExponent> HasDualExponent for Weighted<E, C> { |
287 | type DualExp = Weighted<E::DualExp, C::Type>; | |
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
288 | |
70 | 289 | fn dual_exponent(&self) -> Self::DualExp { |
290 | Weighted { | |
291 | weight : C::Type::ONE / self.weight.value(), | |
292 | base_fn : self.base_fn.dual_exponent() | |
293 | } | |
294 | } | |
295 | } | |
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
296 | |
70 | 297 | impl<C, F, E, T> Projection<F, Weighted<E, C>> for T |
298 | where | |
299 | T : Projection<F, E>, | |
300 | F : Float, | |
301 | C : Constant<Type = F>, | |
302 | E : NormExponent, | |
303 | { | |
304 | fn proj_ball(self, ρ : F, q : Weighted<E, C>) -> Self { | |
305 | self.proj_ball(ρ / q.weight.value(), q.base_fn) | |
306 | } | |
60
848ecc05becf
More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
59
diff
changeset
|
307 | |
70 | 308 | fn proj_ball_mut(&mut self, ρ : F, q : Weighted<E, C>) { |
309 | self.proj_ball_mut(ρ / q.weight.value(), q.base_fn) | |
310 | } | |
311 | } |