src/dist.rs

changeset 17
ad68dacabe4f
parent 13
f67949050a32
child 53
60928f1440e0
equal deleted inserted replaced
16:a6efe0fafd90 17:ad68dacabe4f
1 /*! 1 /*!
2 Implementations of the distance function and the distance function squared, on manifolds. 2 Implementations of the distance function and the distance function squared, on manifolds.
3 */ 3 */
4 4
5 use alg_tools::mapping::Apply; 5 use alg_tools::mapping::Apply;
6 use alg_tools::euclidean::Euclidean;
6 use crate::manifold::ManifoldPoint; 7 use crate::manifold::ManifoldPoint;
7 use crate::fb::{Grad, Desc}; 8 use crate::fb::{Grad, Desc, Prox};
8 9
9 /// Structure for distance-to functions 10 /// Structure for distance-to functions
10 pub struct DistTo<M : ManifoldPoint>(pub M); 11 pub struct DistTo<M : ManifoldPoint>(pub M);
11 12
12 impl<M : ManifoldPoint> Apply<M> for DistTo<M> { 13 impl<M : ManifoldPoint> Apply<M> for DistTo<M> {
56 impl<M : ManifoldPoint> Grad<M> for DistToSquaredDiv2<M> { 57 impl<M : ManifoldPoint> Grad<M> for DistToSquaredDiv2<M> {
57 fn grad(&self, x : &M) -> M::Tangent { 58 fn grad(&self, x : &M) -> M::Tangent {
58 x.log(&self.0) 59 x.log(&self.0)
59 } 60 }
60 } 61 }
62
63 impl<M : ManifoldPoint> Prox<M> for DistTo<M> {
64 /// This is proximal map is a type of soft-thresholding on manifolds.
65 fn prox(&self, τ : f64, x : M) -> M {
66 let v = x.log(&self.0);
67 let d = v.norm2();
68 if d <= τ {
69 self.0.clone()
70 } else {
71 x.exp( &(v * (τ / d)) )
72 }
73 }
74 }

mercurial