src/pdps.rs

changeset 24
d29d1fcf5423
parent 13
bdc57366d4f5
--- 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)
+}

mercurial