src/fb.rs

changeset 93
8f1e57821d76
parent 91
47d495348e38
child 98
b9818eb24b47
--- a/src/fb.rs	Tue Aug 04 20:11:10 2026 -0500
+++ b/src/fb.rs	Thu Aug 06 11:14:15 2026 -0500
@@ -79,7 +79,7 @@
 
 use crate::domain::{AdmissibleDomain, FullSpace};
 use crate::measures::merging::SpikeMerging;
-use crate::measures::{DiscreteMeasure, RNDM};
+use crate::measures::DiscreteMeasure;
 use crate::plot::Plotter;
 pub use crate::prox_penalty::{InsertionConfig, ProxPenalty, StepLengthBound};
 use crate::regularisation::RegTerm;
@@ -87,6 +87,7 @@
 use alg_tools::error::DynResult;
 use alg_tools::instance::Instance;
 use alg_tools::iterate::AlgIteratorFactory;
+use alg_tools::linops::Space;
 use alg_tools::mapping::DifferentiableMapping;
 use alg_tools::nalgebra_support::ToNalgebraRealField;
 use colored::Colorize;
@@ -113,8 +114,8 @@
     }
 }
 
-pub(crate) fn prune_with_stats<F: Float, const N: usize>(
-    μ: &mut RNDM<N, F>,
+pub(crate) fn prune_with_stats<U: Space, F: Float>(
+    μ: &mut DiscreteMeasure<U, F>,
     until: usize,
 ) -> usize {
     let n_before_prune = μ.len();
@@ -124,14 +125,16 @@
 }
 
 #[replace_float_literals(F::cast_from(literal))]
-pub(crate) fn postprocess<F: Float, Dat: Fn(&RNDM<N, F>) -> F, const N: usize>(
-    mut μ: RNDM<N, F>,
+pub(crate) fn postprocess<F: Float, U, Dat>(
+    mut μ: DiscreteMeasure<U, F>,
     config: &InsertionConfig<F>,
     f: Dat,
-) -> DynResult<RNDM<N, F>>
+) -> DynResult<DiscreteMeasure<U, F>>
 where
-    RNDM<N, F>: SpikeMerging<F>,
-    for<'a> &'a RNDM<N, F>: Instance<RNDM<N, F>>,
+    Dat: Fn(&DiscreteMeasure<U, F>) -> F,
+    U: Space + Clone,
+    DiscreteMeasure<U, F>: SpikeMerging<F>,
+    for<'a> &'a DiscreteMeasure<U, F>: Instance<DiscreteMeasure<U, F>>,
 {
     //μ.merge_spikes_fitness(config.final_merging_method(), |μ̃| f.apply(μ̃), |&v| v);
     μ.merge_spikes_fitness(config.final_merging_method(), f, |&v| v);
@@ -151,25 +154,26 @@
 ///
 /// Returns the final iterate.
 #[replace_float_literals(F::cast_from(literal))]
-pub fn pointsource_fb_dom<F, I, Dat, Reg, P, Plot, const N: usize>(
+pub fn pointsource_fb_dom<F, I, Dat, Reg, P, Plot, U>(
     f: &Dat,
     reg: &Reg,
     prox_penalty: &P,
     fbconfig: &FBConfig<F>,
     iterator: I,
     mut plotter: Plot,
-    μ0: Option<RNDM<N, F>>,
-    domain: &mut impl AdmissibleDomain<Loc<N, F>>,
-) -> DynResult<RNDM<N, F>>
+    μ0: Option<DiscreteMeasure<U, F>>,
+    domain: &mut impl AdmissibleDomain<U>,
+) -> DynResult<DiscreteMeasure<U, F>>
 where
+    U: Space + Clone,
     F: Float + ToNalgebraRealField,
     I: AlgIteratorFactory<IterInfo<F>>,
-    RNDM<N, F>: SpikeMerging<F>,
-    Dat: DifferentiableMapping<RNDM<N, F>, Codomain = F>,
+    DiscreteMeasure<U, F>: SpikeMerging<F>,
+    Dat: DifferentiableMapping<DiscreteMeasure<U, F>, Codomain = F>,
     Dat::DerivativeDomain: ClosedMul<F>,
-    Reg: RegTerm<Loc<N, F>, F>,
-    P: ProxPenalty<Loc<N, F>, Dat::DerivativeDomain, Reg, F> + StepLengthBound<F, Dat>,
-    Plot: Plotter<P::ReturnMapping, Dat::DerivativeDomain, RNDM<N, F>>,
+    Reg: RegTerm<U, F>,
+    P: ProxPenalty<U, Dat::DerivativeDomain, Reg, F> + StepLengthBound<F, Dat>,
+    Plot: Plotter<P::ReturnMapping, Dat::DerivativeDomain, DiscreteMeasure<U, F>>,
 {
     // Set up parameters
     let config = &fbconfig.insertion;
@@ -183,7 +187,7 @@
     let mut μ = μ0.unwrap_or_else(|| DiscreteMeasure::new());
 
     // Statistics
-    let full_stats = |μ: &RNDM<N, F>, ε, stats| IterInfo {
+    let full_stats = |μ: &DiscreteMeasure<U, F>, ε, stats| IterInfo {
         value: f.apply(μ) + reg.apply(μ),
         n_spikes: μ.len(),
         ε,
@@ -219,7 +223,7 @@
                     ε,
                     ins,
                     &reg,
-                    Some(|μ̃: &RNDM<N, F>| f.apply(μ̃) + reg.apply(μ̃)),
+                    Some(|μ̃: &DiscreteMeasure<U, F>| f.apply(μ̃) + reg.apply(μ̃)),
                 );
 
                 // Prune. Do not prune new insertions on first round.
@@ -267,24 +271,25 @@
 }
 
 #[deprecated]
-pub fn pointsource_fb_reg<F, I, Dat, Reg, P, Plot, const N: usize>(
+pub fn pointsource_fb_reg<F, U, I, Dat, Reg, P, Plot>(
     f: &Dat,
     reg: &Reg,
     prox_penalty: &P,
     fbconfig: &FBConfig<F>,
     iterator: I,
     plotter: Plot,
-    μ0: Option<RNDM<N, F>>,
-) -> DynResult<RNDM<N, F>>
+    μ0: Option<DiscreteMeasure<U, F>>,
+) -> DynResult<DiscreteMeasure<U, F>>
 where
+    U: Space + Clone,
     F: Float + ToNalgebraRealField,
     I: AlgIteratorFactory<IterInfo<F>>,
-    RNDM<N, F>: SpikeMerging<F>,
-    Dat: DifferentiableMapping<RNDM<N, F>, Codomain = F>,
+    DiscreteMeasure<U, F>: SpikeMerging<F>,
+    Dat: DifferentiableMapping<DiscreteMeasure<U, F>, Codomain = F>,
     Dat::DerivativeDomain: ClosedMul<F>,
-    Reg: RegTerm<Loc<N, F>, F>,
-    P: ProxPenalty<Loc<N, F>, Dat::DerivativeDomain, Reg, F> + StepLengthBound<F, Dat>,
-    Plot: Plotter<P::ReturnMapping, Dat::DerivativeDomain, RNDM<N, F>>,
+    Reg: RegTerm<U, F>,
+    P: ProxPenalty<U, Dat::DerivativeDomain, Reg, F> + StepLengthBound<F, Dat>,
+    Plot: Plotter<P::ReturnMapping, Dat::DerivativeDomain, DiscreteMeasure<U, F>>,
 {
     pointsource_fb_dom(
         f,
@@ -310,24 +315,25 @@
 ///
 /// Returns the final iterate.
 #[replace_float_literals(F::cast_from(literal))]
-pub fn pointsource_fista_reg<F, I, Dat, Reg, P, Plot, const N: usize>(
+pub fn pointsource_fista_reg<F, U, I, Dat, Reg, P, Plot>(
     f: &Dat,
     reg: &Reg,
     prox_penalty: &P,
     fbconfig: &FBConfig<F>,
     iterator: I,
     mut plotter: Plot,
-    μ0: Option<RNDM<N, F>>,
-) -> DynResult<RNDM<N, F>>
+    μ0: Option<DiscreteMeasure<U, F>>,
+) -> DynResult<DiscreteMeasure<U, F>>
 where
+    U: Space + Clone,
     F: Float + ToNalgebraRealField,
     I: AlgIteratorFactory<IterInfo<F>>,
-    RNDM<N, F>: SpikeMerging<F>,
-    Dat: DifferentiableMapping<RNDM<N, F>, Codomain = F>,
+    DiscreteMeasure<U, F>: SpikeMerging<F>,
+    Dat: DifferentiableMapping<DiscreteMeasure<U, F>, Codomain = F>,
     Dat::DerivativeDomain: ClosedMul<F>,
-    Reg: RegTerm<Loc<N, F>, F>,
-    P: ProxPenalty<Loc<N, F>, Dat::DerivativeDomain, Reg, F> + StepLengthBound<F, Dat>,
-    Plot: Plotter<P::ReturnMapping, Dat::DerivativeDomain, RNDM<N, F>>,
+    Reg: RegTerm<U, F>,
+    P: ProxPenalty<U, Dat::DerivativeDomain, Reg, F> + StepLengthBound<F, Dat>,
+    Plot: Plotter<P::ReturnMapping, Dat::DerivativeDomain, DiscreteMeasure<U, F>>,
 {
     // Set up parameters
     let config = &fbconfig.insertion;
@@ -344,7 +350,7 @@
     let mut warned_merging = false;
 
     // Statistics
-    let full_stats = |ν: &RNDM<N, F>, ε, stats| IterInfo {
+    let full_stats = |ν: &DiscreteMeasure<U, F>, ε, stats| IterInfo {
         value: f.apply(ν) + reg.apply(ν),
         n_spikes: ν.len(),
         ε,

mercurial