--- a/src/dist.rs Sat Dec 07 21:54:59 2024 -0500 +++ b/src/dist.rs Sun Dec 15 01:10:52 2024 -0500 @@ -2,7 +2,7 @@ Implementations of the distance function and the distance function squared, on manifolds. */ -use alg_tools::mapping::Apply; +use alg_tools::mapping::{Mapping, Instance}; use alg_tools::euclidean::Euclidean; use crate::manifold::ManifoldPoint; use crate::fb::{Grad, Desc, Prox}; @@ -10,39 +10,22 @@ /// Structure for distance-to functions pub struct DistTo<M : ManifoldPoint>(pub M); -impl<M : ManifoldPoint> Apply<M> for DistTo<M> { - type Output = f64; +impl<M : ManifoldPoint> Mapping<M> for DistTo<M> { + type Codomain = f64; - fn apply(&self, x : M) -> Self::Output { - self.0.dist_to(&x) - } -} - -impl<'a, M : ManifoldPoint> Apply<&'a M> for DistTo<M> { - type Output = f64; - - fn apply(&self, x : &'a M) -> Self::Output { - self.0.dist_to(x) + fn apply<I : Instance<M>>(&self, x : I) -> Self::Codomain { + x.eval(|x̃| self.0.dist_to(x̃)) } } /// Structure for distance-to functions pub struct DistToSquaredDiv2<M : ManifoldPoint>(pub M); -impl<M : ManifoldPoint> Apply<M> for DistToSquaredDiv2<M> { - type Output = f64; +impl<M : ManifoldPoint> Mapping<M> for DistToSquaredDiv2<M> { + type Codomain = f64; - fn apply(&self, x : M) -> Self::Output { - let d = self.0.dist_to(&x); - d*d / 2.0 - } -} - -impl<'a, M : ManifoldPoint> Apply<&'a M> for DistToSquaredDiv2<M> { - type Output = f64; - - fn apply(&self, x : &'a M) -> Self::Output { - let d = self.0.dist_to(x); + fn apply<I : Instance<M>>(&self, x : I) -> Self::Codomain { + let d = x.eval(|x̃| self.0.dist_to(x̃)); d*d / 2.0 } }