5 |
5 |
6 * Valkonen T. - _Proximal methods for point source localisation_, |
6 * Valkonen T. - _Proximal methods for point source localisation_, |
7 [arXiv:2212.02991](https://arxiv.org/abs/2212.02991). |
7 [arXiv:2212.02991](https://arxiv.org/abs/2212.02991). |
8 |
8 |
9 The main routine is [`pointsource_pdps`]. It is based on specilisatinn of |
9 The main routine is [`pointsource_pdps`]. It is based on specilisatinn of |
10 [`generic_pointsource_fb`] through relevant [`FBSpecialisation`] implementations. |
10 [`generic_pointsource_fb_reg`] through relevant [`FBSpecialisation`] implementations. |
11 Both norm-2-squared and norm-1 data terms are supported. That is, implemented are solvers for |
11 Both norm-2-squared and norm-1 data terms are supported. That is, implemented are solvers for |
12 <div> |
12 <div> |
13 $$ |
13 $$ |
14 \min_{μ ∈ ℳ(Ω)}~ F_0(Aμ - b) + α \|μ\|_{ℳ(Ω)} + δ_{≥ 0}(μ), |
14 \min_{μ ∈ ℳ(Ω)}~ F_0(Aμ - b) + α \|μ\|_{ℳ(Ω)} + δ_{≥ 0}(μ), |
15 $$ |
15 $$ |
300 /// |
302 /// |
301 /// For the mathematical formulation, see the [module level](self) documentation and the manuscript. |
303 /// For the mathematical formulation, see the [module level](self) documentation and the manuscript. |
302 /// |
304 /// |
303 /// Returns the final iterate. |
305 /// Returns the final iterate. |
304 #[replace_float_literals(F::cast_from(literal))] |
306 #[replace_float_literals(F::cast_from(literal))] |
305 pub fn pointsource_pdps<'a, F, I, A, GA, 𝒟, BTA, G𝒟, S, K, D, const N : usize>( |
307 pub fn pointsource_pdps_reg<'a, F, I, A, GA, 𝒟, BTA, G𝒟, S, K, D, Reg, const N : usize>( |
306 opA : &'a A, |
308 opA : &'a A, |
307 b : &'a A::Observable, |
309 b : &'a A::Observable, |
308 α : F, |
310 reg : Reg, |
309 op𝒟 : &'a 𝒟, |
311 op𝒟 : &'a 𝒟, |
310 config : &PDPSConfig<F>, |
312 config : &PDPSConfig<F>, |
311 iterator : I, |
313 iterator : I, |
312 plotter : SeqPlotter<F, N>, |
314 plotter : SeqPlotter<F, N>, |
313 dataterm : D, |
315 dataterm : D, |
326 𝒟 : DiscreteMeasureOp<Loc<F, N>, F, PreCodomain = PreBTFN<F, G𝒟, N>>, |
328 𝒟 : DiscreteMeasureOp<Loc<F, N>, F, PreCodomain = PreBTFN<F, G𝒟, N>>, |
327 𝒟::Codomain : RealMapping<F, N>, |
329 𝒟::Codomain : RealMapping<F, N>, |
328 S: RealMapping<F, N> + LocalAnalysis<F, Bounds<F>, N>, |
330 S: RealMapping<F, N> + LocalAnalysis<F, Bounds<F>, N>, |
329 K: RealMapping<F, N> + LocalAnalysis<F, Bounds<F>, N>, |
331 K: RealMapping<F, N> + LocalAnalysis<F, Bounds<F>, N>, |
330 BTNodeLookup: BTNode<F, usize, Bounds<F>, N>, |
332 BTNodeLookup: BTNode<F, usize, Bounds<F>, N>, |
331 Cube<F, N>: P2Minimise<Loc<F, N>, F>, |
|
332 PlotLookup : Plotting<N>, |
333 PlotLookup : Plotting<N>, |
333 DiscreteMeasure<Loc<F, N>, F> : SpikeMerging<F>, |
334 DiscreteMeasure<Loc<F, N>, F> : SpikeMerging<F>, |
334 PDPS<'a, F, A, D, N> : FBSpecialisation<F, A::Observable, N>, |
335 PDPS<'a, F, A, D, N> : FBSpecialisation<F, A::Observable, N>, |
335 D : Subdifferentiable<F, A::Observable> { |
336 D : Subdifferentiable<F, A::Observable>, |
|
337 Reg : RegTerm<F, N> { |
336 |
338 |
337 let y = dataterm.some_subdifferential(-b); |
339 let y = dataterm.some_subdifferential(-b); |
338 let l = opA.lipschitz_factor(&op𝒟).unwrap().sqrt(); |
340 let l = opA.lipschitz_factor(&op𝒟).unwrap().sqrt(); |
339 let τ = config.τ0 / l; |
341 let τ = config.τ0 / l; |
340 let σ = config.σ0 / l; |
342 let σ = config.σ0 / l; |
347 acceleration : config.acceleration, |
349 acceleration : config.acceleration, |
348 _dataterm : dataterm, |
350 _dataterm : dataterm, |
349 y_prev : y.clone(), |
351 y_prev : y.clone(), |
350 }; |
352 }; |
351 |
353 |
352 generic_pointsource_fb( |
354 generic_pointsource_fb_reg( |
353 opA, α, op𝒟, τ, &config.insertion, iterator, plotter, y, |
355 opA, reg, op𝒟, τ, &config.insertion, iterator, plotter, y, pdps |
354 pdps |
|
355 ) |
356 ) |
356 } |
357 } |
|
358 |
|
359 // |
|
360 // Deprecated interfaces |
|
361 // |
|
362 |
|
363 #[deprecated(note = "Use `pointsource_pdps_reg`")] |
|
364 pub fn pointsource_pdps<'a, F, I, A, GA, 𝒟, BTA, G𝒟, S, K, D, const N : usize>( |
|
365 opA : &'a A, |
|
366 b : &'a A::Observable, |
|
367 α : F, |
|
368 op𝒟 : &'a 𝒟, |
|
369 config : &PDPSConfig<F>, |
|
370 iterator : I, |
|
371 plotter : SeqPlotter<F, N>, |
|
372 dataterm : D, |
|
373 ) -> DiscreteMeasure<Loc<F, N>, F> |
|
374 where F : Float + ToNalgebraRealField, |
|
375 I : AlgIteratorFactory<IterInfo<F, N>>, |
|
376 for<'b> &'b A::Observable : std::ops::Neg<Output=A::Observable> |
|
377 + std::ops::Add<A::Observable, Output=A::Observable>, |
|
378 A::Observable : std::ops::MulAssign<F>, |
|
379 GA : SupportGenerator<F, N, SupportType = S, Id = usize> + Clone, |
|
380 A : ForwardModel<Loc<F, N>, F, PreadjointCodomain = BTFN<F, GA, BTA, N>> |
|
381 + Lipschitz<𝒟, FloatType=F>, |
|
382 BTA : BTSearch<F, N, Data=usize, Agg=Bounds<F>>, |
|
383 G𝒟 : SupportGenerator<F, N, SupportType = K, Id = usize> + Clone, |
|
384 𝒟 : DiscreteMeasureOp<Loc<F, N>, F, PreCodomain = PreBTFN<F, G𝒟, N>>, |
|
385 𝒟::Codomain : RealMapping<F, N>, |
|
386 S: RealMapping<F, N> + LocalAnalysis<F, Bounds<F>, N>, |
|
387 K: RealMapping<F, N> + LocalAnalysis<F, Bounds<F>, N>, |
|
388 BTNodeLookup: BTNode<F, usize, Bounds<F>, N>, |
|
389 Cube<F, N>: P2Minimise<Loc<F, N>, F>, |
|
390 PlotLookup : Plotting<N>, |
|
391 DiscreteMeasure<Loc<F, N>, F> : SpikeMerging<F>, |
|
392 PDPS<'a, F, A, D, N> : FBSpecialisation<F, A::Observable, N>, |
|
393 D : Subdifferentiable<F, A::Observable> { |
|
394 |
|
395 pointsource_pdps_reg(opA, b, NonnegRadonRegTerm(α), op𝒟, config, iterator, plotter, dataterm) |
|
396 } |