74 ) -> M |
74 ) -> M |
75 where M : ManifoldPoint + EmbeddedManifoldPoint, |
75 where M : ManifoldPoint + EmbeddedManifoldPoint, |
76 F : Desc<M> + Mapping<M, Codomain = f64>, |
76 F : Desc<M> + Mapping<M, Codomain = f64>, |
77 G : Prox<M> + Mapping<M, Codomain = f64>, |
77 G : Prox<M> + Mapping<M, Codomain = f64>, |
78 I : AlgIteratorFactory<IterInfo<M>> { |
78 I : AlgIteratorFactory<IterInfo<M>> { |
|
79 |
|
80 // Closure that calculates current status |
|
81 let status = |x : &M| IterInfo { |
|
82 value : f.apply(x) + g.apply(x), |
|
83 point : x.clone(), |
|
84 }; |
79 |
85 |
80 // Perform as many iterations as requested by `iterator`. |
86 // Perform as many iterations as requested by `iterator`. |
81 for i in iterator.iter() { |
87 for i in iterator.iter_init(|| status(&x)) { |
82 // Forward-backward step |
88 // Forward-backward step |
83 x = g.prox(τ, f.desc(τ, x)); |
89 x = g.prox(τ, f.desc(τ, x)); |
84 |
90 |
85 // If requested by `iterator`, calculate function value and store iterate. |
91 // If requested by `iterator`, calculate function value and store iterate. |
86 i.if_verbose(|| { |
92 i.if_verbose(|| status(&x)) |
87 IterInfo { |
|
88 value : f.apply(&x) + g.apply(&x), |
|
89 point : x.clone(), |
|
90 } |
|
91 }) |
|
92 } |
93 } |
93 |
94 |
94 // Return final iterate. |
95 // Return final iterate. |
95 x |
96 x |
96 } |
97 } |