diff -r c5d8bd1a7728 -r 6316d68b58af src/experiments.rs --- a/src/experiments.rs Thu Jan 23 23:35:28 2025 +0100 +++ b/src/experiments.rs Thu Jan 23 23:34:05 2025 +0100 @@ -13,10 +13,9 @@ use alg_tools::error::DynResult; use alg_tools::norms::Linfinity; -use crate::ExperimentOverrides; +use crate::{ExperimentOverrides, AlgorithmOverrides}; use crate::kernels::*; use crate::kernels::SupportProductFirst as Prod; -use crate::pdps::PDPSConfig; use crate::types::*; use crate::run::{ RunnableExperiment, @@ -24,8 +23,6 @@ ExperimentBiased, Named, DefaultAlgorithm, - AlgorithmConfig, - ProxTerm }; //use crate::fb::FBGenericConfig; use crate::rand_distr::{SerializableNormal, SaltAndPepper}; @@ -64,9 +61,12 @@ /// Two dimensions, “fast” spread, 1-norm data fidelity #[clap(name = "2d_l1_fast")] Experiment2D_L1_Fast, - /// One dimension, “fast” spread, 2-norm-squared data fidelity with extra TV-regularised bias + /// One dimension, “fast” spread, 2-norm-squared data fidelity with extra TV-regularised bias #[clap(name = "1d_tv_fast")] Experiment1D_TV_Fast, + /// Two dimensions, “fast” spread, 2-norm-squared data fidelity with extra TV-regularised bias + #[clap(name = "2d_tv_fast")] + Experiment2D_TV_Fast, } macro_rules! make_float_constant { @@ -146,25 +146,59 @@ make_float_constant!(HatBias = 0.05); // We use a different step length for PDPS in 2D experiments - let pdps_2d = || { - let τ0 = 3.0; - PDPSConfig { - τ0, - σ0 : 0.99 / τ0, + // let pdps_2d = (DefaultAlgorithm::PDPS, + // AlgorithmOverrides { + // tau0 : Some(3.0), + // sigma0 : Some(0.99 / 3.0), + // .. Default::default() + // } + // ); + // let radon_pdps_2d = (DefaultAlgorithm::RadonPDPS, + // AlgorithmOverrides { + // tau0 : Some(3.0), + // sigma0 : Some(0.99 / 3.0), + // .. Default::default() + // } + // ); + let sliding_fb_cut_gaussian = (DefaultAlgorithm::SlidingFB, + AlgorithmOverrides { + theta0 : Some(0.3), .. Default::default() } - }; - let defaults_2d = HashMap::from([ - (DefaultAlgorithm::PDPS, AlgorithmConfig::PDPS(pdps_2d(), ProxTerm::Wave)), - (DefaultAlgorithm::RadonPDPS, AlgorithmConfig::PDPS(pdps_2d(), ProxTerm::RadonSquared)) - ]); - + ); + // let higher_cpos = |alg| (alg, + // AlgorithmOverrides { + // transport_tolerance_pos : Some(1000.0), + // .. Default::default() + // } + // ); + let higher_cpos_merging = |alg| (alg, + AlgorithmOverrides { + transport_tolerance_pos : Some(1000.0), + merge : Some(true), + fitness_merging : Some(true), + .. Default::default() + } + ); + let much_higher_cpos_merging_steptune = |alg| (alg, + AlgorithmOverrides { + transport_tolerance_pri : Some(1000.0), + transport_tolerance_pos : Some(10000.0), + sigma0 : Some(0.15), + theta0 : Some(0.3), + merge : Some(true), + fitness_merging : Some(true), + .. Default::default() + } + ); // We add a hash of the experiment name to the configured // noise seed to not use the same noise for different experiments. let mut h = DefaultHasher::new(); name.hash(&mut h); let noise_seed = cli.noise_seed.unwrap_or(BASE_SEED) + h.finish(); + let default_merge_radius = 0.01; + use DefaultExperiment::*; Ok(match self { Experiment1D => { @@ -173,7 +207,7 @@ Box::new(Named { name, data : ExperimentV2 { domain : [[0.0, 1.0]].into(), sensor_count : [N_SENSORS_1D], - regularisation : Regularisation::NonnegRadon(cli.alpha.unwrap_or(0.09)), + regularisation : Regularisation::NonnegRadon(cli.alpha.unwrap_or(0.08)), noise_distr : SerializableNormal::new(0.0, cli.variance.unwrap_or(0.2))?, dataterm : DataTerm::L2Squared, μ_hat : MU_TRUE_1D_BASIC.into(), @@ -182,7 +216,12 @@ kernel : Prod(AutoConvolution(spread_cutoff), base_spread), kernel_plot_width, noise_seed, - algorithm_defaults: HashMap::new(), + default_merge_radius, + algorithm_overrides: HashMap::from([ + sliding_fb_cut_gaussian, + higher_cpos_merging(DefaultAlgorithm::RadonFB), + higher_cpos_merging(DefaultAlgorithm::RadonSlidingFB), + ]), }}) }, Experiment1DFast => { @@ -199,7 +238,11 @@ kernel : base_spread, kernel_plot_width, noise_seed, - algorithm_defaults: HashMap::new(), + default_merge_radius, + algorithm_overrides: HashMap::from([ + higher_cpos_merging(DefaultAlgorithm::RadonFB), + higher_cpos_merging(DefaultAlgorithm::RadonSlidingFB), + ]), }}) }, Experiment2D => { @@ -217,7 +260,14 @@ kernel : Prod(AutoConvolution(spread_cutoff), base_spread), kernel_plot_width, noise_seed, - algorithm_defaults: defaults_2d, + default_merge_radius, + algorithm_overrides: HashMap::from([ + sliding_fb_cut_gaussian, + higher_cpos_merging(DefaultAlgorithm::RadonFB), + higher_cpos_merging(DefaultAlgorithm::RadonSlidingFB), + // pdps_2d, + // radon_pdps_2d + ]), }}) }, Experiment2DFast => { @@ -234,7 +284,13 @@ kernel : base_spread, kernel_plot_width, noise_seed, - algorithm_defaults: defaults_2d, + default_merge_radius, + algorithm_overrides: HashMap::from([ + // pdps_2d, + // radon_pdps_2d + higher_cpos_merging(DefaultAlgorithm::RadonFB), + higher_cpos_merging(DefaultAlgorithm::RadonSlidingFB), + ]), }}) }, Experiment1D_L1 => { @@ -255,7 +311,8 @@ kernel : Prod(AutoConvolution(spread_cutoff), base_spread), kernel_plot_width, noise_seed, - algorithm_defaults: HashMap::new(), + default_merge_radius, + algorithm_overrides: HashMap::new(), }}) }, Experiment1D_L1_Fast => { @@ -275,7 +332,8 @@ kernel : base_spread, kernel_plot_width, noise_seed, - algorithm_defaults: HashMap::new(), + default_merge_radius, + algorithm_overrides: HashMap::new(), }}) }, Experiment2D_L1 => { @@ -296,7 +354,11 @@ kernel : Prod(AutoConvolution(spread_cutoff), base_spread), kernel_plot_width, noise_seed, - algorithm_defaults: defaults_2d, + default_merge_radius, + algorithm_overrides: HashMap::from([ + // pdps_2d, + // radon_pdps_2d + ]), }}) }, Experiment2D_L1_Fast => { @@ -316,7 +378,11 @@ kernel : base_spread, kernel_plot_width, noise_seed, - algorithm_defaults: defaults_2d, + default_merge_radius, + algorithm_overrides: HashMap::from([ + // pdps_2d, + // radon_pdps_2d + ]), }}) }, Experiment1D_TV_Fast => { @@ -339,7 +405,39 @@ kernel : base_spread, kernel_plot_width, noise_seed, - algorithm_defaults: HashMap::new(), + default_merge_radius, + algorithm_overrides: HashMap::from([ + higher_cpos_merging(DefaultAlgorithm::RadonForwardPDPS), + higher_cpos_merging(DefaultAlgorithm::RadonSlidingPDPS), + ]), + }, + }}) + }, + Experiment2D_TV_Fast => { + let base_spread = HatConv { radius : Hat1 }; + Box::new(Named { name, data : ExperimentBiased { + λ : 0.005, + bias : MappingSum::new([ + Weighted::new(1.0, BallCharacteristic{ center : [0.3, 0.3].into(), radius : 0.2 }), + Weighted::new(0.5, BallCharacteristic{ center : [0.6, 0.6].into(), radius : 0.3 }), + ]), + base : ExperimentV2 { + domain : [[0.0, 1.0]; 2].into(), + sensor_count : [N_SENSORS_2D; 2], + regularisation : Regularisation::NonnegRadon(cli.alpha.unwrap_or(0.06)), + noise_distr : SerializableNormal::new(0.0, cli.variance.unwrap_or(0.15))?, //0.25 + dataterm : DataTerm::L2Squared, + μ_hat : MU_TRUE_2D_BASIC.into(), + sensor : BallIndicator { r : SensorWidth2D, exponent : Linfinity }, + spread : base_spread, + kernel : base_spread, + kernel_plot_width, + noise_seed, + default_merge_radius, + algorithm_overrides: HashMap::from([ + much_higher_cpos_merging_steptune(DefaultAlgorithm::RadonForwardPDPS), + much_higher_cpos_merging_steptune(DefaultAlgorithm::RadonSlidingPDPS), + ]), }, }}) },