src/dist.rs

Thu, 07 Nov 2024 13:35:28 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Thu, 07 Nov 2024 13:35:28 -0500
changeset 30
4fc8c93ed7e8
parent 17
ad68dacabe4f
child 53
60928f1440e0
permissions
-rw-r--r--

Add missing path options

13
f67949050a32 documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
1 /*!
f67949050a32 documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
2 Implementations of the distance function and the distance function squared, on manifolds.
f67949050a32 documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
3 */
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
5 use alg_tools::mapping::Apply;
17
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
6 use alg_tools::euclidean::Euclidean;
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
7 use crate::manifold::ManifoldPoint;
17
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
8 use crate::fb::{Grad, Desc, Prox};
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
9
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
10 /// Structure for distance-to functions
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
11 pub struct DistTo<M : ManifoldPoint>(pub M);
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
12
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13 impl<M : ManifoldPoint> Apply<M> for DistTo<M> {
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
14 type Output = f64;
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
16 fn apply(&self, x : M) -> Self::Output {
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
17 self.0.dist_to(&x)
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
18 }
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
19 }
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21 impl<'a, M : ManifoldPoint> Apply<&'a M> for DistTo<M> {
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 type Output = f64;
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
24 fn apply(&self, x : &'a M) -> Self::Output {
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
25 self.0.dist_to(x)
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 }
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27 }
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
28
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29 /// Structure for distance-to functions
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
30 pub struct DistToSquaredDiv2<M : ManifoldPoint>(pub M);
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32 impl<M : ManifoldPoint> Apply<M> for DistToSquaredDiv2<M> {
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33 type Output = f64;
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35 fn apply(&self, x : M) -> Self::Output {
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
36 let d = self.0.dist_to(&x);
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37 d*d / 2.0
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38 }
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39 }
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41 impl<'a, M : ManifoldPoint> Apply<&'a M> for DistToSquaredDiv2<M> {
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42 type Output = f64;
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
43
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
44 fn apply(&self, x : &'a M) -> Self::Output {
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
45 let d = self.0.dist_to(x);
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46 d*d / 2.0
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
47 }
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 }
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
49
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50 impl<M : ManifoldPoint> Desc<M> for DistToSquaredDiv2<M> {
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51 fn desc(&self, τ : f64, x : M) -> M {
8
17d71ca4ce84 Make exp consuming
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
52 let t = self.grad(&x) * τ;
17d71ca4ce84 Make exp consuming
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
53 x.exp(&t)
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
54 }
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
55 }
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
56
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
57 impl<M : ManifoldPoint> Grad<M> for DistToSquaredDiv2<M> {
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
58 fn grad(&self, x : &M) -> M::Tangent {
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
59 x.log(&self.0)
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
60 }
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
61 }
17
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
62
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
63 impl<M : ManifoldPoint> Prox<M> for DistTo<M> {
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
64 /// This is proximal map is a type of soft-thresholding on manifolds.
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
65 fn prox(&self, τ : f64, x : M) -> M {
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
66 let v = x.log(&self.0);
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
67 let d = v.norm2();
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
68 if d <= τ {
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
69 self.0.clone()
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
70 } else {
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
71 x.exp( &(v * (τ / d)) )
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
72 }
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
73 }
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
74 }

mercurial