diff -r 9869fa1e0ccd -r d29d1fcf5423 src/pdps.rs --- a/src/pdps.rs Sun Dec 11 23:19:17 2022 +0200 +++ b/src/pdps.rs Sun Dec 11 23:25:53 2022 +0200 @@ -7,7 +7,7 @@ [arXiv:2212.02991](https://arxiv.org/abs/2212.02991). The main routine is [`pointsource_pdps`]. It is based on specilisatinn of -[`generic_pointsource_fb`] through relevant [`FBSpecialisation`] implementations. +[`generic_pointsource_fb_reg`] through relevant [`FBSpecialisation`] implementations. Both norm-2-squared and norm-1 data terms are supported. That is, implemented are solvers for
$$ @@ -88,8 +88,10 @@ use crate::fb::{ FBGenericConfig, FBSpecialisation, - generic_pointsource_fb + generic_pointsource_fb_reg, + RegTerm, }; +use crate::regularisation::NonnegRadonRegTerm; /// Acceleration #[derive(Clone, Copy, Eq, PartialEq, Serialize, Deserialize, ValueEnum, Debug)] @@ -154,7 +156,7 @@ } } -/// Specialisation of [`generic_pointsource_fb`] to PDPS. +/// Specialisation of [`generic_pointsource_fb_reg`] to PDPS. pub struct PDPS< 'a, F : Float + ToNalgebraRealField, @@ -302,10 +304,10 @@ /// /// Returns the final iterate. #[replace_float_literals(F::cast_from(literal))] -pub fn pointsource_pdps<'a, F, I, A, GA, 𝒟, BTA, G𝒟, S, K, D, const N : usize>( +pub fn pointsource_pdps_reg<'a, F, I, A, GA, 𝒟, BTA, G𝒟, S, K, D, Reg, const N : usize>( opA : &'a A, b : &'a A::Observable, - α : F, + reg : Reg, op𝒟 : &'a 𝒟, config : &PDPSConfig, iterator : I, @@ -328,11 +330,11 @@ S: RealMapping + LocalAnalysis, N>, K: RealMapping + LocalAnalysis, N>, BTNodeLookup: BTNode, N>, - Cube: P2Minimise, F>, PlotLookup : Plotting, DiscreteMeasure, F> : SpikeMerging, PDPS<'a, F, A, D, N> : FBSpecialisation, - D : Subdifferentiable { + D : Subdifferentiable, + Reg : RegTerm { let y = dataterm.some_subdifferential(-b); let l = opA.lipschitz_factor(&op𝒟).unwrap().sqrt(); @@ -349,8 +351,46 @@ y_prev : y.clone(), }; - generic_pointsource_fb( - opA, α, op𝒟, τ, &config.insertion, iterator, plotter, y, - pdps + generic_pointsource_fb_reg( + opA, reg, op𝒟, τ, &config.insertion, iterator, plotter, y, pdps ) -} \ No newline at end of file +} + +// +// Deprecated interfaces +// + +#[deprecated(note = "Use `pointsource_pdps_reg`")] +pub fn pointsource_pdps<'a, F, I, A, GA, 𝒟, BTA, G𝒟, S, K, D, const N : usize>( + opA : &'a A, + b : &'a A::Observable, + α : F, + op𝒟 : &'a 𝒟, + config : &PDPSConfig, + iterator : I, + plotter : SeqPlotter, + dataterm : D, +) -> DiscreteMeasure, F> +where F : Float + ToNalgebraRealField, + I : AlgIteratorFactory>, + for<'b> &'b A::Observable : std::ops::Neg + + std::ops::Add, + A::Observable : std::ops::MulAssign, + GA : SupportGenerator + Clone, + A : ForwardModel, F, PreadjointCodomain = BTFN> + + Lipschitz<𝒟, FloatType=F>, + BTA : BTSearch>, + G𝒟 : SupportGenerator + Clone, + 𝒟 : DiscreteMeasureOp, F, PreCodomain = PreBTFN>, + 𝒟::Codomain : RealMapping, + S: RealMapping + LocalAnalysis, N>, + K: RealMapping + LocalAnalysis, N>, + BTNodeLookup: BTNode, N>, + Cube: P2Minimise, F>, + PlotLookup : Plotting, + DiscreteMeasure, F> : SpikeMerging, + PDPS<'a, F, A, D, N> : FBSpecialisation, + D : Subdifferentiable { + + pointsource_pdps_reg(opA, b, NonnegRadonRegTerm(α), op𝒟, config, iterator, plotter, dataterm) +}