--- a/src/run.rs Tue Aug 04 13:46:29 2026 -0500 +++ b/src/run.rs Tue Aug 04 14:12:18 2026 -0500 @@ -2,7 +2,8 @@ This module provides [`RunnableExperiment`] for running chosen algorithms on a chosen experiment. */ -use crate::fb::{pointsource_fb_reg, pointsource_fista_reg, FBConfig, InsertionConfig}; +use crate::domain::{AdmissibleDomain, FullSpace}; +use crate::fb::{pointsource_fb_dom, pointsource_fista_reg, FBConfig, InsertionConfig}; use crate::forward_model::sensor_grid::{ //SensorGridBTFN, Sensor, @@ -11,7 +12,9 @@ Spread, }; use crate::forward_model::*; -use crate::forward_pdps::{pointsource_fb_pair, pointsource_forward_pdps_pair, ForwardPDPSConfig}; +use crate::forward_pdps::{ + pointsource_fb_pair_dom, pointsource_forward_pdps_pair_dom, ForwardPDPSConfig, +}; use crate::frank_wolfe::{pointsource_fw_reg, FWConfig, FWVariant, RegTermFW}; use crate::kernels::*; use crate::measures::merging::{SpikeMerging, SpikeMergingMethod}; @@ -24,7 +27,7 @@ use crate::regularisation::{NonnegRadonRegTerm, RadonRegTerm, Regularisation, SlidingRegTerm}; use crate::seminorms::*; use crate::sliding_fb::{ - pointsource_sliding_fb_dom, SlidingFBConfig, TransportConfig, TransportProxPenalty, + pointsource_sliding_fb, SlidingFBConfig, TransportConfig, TransportProxPenalty, }; use crate::sliding_pdps::{ pointsource_sliding_fb_pair_dom, pointsource_sliding_pdps_pair_dom, SlidingPDPSConfig, @@ -127,6 +130,7 @@ extra_weight_optimisation_steps: cli .extra_weight_optimisation_steps .unwrap_or(g.extra_weight_optimisation_steps), + random_insertions: cli.random_insertions.unwrap_or(g.random_insertions), tolerance: cli .tolerance .as_ref() @@ -989,13 +993,7 @@ f: &Dat, reg: &Reg, prox_penalty: &P, - init: ( - &AlgorithmConfig<F>, - I, - Plot, - Option<RNDM<N, F>>, - String, - ), + init: (&AlgorithmConfig<F>, I, Plot, Option<RNDM<N, F>>, String), cont: impl FnOnce( (&AlgorithmConfig<F>, I, Plot, Option<RNDM<N, F>>, String), ) -> DynResult<RNDM<N, F>>, @@ -1011,7 +1009,7 @@ P: TransportProxPenalty<Loc<N, F>, Dat::DerivativeDomain, Reg, F> + StepLengthBound<F, Dat>, Plot: Plotter<P::ReturnMapping, Dat::DerivativeDomain, RNDM<N, F>>, { - run_fb_dom(f, reg, prox_penalty, init, None, cont) + run_fb_dom(f, reg, prox_penalty, init, &mut FullSpace, cont) } /// Runs FB-style algorithms if `alg` so requests and `prox_penalty` matches. @@ -1028,7 +1026,7 @@ Option<RNDM<N, F>>, String, ), - domain: Option<&P::Dom>, + domain: &mut impl AdmissibleDomain<Loc<N, F>>, cont: impl FnOnce( (&AlgorithmConfig<F>, I, Plot, Option<RNDM<N, F>>, String), ) -> DynResult<RNDM<N, F>>, @@ -1049,7 +1047,16 @@ match alg { &AlgorithmConfig::FB(ref algconfig, prox_type) if prox_type == pt => { print!("{running}"); - pointsource_fb_reg(f, reg, prox_penalty, algconfig, iterator, plotter, μ0) + pointsource_fb_dom( + f, + reg, + prox_penalty, + algconfig, + iterator, + plotter, + μ0, + domain, + ) } &AlgorithmConfig::FISTA(ref algconfig, prox_type) if prox_type == pt => { print!("{running}"); @@ -1057,7 +1064,16 @@ } &AlgorithmConfig::SlidingFB(ref algconfig, prox_type) if prox_type == pt => { print!("{running}"); - pointsource_sliding_fb_dom(f, reg, prox_penalty, algconfig, iterator, plotter, μ0, domain) + pointsource_sliding_fb( + f, + reg, + prox_penalty, + algconfig, + iterator, + plotter, + μ0, + domain, + ) } _ => cont((alg, iterator, plotter, μ0, running)), } @@ -1294,11 +1310,29 @@ save_extra, (μ0, z, y), |p| { - run_pdps_pair_dom(&f, ®, &RadonSquared, &opKz, &fnR, &fnH, p, None, |q| { - run_pdps_pair_dom(&f, ®, &op𝒟, &opKz, &fnR, &fnH, q, None, |_| { - Err(NotImplemented.into()) - }) - }) + run_pdps_pair_dom( + &f, + ®, + &RadonSquared, + &opKz, + &fnR, + &fnH, + p, + &mut FullSpace, + |q| { + run_pdps_pair_dom( + &f, + ®, + &op𝒟, + &opKz, + &fnR, + &fnH, + q, + &mut FullSpace, + |_| Err(NotImplemented.into()), + ) + }, + ) .map(|Pair(μ, z)| (μ, z)) }, ) @@ -1314,11 +1348,29 @@ save_extra, (μ0, z, y), |p| { - run_pdps_pair_dom(&f, ®, &RadonSquared, &opKz, &fnR, &fnH, p, None, |q| { - run_pdps_pair_dom(&f, ®, &op𝒟, &opKz, &fnR, &fnH, q, None, |_| { - Err(NotImplemented.into()) - }) - }) + run_pdps_pair_dom( + &f, + ®, + &RadonSquared, + &opKz, + &fnR, + &fnH, + p, + &mut FullSpace, + |q| { + run_pdps_pair_dom( + &f, + ®, + &op𝒟, + &opKz, + &fnR, + &fnH, + q, + &mut FullSpace, + |_| Err(NotImplemented.into()), + ) + }, + ) .map(|Pair(μ, z)| (μ, z)) }, ) @@ -1379,7 +1431,17 @@ for<'b> H::Conjugate<'b>: Prox<Y>, Plot: Plotter<P::ReturnMapping, S, RNDM<N, F>>, { - run_pdps_pair_dom(f, reg, prox_penalty, opKz, fnR, fnH, init, None, cont) + run_pdps_pair_dom( + f, + reg, + prox_penalty, + opKz, + fnR, + fnH, + init, + &mut FullSpace, + cont, + ) } pub fn run_pdps_pair_dom<F, S, Dat, Reg, Z, R, Y, KOpZ, H, P, I, Plot, const N: usize>( @@ -1396,7 +1458,7 @@ (Option<RNDM<N, F>>, Z, Y), String, ), - domain: Option<&P::Dom>, + domain: &mut impl AdmissibleDomain<Loc<N, F>>, cont: impl FnOnce( ( &AlgorithmConfig<F>, @@ -1436,7 +1498,7 @@ match alg { &AlgorithmConfig::ForwardPDPS(ref algconfig, prox_type) if prox_type == pt => { print!("{running}"); - pointsource_forward_pdps_pair( + pointsource_forward_pdps_pair_dom( f, reg, prox_penalty, @@ -1447,6 +1509,7 @@ opKz, fnR, fnH, + domain, ) } &AlgorithmConfig::SlidingPDPS(ref algconfig, prox_type) if prox_type == pt => { @@ -1508,7 +1571,7 @@ // We should not need to explicitly require this: for<'b> &'b Loc<0, F>: Instance<Loc<0, F>>, { - run_fb_pair_dom(f, reg, prox_penalty, fnR, init, None, cont) + run_fb_pair_dom(f, reg, prox_penalty, fnR, init, &mut FullSpace, cont) } pub fn run_fb_pair_dom<F, S, Dat, Reg, Z, R, P, I, Plot, const N: usize>( @@ -1523,7 +1586,7 @@ (Option<RNDM<N, F>>, Z), String, ), - domain: Option<&P::Dom>, + domain: &mut impl AdmissibleDomain<Loc<N, F>>, cont: impl FnOnce( ( &AlgorithmConfig<F>, @@ -1556,7 +1619,17 @@ match alg { &AlgorithmConfig::FB(ref algconfig, prox_type) if prox_type == pt => { print!("{running}"); - pointsource_fb_pair(f, reg, prox_penalty, algconfig, iterator, plotter, μ0z, fnR) + pointsource_fb_pair_dom( + f, + reg, + prox_penalty, + algconfig, + iterator, + plotter, + μ0z, + fnR, + domain, + ) } &AlgorithmConfig::SlidingFB(ref algconfig, prox_type) if prox_type == pt => { print!("{running}"); @@ -1569,7 +1642,7 @@ plotter, μ0z, fnR, - domain + domain, ) } _ => cont((alg, iterator, plotter, μ0z, running)),