src/euclidean.rs

Mon, 01 Sep 2025 13:51:03 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Mon, 01 Sep 2025 13:51:03 -0500
branch
dev
changeset 150
c4e394a9c84c
parent 146
3f9a03f95457
child 151
402d717bb5c0
permissions
-rw-r--r--

fubar

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;
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
6 use crate::linops::{VectorSpace, AXPY};
63
f7b87d84864d Extra reflexivity and hilbert-like requirements for Euclidean. Fuse Dot into Euclidean.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
7 use crate::norms::{HasDual, Reflexive};
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
8 use crate::types::*;
132
89371dc4d637 Make Euclidean depend on AXPY
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
9 use std::ops::{Add, AddAssign, Sub, SubAssign};
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
10
146
3f9a03f95457 wrap sketch
Tuomo Valkonen <tuomov@iki.fi>
parents: 132
diff changeset
11 pub mod wrap;
3f9a03f95457 wrap sketch
Tuomo Valkonen <tuomov@iki.fi>
parents: 132
diff changeset
12
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
13 // TODO: Euclidean & EuclideanMut
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
14 //
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15 /// Space (type) with Euclidean and vector space structure
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
16 ///
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17 /// The type should implement vector space operations (addition, subtraction, scalar
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
18 /// 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
19 /// as an inner product.
132
89371dc4d637 Make Euclidean depend on AXPY
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
20 // TODO: remove F parameter, use AXPY::Field
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
21 pub trait Euclidean<F: Float = f64>:
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
22 HasDual<F, DualSpace = Self>
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
23 + VectorSpace<Field = F>
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
24 + Reflexive<F>
132
89371dc4d637 Make Euclidean depend on AXPY
Tuomo Valkonen <tuomov@iki.fi>
parents: 124
diff changeset
25 // TODO: move the following to AXPY
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
26 + for<'b> Add<&'b Self, Output = <Self as VectorSpace>::Owned>
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
27 + for<'b> Sub<&'b Self, Output = <Self as VectorSpace>::Owned>
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
28 + for<'b> AddAssign<&'b Self>
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
29 + for<'b> SubAssign<&'b Self>
63
f7b87d84864d Extra reflexivity and hilbert-like requirements for Euclidean. Fuse Dot into Euclidean.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
30 {
f7b87d84864d Extra reflexivity and hilbert-like requirements for Euclidean. Fuse Dot into Euclidean.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
31 // Inner product
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
32 fn dot<I: Instance<Self>>(&self, other: I) -> F;
63
f7b87d84864d Extra reflexivity and hilbert-like requirements for Euclidean. Fuse Dot into Euclidean.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
33
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34 /// 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
35 ///
f7b87d84864d Extra reflexivity and hilbert-like requirements for Euclidean. Fuse Dot into Euclidean.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
36 /// 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
37 /// `for <'a> &'a Self : Instance<Self>` trait bound bloat.
f7b87d84864d Extra reflexivity and hilbert-like requirements for Euclidean. Fuse Dot into Euclidean.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
38 fn norm2_squared(&self) -> F;
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 /// 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
41 /// where `self` is $x$.
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42 #[inline]
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
43 fn norm2_squared_div2(&self) -> F {
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
44 self.norm2_squared() / F::TWO
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
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
47 /// Calculate the 2-norm $‖x‖_2$, where `self` is $x$.
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 #[inline]
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
49 fn norm2(&self) -> F {
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50 self.norm2_squared().sqrt()
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-distance squared $\\|x-y\\|_2^2$, where `self` is $x$.
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
54 fn dist2_squared<I: Instance<Self>>(&self, y: I) -> F;
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
55
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
56 /// Calculate the 2-distance $\\|x-y\\|_2$, where `self` is $x$.
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
57 #[inline]
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
58 fn dist2<I: Instance<Self>>(&self, y: I) -> F {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
59 self.dist2_squared(y).sqrt()
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
60 }
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
61
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
62 /// Projection to the 2-ball.
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
63 #[inline]
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
64 fn proj_ball2(self, ρ: F) -> Self::Owned {
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
65 let r = self.norm2();
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
66 if r > ρ {
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
67 self * (ρ / r)
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
68 } else {
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
69 self.into_owned()
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
70 }
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
71 }
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
72 }
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
73
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
74 // TODO: remove F parameter, use AXPY::Field
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
75 pub trait EuclideanMut<F: Float = f64>:
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
76 Euclidean<F> + AXPY<Field = F> + for<'b> AddAssign<&'b Self> + for<'b> SubAssign<&'b Self>
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
77 {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
78 /// In-place projection to the 2-ball.
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
79 #[inline]
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
80 fn proj_ball2_mut(&mut self, ρ: F) {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81 let r = self.norm2();
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
82 if r > ρ {
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
83 *self *= ρ / r
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
84 }
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
85 }
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
86 }
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
87
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
88 impl<X, F: Float> EuclideanMut<F> for X where
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
89 X: Euclidean<F> + AXPY<Field = F> + for<'b> AddAssign<&'b Self> + for<'b> SubAssign<&'b Self>
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
90 {
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
91 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
92
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
93 /// Trait for [`Euclidean`] spaces with dimensions known at compile time.
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
94 pub trait StaticEuclidean<F: Float = f64>: Euclidean<F> {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
95 /// Returns the origin
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 146
diff changeset
96 fn origin() -> <Self as VectorSpace>::Owned;
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
97 }

mercurial