src/norms.rs

Tue, 13 May 2025 00:24:51 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Tue, 13 May 2025 00:24:51 -0500
branch
dev
changeset 139
f78885441218
parent 138
593912dc3293
child 145
0b9aecd7bb76
permissions
-rw-r--r--

new ZeroOp

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
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
593912dc3293 dual_origin
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
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
1256e7f7f7ad Added missing derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 100
diff changeset
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
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
106
1256e7f7f7ad Added missing derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 100
diff changeset
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
75d65fa74eba typofix
Tuomo Valkonen <tuomov@iki.fi>
parents: 6
diff changeset
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
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
41 /// 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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
45
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
51 /// Exponent type for 2,1-[`Norm`].
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
70 /// A Huber/Moreau–Yosida smoothed [`L1`] norm. (Not a norm itself.)
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
71 ///
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
72 /// 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
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
77
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
78 /// A Huber/Moreau–Yosida smoothed [`L21`] norm. (Not a norm itself.)
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
79 ///
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
80 /// 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
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
85
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
86 /// 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
87 ///
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
88 /// Use as
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 /// # use alg_tools::norms::{Norm, L1, L2, Linfinity};
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
91 /// # use alg_tools::loc::Loc;
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
92 /// let x = Loc([1.0, 2.0, 3.0]);
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
93 ///
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
94 /// println!("{}, {} {}", x.norm(L1), x.norm(L2), x.norm(Linfinity))
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
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
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
99 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
100
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
101 /// 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
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
106 /// 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
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
109 p_norm * self.norm_factor(p)
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
110 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
111 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
112
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
117 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
118
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
119 /// Trait for Euclidean projections to the `Exponent`-[`Norm`]-ball.
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
120 ///
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
121 /// Use as
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 /// # use alg_tools::norms::{Projection, L2, Linfinity};
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
124 /// # use alg_tools::loc::Loc;
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
125 /// let x = Loc([1.0, 2.0, 3.0]);
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
126 ///
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
127 /// 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
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
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
135 self.proj_ball_mut(ρ, q);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
136 self
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
137 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
138
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
141 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
142
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
144 #[inline]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
145 fn norm(&self, _p : L2) -> F { self.norm2() }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
146
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
147 fn dist(&self, other : &Self, _p : L2) -> F { self.dist2(other) }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
148 }*/
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
149
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
155
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
156 #[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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
160 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
164 let HuberL1(γ) = self;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
165 let xn = xnsq.sqrt();
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
166 if γ == F::ZERO {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
167 xn
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
168 } else {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
173 } else {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
174 xnsq / (F::TWO * γ)
0
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 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
177 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
178 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
182 huber.apply(self.norm2_squared())
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
183 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
184 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
185
109
943c6b3b9414 More Normed usage
Tuomo Valkonen <tuomov@iki.fi>
parents: 106
diff changeset
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
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
188 huber.apply(self.dist2_squared(other))
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
189 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
190 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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
d97fcf22a61c is_zero default
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
230 fn is_zero(&self) -> bool {
d97fcf22a61c is_zero default
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
231 self.norm_() == F::ZERO
d97fcf22a61c is_zero default
Tuomo Valkonen <tuomov@iki.fi>
parents: 109
diff changeset
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
593912dc3293 dual_origin
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
235 pub trait HasDual<F: Num = f64>: Normed<F> + AXPY<Field = F> {
593912dc3293 dual_origin
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
236 type DualSpace: Normed<F> + AXPY<Field = F>;
593912dc3293 dual_origin
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
237
593912dc3293 dual_origin
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
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
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
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
672aec2e1acd Weighted norms
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
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);

mercurial