src/fb.rs

Fri, 18 Oct 2024 19:52:06 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Fri, 18 Oct 2024 19:52:06 -0500
changeset 4
e09437844ad9
child 5
f248e1434c3b
permissions
-rw-r--r--

Forward-backward skeleton

4
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
2 use alg_tools::iterate::AlgIteratorFactory;
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
3 use alg_tools::mapping::{Mapping, Sum};
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4 use serde::Serialize;
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
5
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
6 use crate::manifold::ManifoldPoint;
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
7
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
8 /// Trait for function objects that implement gradient steps
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
9 pub trait Desc<M : ManifoldPoint> {
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
10 fn desc(&self, τ : f64, pt : M) -> M;
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
11 }
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
12
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13 /// Trait for function objects that implement proximal steps
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
14 pub trait Prox<M : ManifoldPoint> {
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15 fn prox(&self, τ : f64, pt : M) -> M;
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
16 }
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
18 #[derive(Clone,Debug,Serialize)]
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
19 pub struct IterInfo<M> {
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20 value : f64,
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21 point : M,
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 }
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
24 pub fn forward_backward<M, F, G, I>(
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25 f : &F,
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 g : &G,
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27 mut x : M,
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
28 τ : f64,
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29 iterator : I
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
30 ) -> M
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31 where M : ManifoldPoint,
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32 F : Desc<M> + Mapping<M, Codomain = f64>,
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33 G : Prox<M> + Mapping<M, Codomain = f64>,
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34 I : AlgIteratorFactory<IterInfo<M>> {
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36 for i in iterator.iter() {
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37 x = g.prox(τ, f.desc(τ, x));
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39 i.if_verbose(|| {
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 IterInfo {
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41 value : f.apply(&x) + g.apply(&x),
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42 point : x.clone(),
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
43 }
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
44 })
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
45 }
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
47 x
e09437844ad9 Forward-backward skeleton
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 }

mercurial