--- 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 <div> $$ @@ -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<F>, iterator : I, @@ -328,11 +330,11 @@ S: RealMapping<F, N> + LocalAnalysis<F, Bounds<F>, N>, K: RealMapping<F, N> + LocalAnalysis<F, Bounds<F>, N>, BTNodeLookup: BTNode<F, usize, Bounds<F>, N>, - Cube<F, N>: P2Minimise<Loc<F, N>, F>, PlotLookup : Plotting<N>, DiscreteMeasure<Loc<F, N>, F> : SpikeMerging<F>, PDPS<'a, F, A, D, N> : FBSpecialisation<F, A::Observable, N>, - D : Subdifferentiable<F, A::Observable> { + D : Subdifferentiable<F, A::Observable>, + Reg : RegTerm<F, N> { 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<F>, + iterator : I, + plotter : SeqPlotter<F, N>, + dataterm : D, +) -> DiscreteMeasure<Loc<F, N>, F> +where F : Float + ToNalgebraRealField, + I : AlgIteratorFactory<IterInfo<F, N>>, + for<'b> &'b A::Observable : std::ops::Neg<Output=A::Observable> + + std::ops::Add<A::Observable, Output=A::Observable>, + A::Observable : std::ops::MulAssign<F>, + GA : SupportGenerator<F, N, SupportType = S, Id = usize> + Clone, + A : ForwardModel<Loc<F, N>, F, PreadjointCodomain = BTFN<F, GA, BTA, N>> + + Lipschitz<𝒟, FloatType=F>, + BTA : BTSearch<F, N, Data=usize, Agg=Bounds<F>>, + G𝒟 : SupportGenerator<F, N, SupportType = K, Id = usize> + Clone, + 𝒟 : DiscreteMeasureOp<Loc<F, N>, F, PreCodomain = PreBTFN<F, G𝒟, N>>, + 𝒟::Codomain : RealMapping<F, N>, + S: RealMapping<F, N> + LocalAnalysis<F, Bounds<F>, N>, + K: RealMapping<F, N> + LocalAnalysis<F, Bounds<F>, N>, + BTNodeLookup: BTNode<F, usize, Bounds<F>, N>, + Cube<F, N>: P2Minimise<Loc<F, N>, F>, + PlotLookup : Plotting<N>, + DiscreteMeasure<Loc<F, N>, F> : SpikeMerging<F>, + PDPS<'a, F, A, D, N> : FBSpecialisation<F, A::Observable, N>, + D : Subdifferentiable<F, A::Observable> { + + pointsource_pdps_reg(opA, b, NonnegRadonRegTerm(α), op𝒟, config, iterator, plotter, dataterm) +}