--- 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, ®, - 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(), ε,