src/scaled.rs

Fri, 06 Dec 2024 15:07:28 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Fri, 06 Dec 2024 15:07:28 -0500
changeset 47
5e623b327625
parent 46
90cc221eb52b
child 55
15f01efc034b
permissions
-rw-r--r--

Rust edition = 2024

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
84923812d220 Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
5 use alg_tools::mapping::Apply;
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
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
11 /// Scaling factor
18
84923812d220 Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
12 α : f64,
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
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
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 18
diff changeset
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
84923812d220 Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25 impl<M, G : Apply<M, Output=f64>> Apply<M> for Scaled< G> {
84923812d220 Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 type Output = f64;
84923812d220 Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27
84923812d220 Add function scaling by a scalar
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
28 fn apply(&self, x : M) -> Self::Output {
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 }

mercurial