src/norms.rs

Tue, 24 Dec 2024 00:24:10 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Tue, 24 Dec 2024 00:24:10 -0500
branch
dev
changeset 70
672aec2e1acd
parent 64
4f6ca107ccb1
child 71
511bf440e24b
permissions
-rw-r--r--

Weighted norms

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;
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 33
diff changeset
6 use std::marker::PhantomData;
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
7 use crate::types::*;
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
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
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
10 use crate::operator_arithmetic::{Constant, Weighted};
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
11
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 // Abstract norms
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
14 //
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
75d65fa74eba typofix
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
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
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
33 /// Exponent type for the 1-[`Norm`].
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34 #[derive(Copy,Debug,Clone,Serialize,Eq,PartialEq)]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
38 /// Exponent type for the 2-[`Norm`].
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39 #[derive(Copy,Debug,Clone,Serialize,Eq,PartialEq)]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
43 /// Exponent type for the ∞-[`Norm`].
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
44 #[derive(Copy,Debug,Clone,Serialize,Eq,PartialEq)]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
47
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
48 /// Exponent type for 2,1-[`Norm`].
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
49 /// (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
50 #[derive(Copy,Debug,Clone,Serialize,Eq,PartialEq)]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53
70
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
54 impl<C : Constant, E : NormExponent> NormExponent for Weighted<E, C> {}
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
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
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
65 /// A Huber/Moreau–Yosida smoothed [`L1`] norm. (Not a norm itself.)
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
66 ///
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
67 /// 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
68 /// values more smoothing. Behaviour with γ < 0 is undefined.
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
69 #[derive(Copy,Debug,Clone,Serialize,Eq,PartialEq)]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
72
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
73 /// A Huber/Moreau–Yosida smoothed [`L21`] norm. (Not a norm itself.)
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
74 ///
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
75 /// 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
76 /// values more smoothing. Behaviour with γ < 0 is undefined.
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
77 #[derive(Copy,Debug,Clone,Serialize,Eq,PartialEq)]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
82 /// 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
83 ///
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
84 /// Use as
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
85 /// ```
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
86 /// # use alg_tools::norms::{Norm, L1, L2, Linfinity};
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
87 /// # use alg_tools::loc::Loc;
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
88 /// let x = Loc([1.0, 2.0, 3.0]);
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
89 ///
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
90 /// println!("{}, {} {}", x.norm(L1), x.norm(L2), x.norm(Linfinity))
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
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
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
93 /// Calculate the norm.
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
94 fn norm(&self, _p : Exponent) -> F;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
95 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
96
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
97 /// 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
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
100 /// Indicates the factor $c$ for the inequality $‖x‖ ≤ C ‖x‖_p$.
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
101 fn norm_factor(&self, p : Exponent) -> F;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
102 /// 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
103 #[inline]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
104 fn from_norm(&self, p_norm : F, p : Exponent) -> F {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
105 p_norm * self.norm_factor(p)
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 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
108
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
113 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
114
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
115 /// Trait for Euclidean projections to the `Exponent`-[`Norm`]-ball.
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
116 ///
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
117 /// Use as
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
118 /// ```
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
119 /// # use alg_tools::norms::{Projection, L2, Linfinity};
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
120 /// # use alg_tools::loc::Loc;
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
121 /// let x = Loc([1.0, 2.0, 3.0]);
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
122 ///
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
123 /// 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
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
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
127 /// Projection of `self` to the `q`-norm-ball of radius ρ.
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
128 fn proj_ball(mut self, ρ : F, q : Exponent) -> Self {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
129 self.proj_ball_mut(ρ, q);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
130 self
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
131 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
132
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
135 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
136
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
137 /*impl<F : Float, E : Euclidean<F>> Norm<F, L2> for E {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
138 #[inline]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
139 fn norm(&self, _p : L2) -> F { self.norm2() }
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 fn dist(&self, other : &Self, _p : L2) -> F { self.dist2(other) }
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 impl<F : Float, E : Euclidean<F> + Norm<F, L2>> Projection<F, L2> for E {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
145 #[inline]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
146 fn proj_ball(self, ρ : F, _p : L2) -> Self { self.proj_ball2(ρ) }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
147
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
148 #[inline]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
149 fn proj_ball_mut(&mut self, ρ : F, _p : L2) { self.proj_ball2_mut(ρ) }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
150 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
151
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
152 impl<F : Float> HuberL1<F> {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
153 fn apply(self, xnsq : F) -> F {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
154 let HuberL1(γ) = self;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
155 let xn = xnsq.sqrt();
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
156 if γ == F::ZERO {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
157 xn
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
158 } else {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
159 if xn > γ {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
160 xn-γ / F::TWO
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
161 } else if xn<(-γ) {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
162 -xn-γ / F::TWO
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
163 } else {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
164 xnsq / (F::TWO * γ)
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
165 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
166 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
167 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
168 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
169
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
170 impl<F : Float, E : Euclidean<F>> Norm<F, HuberL1<F>> for E {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
171 fn norm(&self, huber : HuberL1<F>) -> F {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
172 huber.apply(self.norm2_squared())
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
173 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
174 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
175
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
178 huber.apply(self.dist2_squared(other))
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
179 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
180 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
181
70
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
182 impl<C, F, E, D> Norm<F, Weighted<E, C>> for D
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
183 where
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
184 F : Float,
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
185 D : Norm<F, E>,
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
186 C : Constant<Type = F>,
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
187 E : NormExponent,
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
188 {
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
189 fn norm(&self, e : Weighted<E, C>) -> F {
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
190 let v = e.weight.value();
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
191 assert!(v > F::ZERO);
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
192 v * self.norm(e.base_fn)
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
193 }
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
194 }
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
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
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
286 impl<C : Constant, E : HasDualExponent> HasDualExponent for Weighted<E, C> {
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
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
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
289 fn dual_exponent(&self) -> Self::DualExp {
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
290 Weighted {
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
291 weight : C::Type::ONE / self.weight.value(),
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
292 base_fn : self.base_fn.dual_exponent()
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
293 }
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
294 }
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
295 }
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
296
70
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
297 impl<C, F, E, T> Projection<F, Weighted<E, C>> for T
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
298 where
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
299 T : Projection<F, E>,
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
300 F : Float,
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
301 C : Constant<Type = F>,
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
302 E : NormExponent,
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
303 {
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
304 fn proj_ball(self, ρ : F, q : Weighted<E, C>) -> Self {
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
305 self.proj_ball(ρ / q.weight.value(), q.base_fn)
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
306 }
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
307
70
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
308 fn proj_ball_mut(&mut self, ρ : F, q : Weighted<E, C>) {
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
309 self.proj_ball_mut(ρ / q.weight.value(), q.base_fn)
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
310 }
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
311 }

mercurial