Fri, 28 Mar 2025 08:38:05 -0500
bump version
18
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
1 | /*! |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
2 | Implementation of scaling of functions on a manifold by a scalar. |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
3 | */ |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
4 | |
56 | 5 | use alg_tools::mapping::{Mapping, Instance, Space}; |
18
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
6 | use crate::manifold::ManifoldPoint; |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
7 | use crate::fb::{Grad, Desc, Prox}; |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
8 | |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
9 | /// Structure for a function of type `G`, scaled by a scalar. |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
10 | pub struct Scaled<G> { |
46 | 11 | /// Scaling factor |
18
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
12 | α : f64, |
46 | 13 | /// The base function |
18
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
14 | g : G, |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
15 | } |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
16 | |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
17 | impl<G> Scaled<G> { |
46 | 18 | /// Creates a new scaled function. |
18
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
19 | #[allow(dead_code)] |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
20 | pub fn new(α : f64, g : G) -> Self { |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
21 | Scaled{ α, g } |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
22 | } |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
23 | } |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
24 | |
56 | 25 | impl<M : Space, G : Mapping<M, Codomain=f64>> Mapping<M> for Scaled< G> { |
55 | 26 | type Codomain = f64; |
18
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
27 | |
55 | 28 | fn apply<I : Instance<M>>(&self, x : I) -> Self::Codomain { |
18
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
29 | self.g.apply(x) * self.α |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
30 | } |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
31 | } |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
32 | |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
33 | impl<M : ManifoldPoint, G : Desc<M>> Desc<M> for Scaled<G> { |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
34 | fn desc(&self, τ : f64, x : M) -> M { |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
35 | self.g.desc(τ * self.α, x) |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
36 | } |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
37 | } |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
38 | |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
39 | impl<M : ManifoldPoint, G : Grad<M>> Grad<M> for Scaled<G> { |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
40 | fn grad(&self, x : &M) -> M::Tangent { |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
41 | self.g.grad(x) * self.α |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
42 | } |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
43 | } |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
44 | |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
45 | impl<M : ManifoldPoint, G : Prox<M>> Prox<M> for Scaled<G> { |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
46 | fn prox(&self, τ : f64, x : M) -> M { |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
47 | self.g.prox(τ * self.α, x) |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
48 | } |
84923812d220
Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
49 | } |