src/fb.rs

Mon, 17 Feb 2025 13:54:53 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Mon, 17 Feb 2025 13:54:53 -0500
changeset 52
f0e8704d3f0e
parent 51
0693cc9ba9f0
permissions
-rw-r--r--

Merge dev to default

0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1 /*!
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
2 Solver for the point source localisation problem using a forward-backward splitting method.
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
3
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4 This corresponds to the manuscript
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
5
13
bdc57366d4f5 arXiv links, README beautification
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
6 * Valkonen T. - _Proximal methods for point source localisation_,
bdc57366d4f5 arXiv links, README beautification
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
7 [arXiv:2212.02991](https://arxiv.org/abs/2212.02991).
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
8
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
9 The main routine is [`pointsource_fb_reg`].
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
10
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
11 ## Problem
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
12
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13 <p>
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
14 Our objective is to solve
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15 $$
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
16 \min_{μ ∈ ℳ(Ω)}~ F_0(Aμ-b) + α \|μ\|_{ℳ(Ω)} + δ_{≥ 0}(μ),
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17 $$
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
18 where $F_0(y)=\frac{1}{2}\|y\|_2^2$ and the forward operator $A \in 𝕃(ℳ(Ω); ℝ^n)$.
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
19 </p>
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21 ## Approach
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23 <p>
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
24 As documented in more detail in the paper, on each step we approximately solve
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25 $$
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 \min_{μ ∈ ℳ(Ω)}~ F(x) + α \|μ\|_{ℳ(Ω)} + δ_{≥ 0}(x) + \frac{1}{2}\|μ-μ^k|_𝒟^2,
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27 $$
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
28 where $𝒟: 𝕃(ℳ(Ω); C_c(Ω))$ is typically a convolution operator.
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29 </p>
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
30
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31 ## Finite-dimensional subproblems.
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33 With $C$ a projection from [`DiscreteMeasure`] to the weights, and $x^k$ such that $x^k=Cμ^k$, we
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34 form the discretised linearised inner problem
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35 <p>
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36 $$
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37 \min_{x ∈ ℝ^n}~ τ\bigl(F(Cx^k) + [C^*∇F(Cx^k)]^⊤(x-x^k) + α {\vec 1}^⊤ x\bigr)
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38 + δ_{≥ 0}(x) + \frac{1}{2}\|x-x^k\|_{C^*𝒟C}^2,
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39 $$
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 equivalently
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41 $$
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42 \begin{aligned}
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
43 \min_x~ & τF(Cx^k) - τ[C^*∇F(Cx^k)]^⊤x^k + \frac{1}{2} (x^k)^⊤ C^*𝒟C x^k
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
44 \\
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
45 &
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46 - [C^*𝒟C x^k - τC^*∇F(Cx^k)]^⊤ x
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
47 \\
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 &
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
49 + \frac{1}{2} x^⊤ C^*𝒟C x
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50 + τα {\vec 1}^⊤ x + δ_{≥ 0}(x),
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51 \end{aligned}
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
52 $$
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53 In other words, we obtain the quadratic non-negativity constrained problem
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
54 $$
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
55 \min_{x ∈ ℝ^n}~ \frac{1}{2} x^⊤ Ã x - b̃^⊤ x + c + τα {\vec 1}^⊤ x + δ_{≥ 0}(x).
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
56 $$
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
57 where
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
58 $$
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
59 \begin{aligned}
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
60 Ã & = C^*𝒟C,
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
61 \\
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
62 g̃ & = C^*𝒟C x^k - τ C^*∇F(Cx^k)
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
63 = C^* 𝒟 μ^k - τ C^*A^*(Aμ^k - b)
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
64 \\
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
65 c & = τ F(Cx^k) - τ[C^*∇F(Cx^k)]^⊤x^k + \frac{1}{2} (x^k)^⊤ C^*𝒟C x^k
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
66 \\
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
67 &
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
68 = \frac{τ}{2} \|Aμ^k-b\|^2 - τ[Aμ^k-b]^⊤Aμ^k + \frac{1}{2} \|μ_k\|_{𝒟}^2
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
69 \\
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
70 &
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
71 = -\frac{τ}{2} \|Aμ^k-b\|^2 + τ[Aμ^k-b]^⊤ b + \frac{1}{2} \|μ_k\|_{𝒟}^2.
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
72 \end{aligned}
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
73 $$
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
74 </p>
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
75
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
76 We solve this with either SSN or FB as determined by
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
77 [`crate::subproblem::InnerSettings`] in [`FBGenericConfig::inner`].
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
78 */
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
79
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
80 use colored::Colorize;
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81 use numeric_literals::replace_float_literals;
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
82 use serde::{Deserialize, Serialize};
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
83
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
84 use alg_tools::euclidean::Euclidean;
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
85 use alg_tools::instance::Instance;
37
c5d8bd1a7728 Generic proximal penalty support
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
86 use alg_tools::iterate::AlgIteratorFactory;
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
87 use alg_tools::linops::{Mapping, GEMV};
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
88 use alg_tools::mapping::RealMapping;
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
89 use alg_tools::nalgebra_support::ToNalgebraRealField;
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
90
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
91 use crate::dataterm::{calculate_residual, DataTerm, L2Squared};
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
92 use crate::forward_model::{AdjointProductBoundedBy, ForwardModel};
39
6316d68b58af Merging adjustments, parameter tuning, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
93 use crate::measures::merging::SpikeMerging;
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
94 use crate::measures::{DiscreteMeasure, RNDM};
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
95 use crate::plot::{PlotLookup, Plotting, SeqPlotter};
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
96 pub use crate::prox_penalty::{FBGenericConfig, ProxPenalty};
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
97 use crate::regularisation::RegTerm;
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
98 use crate::types::*;
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
99
24
d29d1fcf5423 Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
100 /// Settings for [`pointsource_fb_reg`].
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
101 #[derive(Clone, Copy, Eq, PartialEq, Serialize, Deserialize, Debug)]
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
102 #[serde(default)]
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
103 pub struct FBConfig<F: Float> {
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
104 /// Step length scaling
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
105 pub τ0: F,
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
106 /// Generic parameters
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
107 pub generic: FBGenericConfig<F>,
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
108 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
109
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
110 #[replace_float_literals(F::cast_from(literal))]
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
111 impl<F: Float> Default for FBConfig<F> {
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
112 fn default() -> Self {
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
113 FBConfig {
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
114 τ0: 0.99,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
115 generic: Default::default(),
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
116 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
117 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
118 }
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
119
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
120 pub(crate) fn prune_with_stats<F: Float, const N: usize>(μ: &mut RNDM<F, N>) -> usize {
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
121 let n_before_prune = μ.len();
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
122 μ.prune();
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
123 debug_assert!(μ.len() <= n_before_prune);
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
124 n_before_prune - μ.len()
24
d29d1fcf5423 Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
125 }
d29d1fcf5423 Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
126
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
127 #[replace_float_literals(F::cast_from(literal))]
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
128 pub(crate) fn postprocess<
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
129 F: Float,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
130 V: Euclidean<F> + Clone,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
131 A: GEMV<F, RNDM<F, N>, Codomain = V>,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
132 D: DataTerm<F, V, N>,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
133 const N: usize,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
134 >(
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
135 mut μ: RNDM<F, N>,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
136 config: &FBGenericConfig<F>,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
137 dataterm: D,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
138 opA: &A,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
139 b: &V,
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
140 ) -> RNDM<F, N>
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
141 where
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
142 RNDM<F, N>: SpikeMerging<F>,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
143 for<'a> &'a RNDM<F, N>: Instance<RNDM<F, N>>,
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
144 {
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
145 μ.merge_spikes_fitness(
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
146 config.final_merging_method(),
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
147 |μ̃| dataterm.calculate_fit_op(μ̃, opA, b),
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
148 |&v| v,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
149 );
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
150 μ.prune();
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
151 μ
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
152 }
24
d29d1fcf5423 Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
153
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
154 /// Iteratively solve the pointsource localisation problem using forward-backward splitting.
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
155 ///
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
156 /// The settings in `config` have their [respective documentation](FBConfig). `opA` is the
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
157 /// forward operator $A$, $b$ the observable, and $\lambda$ the regularisation weight.
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
158 /// The operator `op𝒟` is used for forming the proximal term. Typically it is a convolution
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
159 /// operator. Finally, the `iterator` is an outer loop verbosity and iteration count control
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
160 /// as documented in [`alg_tools::iterate`].
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
161 ///
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
162 /// For details on the mathematical formulation, see the [module level](self) documentation.
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
163 ///
0
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
164 /// The implementation relies on [`alg_tools::bisection_tree::BTFN`] presentations of
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
165 /// sums of simple functions usign bisection trees, and the related
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
166 /// [`alg_tools::bisection_tree::Aggregator`]s, to efficiently search for component functions
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
167 /// active at a specific points, and to maximise their sums. Through the implementation of the
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
168 /// [`alg_tools::bisection_tree::BT`] bisection trees, it also relies on the copy-on-write features
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
169 /// of [`std::sync::Arc`] to only update relevant parts of the bisection tree when adding functions.
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
170 ///
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
171 /// Returns the final iterate.
eb3c7813b67a Initial version
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
172 #[replace_float_literals(F::cast_from(literal))]
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
173 pub fn pointsource_fb_reg<F, I, A, Reg, P, const N: usize>(
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
174 opA: &A,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
175 b: &A::Observable,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
176 reg: Reg,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
177 prox_penalty: &P,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
178 fbconfig: &FBConfig<F>,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
179 iterator: I,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
180 mut plotter: SeqPlotter<F, N>,
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
181 ) -> RNDM<F, N>
37
c5d8bd1a7728 Generic proximal penalty support
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
182 where
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
183 F: Float + ToNalgebraRealField,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
184 I: AlgIteratorFactory<IterInfo<F, N>>,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
185 for<'b> &'b A::Observable: std::ops::Neg<Output = A::Observable>,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
186 A: ForwardModel<RNDM<F, N>, F> + AdjointProductBoundedBy<RNDM<F, N>, P, FloatType = F>,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
187 A::PreadjointCodomain: RealMapping<F, N>,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
188 PlotLookup: Plotting<N>,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
189 RNDM<F, N>: SpikeMerging<F>,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
190 Reg: RegTerm<F, N>,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
191 P: ProxPenalty<F, A::PreadjointCodomain, Reg, N>,
37
c5d8bd1a7728 Generic proximal penalty support
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
192 {
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
193 // Set up parameters
34
efa60bc4f743 Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
194 let config = &fbconfig.generic;
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
195 let τ = fbconfig.τ0 / opA.adjoint_product_bound(prox_penalty).unwrap();
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
196 // We multiply tolerance by τ for FB since our subproblems depending on tolerances are scaled
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
197 // by τ compared to the conditional gradient approach.
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
198 let tolerance = config.tolerance * τ * reg.tolerance_scaling();
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
199 let mut ε = tolerance.initial();
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
200
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
201 // Initialise iterates
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
202 let mut μ = DiscreteMeasure::new();
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
203 let mut residual = -b;
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
204
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
205 // Statistics
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
206 let full_stats = |residual: &A::Observable, μ: &RNDM<F, N>, ε, stats| IterInfo {
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
207 value: residual.norm2_squared_div2() + reg.apply(μ),
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
208 n_spikes: μ.len(),
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
209 ε,
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
210 //postprocessing: config.postprocessing.then(|| μ.clone()),
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
211 ..stats
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
212 };
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
213 let mut stats = IterInfo::new();
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
214
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
215 // Run the algorithm
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
216 for state in iterator.iter_init(|| full_stats(&residual, &μ, ε, stats.clone())) {
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
217 // Calculate smooth part of surrogate model.
37
c5d8bd1a7728 Generic proximal penalty support
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
218 let mut τv = opA.preadjoint().apply(residual * τ);
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
219
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
220 // Save current base point
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
221 let μ_base = μ.clone();
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
222
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
223 // Insert and reweigh
37
c5d8bd1a7728 Generic proximal penalty support
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
224 let (maybe_d, _within_tolerances) = prox_penalty.insert_and_reweigh(
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
225 &mut μ, &mut τv, &μ_base, None, τ, ε, config, &reg, &state, &mut stats,
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
226 );
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
227
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
228 // Prune and possibly merge spikes
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
229 if config.merge_now(&state) {
39
6316d68b58af Merging adjustments, parameter tuning, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
230 stats.merged += prox_penalty.merge_spikes(
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
231 &mut μ,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
232 &mut τv,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
233 &μ_base,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
234 None,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
235 τ,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
236 ε,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
237 config,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
238 &reg,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
239 Some(|μ̃: &RNDM<F, N>| L2Squared.calculate_fit_op(μ̃, opA, b)),
39
6316d68b58af Merging adjustments, parameter tuning, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
240 );
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
241 }
37
c5d8bd1a7728 Generic proximal penalty support
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
242
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
243 stats.pruned += prune_with_stats(&mut μ);
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
244
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
245 // Update residual
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
246 residual = calculate_residual(&μ, opA, b);
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
247
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
248 let iter = state.iteration();
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
249 stats.this_iters += 1;
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
250
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
251 // Give statistics if needed
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
252 state.if_verbose(|| {
37
c5d8bd1a7728 Generic proximal penalty support
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
253 plotter.plot_spikes(iter, maybe_d.as_ref(), Some(&τv), &μ);
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
254 full_stats(
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
255 &residual,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
256 &μ,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
257 ε,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
258 std::mem::replace(&mut stats, IterInfo::new()),
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
259 )
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
260 });
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
261
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
262 // Update main tolerance for next iteration
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
263 ε = tolerance.update(ε, iter);
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
264 }
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
265
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
266 postprocess(μ, config, L2Squared, opA, b)
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
267 }
24
d29d1fcf5423 Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
268
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
269 /// Iteratively solve the pointsource localisation problem using inertial forward-backward splitting.
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
270 ///
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
271 /// The settings in `config` have their [respective documentation](FBConfig). `opA` is the
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
272 /// forward operator $A$, $b$ the observable, and $\lambda$ the regularisation weight.
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
273 /// The operator `op𝒟` is used for forming the proximal term. Typically it is a convolution
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
274 /// operator. Finally, the `iterator` is an outer loop verbosity and iteration count control
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
275 /// as documented in [`alg_tools::iterate`].
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
276 ///
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
277 /// For details on the mathematical formulation, see the [module level](self) documentation.
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
278 ///
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
279 /// The implementation relies on [`alg_tools::bisection_tree::BTFN`] presentations of
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
280 /// sums of simple functions usign bisection trees, and the related
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
281 /// [`alg_tools::bisection_tree::Aggregator`]s, to efficiently search for component functions
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
282 /// active at a specific points, and to maximise their sums. Through the implementation of the
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
283 /// [`alg_tools::bisection_tree::BT`] bisection trees, it also relies on the copy-on-write features
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
284 /// of [`std::sync::Arc`] to only update relevant parts of the bisection tree when adding functions.
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
285 ///
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
286 /// Returns the final iterate.
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
287 #[replace_float_literals(F::cast_from(literal))]
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
288 pub fn pointsource_fista_reg<F, I, A, Reg, P, const N: usize>(
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
289 opA: &A,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
290 b: &A::Observable,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
291 reg: Reg,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
292 prox_penalty: &P,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
293 fbconfig: &FBConfig<F>,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
294 iterator: I,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
295 mut plotter: SeqPlotter<F, N>,
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
296 ) -> RNDM<F, N>
37
c5d8bd1a7728 Generic proximal penalty support
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
297 where
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
298 F: Float + ToNalgebraRealField,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
299 I: AlgIteratorFactory<IterInfo<F, N>>,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
300 for<'b> &'b A::Observable: std::ops::Neg<Output = A::Observable>,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
301 A: ForwardModel<RNDM<F, N>, F> + AdjointProductBoundedBy<RNDM<F, N>, P, FloatType = F>,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
302 A::PreadjointCodomain: RealMapping<F, N>,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
303 PlotLookup: Plotting<N>,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
304 RNDM<F, N>: SpikeMerging<F>,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
305 Reg: RegTerm<F, N>,
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
306 P: ProxPenalty<F, A::PreadjointCodomain, Reg, N>,
37
c5d8bd1a7728 Generic proximal penalty support
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
307 {
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
308 // Set up parameters
34
efa60bc4f743 Radon FB + sliding improvements
Tuomo Valkonen <tuomov@iki.fi>
parents: 32
diff changeset
309 let config = &fbconfig.generic;
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
310 let τ = fbconfig.τ0 / opA.adjoint_product_bound(prox_penalty).unwrap();
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
311 let mut λ = 1.0;
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
312 // We multiply tolerance by τ for FB since our subproblems depending on tolerances are scaled
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
313 // by τ compared to the conditional gradient approach.
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
314 let tolerance = config.tolerance * τ * reg.tolerance_scaling();
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
315 let mut ε = tolerance.initial();
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
316
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
317 // Initialise iterates
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
318 let mut μ = DiscreteMeasure::new();
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
319 let mut μ_prev = DiscreteMeasure::new();
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
320 let mut residual = -b;
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
321 let mut warned_merging = false;
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
322
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
323 // Statistics
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
324 let full_stats = |ν: &RNDM<F, N>, ε, stats| IterInfo {
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
325 value: L2Squared.calculate_fit_op(ν, opA, b) + reg.apply(ν),
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
326 n_spikes: ν.len(),
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
327 ε,
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
328 // postprocessing: config.postprocessing.then(|| ν.clone()),
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
329 ..stats
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
330 };
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
331 let mut stats = IterInfo::new();
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
332
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
333 // Run the algorithm
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
334 for state in iterator.iter_init(|| full_stats(&μ, ε, stats.clone())) {
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
335 // Calculate smooth part of surrogate model.
37
c5d8bd1a7728 Generic proximal penalty support
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
336 let mut τv = opA.preadjoint().apply(residual * τ);
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
337
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
338 // Save current base point
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
339 let μ_base = μ.clone();
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
340
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
341 // Insert new spikes and reweigh
37
c5d8bd1a7728 Generic proximal penalty support
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
342 let (maybe_d, _within_tolerances) = prox_penalty.insert_and_reweigh(
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
343 &mut μ, &mut τv, &μ_base, None, τ, ε, config, &reg, &state, &mut stats,
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
344 );
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
345
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
346 // (Do not) merge spikes.
39
6316d68b58af Merging adjustments, parameter tuning, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
347 if config.merge_now(&state) && !warned_merging {
6316d68b58af Merging adjustments, parameter tuning, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
348 let err = format!("Merging not supported for μFISTA");
6316d68b58af Merging adjustments, parameter tuning, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
349 println!("{}", err.red());
6316d68b58af Merging adjustments, parameter tuning, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
350 warned_merging = true;
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
351 }
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
352
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
353 // Update inertial prameters
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
354 let λ_prev = λ;
51
0693cc9ba9f0 Update documentation references
Tuomo Valkonen <tuomov@iki.fi>
parents: 39
diff changeset
355 λ = 2.0 * λ_prev / (λ_prev + (4.0 + λ_prev * λ_prev).sqrt());
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
356 let θ = λ / λ_prev - λ;
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
357
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
358 // Perform inertial update on μ.
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
359 // This computes μ ← (1 + θ) * μ - θ * μ_prev, pruning spikes where both μ
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
360 // and μ_prev have zero weight. Since both have weights from the finite-dimensional
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
361 // subproblem with a proximal projection step, this is likely to happen when the
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
362 // spike is not needed. A copy of the pruned μ without artithmetic performed is
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
363 // stored in μ_prev.
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
364 let n_before_prune = μ.len();
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
365 μ.pruning_sub(1.0 + θ, θ, &mut μ_prev);
39
6316d68b58af Merging adjustments, parameter tuning, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
366 //let μ_new = (&μ * (1.0 + θ)).sub_matching(&(&μ_prev * θ));
6316d68b58af Merging adjustments, parameter tuning, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
367 // μ_prev = μ;
6316d68b58af Merging adjustments, parameter tuning, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
368 // μ = μ_new;
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
369 debug_assert!(μ.len() <= n_before_prune);
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
370 stats.pruned += n_before_prune - μ.len();
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
371
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
372 // Update residual
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
373 residual = calculate_residual(&μ, opA, b);
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
374
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
375 let iter = state.iteration();
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
376 stats.this_iters += 1;
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
377
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
378 // Give statistics if needed
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
379 state.if_verbose(|| {
37
c5d8bd1a7728 Generic proximal penalty support
Tuomo Valkonen <tuomov@iki.fi>
parents: 35
diff changeset
380 plotter.plot_spikes(iter, maybe_d.as_ref(), Some(&τv), &μ_prev);
35
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
381 full_stats(&μ_prev, ε, std::mem::replace(&mut stats, IterInfo::new()))
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
382 });
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
383
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
384 // Update main tolerance for next iteration
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
385 ε = tolerance.update(ε, iter);
b087e3eab191 New version of sliding.
Tuomo Valkonen <tuomov@iki.fi>
parents: 34
diff changeset
386 }
32
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
387
56c8adc32b09 Early transport sketches
Tuomo Valkonen <tuomov@iki.fi>
parents: 29
diff changeset
388 postprocess(μ_prev, config, L2Squared, opA, b)
24
d29d1fcf5423 Support arbitrary regularisation terms; implement non-positivity-constrained regularisation.
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
389 }

mercurial