src/dist.rs

Fri, 28 Mar 2025 08:36:08 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Fri, 28 Mar 2025 08:36:08 -0500
changeset 59
743984f4664e
parent 55
15f01efc034b
permissions
-rw-r--r--

Add auxiliary results

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
55
15f01efc034b alg_tools update
Tuomo Valkonen <tuomov@iki.fi>
parents: 53
diff changeset
5 use alg_tools::mapping::{Mapping, Instance};
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
55
15f01efc034b alg_tools update
Tuomo Valkonen <tuomov@iki.fi>
parents: 53
diff changeset
13 impl<M : ManifoldPoint> Mapping<M> for DistTo<M> {
15f01efc034b alg_tools update
Tuomo Valkonen <tuomov@iki.fi>
parents: 53
diff changeset
14 type Codomain = f64;
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15
55
15f01efc034b alg_tools update
Tuomo Valkonen <tuomov@iki.fi>
parents: 53
diff changeset
16 fn apply<I : Instance<M>>(&self, x : I) -> Self::Codomain {
15f01efc034b alg_tools update
Tuomo Valkonen <tuomov@iki.fi>
parents: 53
diff changeset
17 x.eval(|x̃| 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 /// Structure for distance-to functions
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
22 pub struct DistToSquaredDiv2<M : ManifoldPoint>(pub M);
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23
55
15f01efc034b alg_tools update
Tuomo Valkonen <tuomov@iki.fi>
parents: 53
diff changeset
24 impl<M : ManifoldPoint> Mapping<M> for DistToSquaredDiv2<M> {
15f01efc034b alg_tools update
Tuomo Valkonen <tuomov@iki.fi>
parents: 53
diff changeset
25 type Codomain = f64;
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26
55
15f01efc034b alg_tools update
Tuomo Valkonen <tuomov@iki.fi>
parents: 53
diff changeset
27 fn apply<I : Instance<M>>(&self, x : I) -> Self::Codomain {
15f01efc034b alg_tools update
Tuomo Valkonen <tuomov@iki.fi>
parents: 53
diff changeset
28 let d = x.eval(|x̃| self.0.dist_to(x̃));
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29 d*d / 2.0
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
30 }
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
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33 impl<M : ManifoldPoint> Desc<M> for DistToSquaredDiv2<M> {
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34 fn desc(&self, τ : f64, x : M) -> M {
8
17d71ca4ce84 Make exp consuming
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
35 let t = self.grad(&x) * τ;
17d71ca4ce84 Make exp consuming
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
36 x.exp(&t)
5
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37 }
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 impl<M : ManifoldPoint> Grad<M> for DistToSquaredDiv2<M> {
f248e1434c3b Some distance functions etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41 fn grad(&self, x : &M) -> M::Tangent {
7
8979a6638424 A simple test
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
42 x.log(&self.0)
5
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 }
17
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
45
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
46 impl<M : ManifoldPoint> Prox<M> for DistTo<M> {
53
60928f1440e0 Doc typofix
Tuomo Valkonen <tuomov@iki.fi>
parents: 17
diff changeset
47 /// This proximal map is a type of soft-thresholding on manifolds.
17
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
48 fn prox(&self, τ : f64, x : M) -> M {
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
49 let v = x.log(&self.0);
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
50 let d = v.norm2();
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
51 if d <= τ {
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
52 self.0.clone()
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
53 } else {
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
54 x.exp( &(v * (τ / d)) )
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
55 }
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
56 }
ad68dacabe4f Implement prox for DistTo
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
57 }

mercurial