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}