src/euclidean.rs

Mon, 12 May 2025 17:10:39 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Mon, 12 May 2025 17:10:39 -0500
branch
dev
changeset 131
8264d72aa347
parent 124
6aa955ad8122
permissions
-rw-r--r--

euclidean simplify fail

5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1 /*!
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
2 Euclidean spaces.
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
3 */
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4
63
f7b87d84864d Extra reflexivity and hilbert-like requirements for Euclidean. Fuse Dot into Euclidean.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
5 use crate::instance::Instance;
131
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
6 use crate::linops::AXPY;
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
7 use crate::norms::{HasDual, NormExponent, Normed, Reflexive, L2};
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
8 use crate::types::*;
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
9 use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign};
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
10
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
11 /// Space (type) with Euclidean and vector space structure
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
12 ///
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13 /// The type should implement vector space operations (addition, subtraction, scalar
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
14 /// multiplication and scalar division) along with their assignment versions, as well
63
f7b87d84864d Extra reflexivity and hilbert-like requirements for Euclidean. Fuse Dot into Euclidean.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
15 /// as an inner product.
131
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
16 pub trait Euclidean:
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
17 AXPY<Owned = Self::Owned_>
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
18 + HasDual<Self::Field, DualSpace = Self>
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
19 //+ Normed<Self::Field, NormExp = L2>
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
20 + Reflexive<Self::Field>
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
21 + Mul<Self::Field, Output = <Self as AXPY>::Owned>
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
22 + MulAssign<Self::Field>
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
23 + Div<Self::Field, Output = <Self as AXPY>::Owned>
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
24 + DivAssign<Self::Field>
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
25 + Add<Self, Output = <Self as AXPY>::Owned>
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
26 + Sub<Self, Output = <Self as AXPY>::Owned>
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
27 + for<'b> Add<&'b Self, Output = <Self as AXPY>::Owned>
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
28 + for<'b> Sub<&'b Self, Output = <Self as AXPY>::Owned>
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
29 + AddAssign<Self>
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
30 + for<'b> AddAssign<&'b Self>
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
31 + SubAssign<Self>
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
32 + for<'b> SubAssign<&'b Self>
131
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
33 + Neg<Output = <Self as AXPY>::Owned>
63
f7b87d84864d Extra reflexivity and hilbert-like requirements for Euclidean. Fuse Dot into Euclidean.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
34 {
131
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
35 type Owned_: Euclidean<Field = Self::Field>;
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36
63
f7b87d84864d Extra reflexivity and hilbert-like requirements for Euclidean. Fuse Dot into Euclidean.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
37 // Inner product
131
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
38 fn dot<I: Instance<Self>>(&self, other: I) -> Self::Field;
63
f7b87d84864d Extra reflexivity and hilbert-like requirements for Euclidean. Fuse Dot into Euclidean.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
39
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 /// Calculate the square of the 2-norm, $\frac{1}{2}\\|x\\|_2^2$, where `self` is $x$.
63
f7b87d84864d Extra reflexivity and hilbert-like requirements for Euclidean. Fuse Dot into Euclidean.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
41 ///
f7b87d84864d Extra reflexivity and hilbert-like requirements for Euclidean. Fuse Dot into Euclidean.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
42 /// This is not automatically implemented to avoid imposing
f7b87d84864d Extra reflexivity and hilbert-like requirements for Euclidean. Fuse Dot into Euclidean.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
43 /// `for <'a> &'a Self : Instance<Self>` trait bound bloat.
131
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
44 fn norm2_squared(&self) -> Self::Field;
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
45
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46 /// Calculate the square of the 2-norm divided by 2, $\frac{1}{2}\\|x\\|_2^2$,
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
47 /// where `self` is $x$.
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 #[inline]
131
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
49 fn norm2_squared_div2(&self) -> Self::Field {
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
50 self.norm2_squared() / Self::Field::TWO
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51 }
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
52
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53 /// Calculate the 2-norm $‖x‖_2$, where `self` is $x$.
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
54 #[inline]
131
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
55 fn norm2(&self) -> Self::Field {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
56 self.norm2_squared().sqrt()
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
57 }
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
58
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
59 /// Calculate the 2-distance squared $\\|x-y\\|_2^2$, where `self` is $x$.
131
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
60 fn dist2_squared<I: Instance<Self>>(&self, y: I) -> Self::Field;
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
61
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
62 /// Calculate the 2-distance $\\|x-y\\|_2$, where `self` is $x$.
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
63 #[inline]
131
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
64 fn dist2<I: Instance<Self>>(&self, y: I) -> Self::Field {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
65 self.dist2_squared(y).sqrt()
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
66 }
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
67
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
68 /// Projection to the 2-ball.
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
69 #[inline]
131
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
70 fn proj_ball2(mut self, ρ: Self::Field) -> Self {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
71 self.proj_ball2_mut(ρ);
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
72 self
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
73 }
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
74
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
75 /// In-place projection to the 2-ball.
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
76 #[inline]
131
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
77 fn proj_ball2_mut(&mut self, ρ: Self::Field) {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
78 let r = self.norm2();
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
79 if r > ρ {
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
80 *self *= ρ / r
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81 }
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
82 }
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
83 }
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
84
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
85 /// Trait for [`Euclidean`] spaces with dimensions known at compile time.
131
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
86 pub trait StaticEuclidean: Euclidean {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
87 /// Returns the origin
131
8264d72aa347 euclidean simplify fail
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
88 fn origin() -> <Self as AXPY>::Owned;
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
89 }

mercurial