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