src/norms.rs

branch
dev
changeset 60
848ecc05becf
parent 59
9226980e45a7
child 63
f7b87d84864d
child 79
d63e40672dd6
equal deleted inserted replaced
59:9226980e45a7 60:848ecc05becf
117 /// # use alg_tools::loc::Loc; 117 /// # use alg_tools::loc::Loc;
118 /// let x = Loc([1.0, 2.0, 3.0]); 118 /// let x = Loc([1.0, 2.0, 3.0]);
119 /// 119 ///
120 /// println!("{:?}, {:?}", x.proj_ball(1.0, L2), x.proj_ball(0.5, Linfinity)); 120 /// println!("{:?}, {:?}", x.proj_ball(1.0, L2), x.proj_ball(0.5, Linfinity));
121 /// ``` 121 /// ```
122 pub trait Projection<F : Num, Exponent : NormExponent> : Norm<F, Exponent> + Euclidean<F> 122 pub trait Projection<F : Num, Exponent : NormExponent> : Norm<F, Exponent> + Sized
123 where F : Float { 123 where F : Float {
124 /// Projection of `self` to the `q`-norm-ball of radius ρ. 124 /// Projection of `self` to the `q`-norm-ball of radius ρ.
125 fn proj_ball(mut self, ρ : F, q : Exponent) -> Self { 125 fn proj_ball(mut self, ρ : F, q : Exponent) -> Self {
126 self.proj_ball_mut(ρ, q); 126 self.proj_ball_mut(ρ, q);
127 self 127 self
128 } 128 }
129 129
130 /// In-place projection of `self` to the `q`-norm-ball of radius ρ. 130 /// In-place projection of `self` to the `q`-norm-ball of radius ρ.
131 fn proj_ball_mut(&mut self, ρ : F, _q : Exponent); 131 fn proj_ball_mut(&mut self, ρ : F, q : Exponent);
132 } 132 }
133 133
134 /*impl<F : Float, E : Euclidean<F>> Norm<F, L2> for E { 134 /*impl<F : Float, E : Euclidean<F>> Norm<F, L2> for E {
135 #[inline] 135 #[inline]
136 fn norm(&self, _p : L2) -> F { self.norm2() } 136 fn norm(&self, _p : L2) -> F { self.norm2() }
200 fn apply<I : Instance<Domain>>(&self, x : I) -> F { 200 fn apply<I : Instance<Domain>>(&self, x : I) -> F {
201 x.eval(|r| r.norm(self.exponent)) 201 x.eval(|r| r.norm(self.exponent))
202 } 202 }
203 } 203 }
204 204
205 pub trait Normed<F : Num = f64> : Space + Norm<F, Self::NormExp> {
206 type NormExp : NormExponent;
207
208 fn norm_exponent(&self) -> Self::NormExp;
209
210 #[inline]
211 fn norm_(&self) -> F {
212 self.norm(self.norm_exponent())
213 }
214
215 // fn similar_origin(&self) -> Self;
216
217 fn is_zero(&self) -> bool;
218 }
219
220 pub trait HasDual<F : Num = f64> : Normed<F> {
221 type DualSpace : Normed<F>;
222 }
223
224 pub trait Reflexive<F : Num = f64> : HasDual<F>
225 where
226 Self::DualSpace : HasDual<F, DualSpace = Self>
227 { }
228
229
230 pub trait HasDualExponent : NormExponent {
231 type DualExp : NormExponent;
232
233 fn dual_exponent(&self) -> Self::DualExp;
234 }
235
236 impl HasDualExponent for L2 {
237 type DualExp = L2;
238
239 #[inline]
240 fn dual_exponent(&self) -> Self::DualExp {
241 L2
242 }
243 }
244
245 impl HasDualExponent for L1 {
246 type DualExp = Linfinity;
247
248 #[inline]
249 fn dual_exponent(&self) -> Self::DualExp {
250 Linfinity
251 }
252 }
253
254
255 impl HasDualExponent for Linfinity {
256 type DualExp = L1;
257
258 #[inline]
259 fn dual_exponent(&self) -> Self::DualExp {
260 L1
261 }
262 }
263
264
265
266

mercurial