proximal_optimize/utils.rs
1/// From `proxmin`'s `utils.py`:
2// Original source here
3//
4// class NesterovStepper(object):
5// def __init__(self, accelerated=False):
6// self.t = 1.
7// self.accelerated = accelerated
8//
9// @property
10// def omega(self):
11// if self.accelerated:
12// t_ = 0.5*(1 + np.sqrt(4*self.t*self.t + 1))
13// om = (self.t - 1)/t_
14// self.t = t_
15// return om
16// else:
17// return 0
18pub struct NesterovStepper {
19 t: f64,
20 accelerated: bool,
21}
22
23impl NesterovStepper {
24 pub fn new(accelerated: bool) -> NesterovStepper {
25 NesterovStepper { t: 1.0,
26 accelerated }
27 }
28
29 pub fn omega(&mut self) -> f64 {
30 if self.accelerated {
31 let t_ = 0.5 * (1.0 + (4.0 * self.t * self.t + 1.0).sqrt());
32 let om = (self.t - 1.0) / t_;
33 self.t = t_;
34 om
35 } else {
36 0.0
37 }
38 }
39}
40
41/// From `proxmin`'s `utils.py`:
42///
43///
44// Original python source:
45//
46// def l2sq(x):
47// """Sum the matrix elements squared
48// """
49// return (x**2).sum()
50pub fn l2sq(x: &[f64]) -> f64 {
51 let mut sum: f64 = 0.0;
52 for val in x.iter() {
53 sum += *val * *val;
54 }
55 sum
56}