diff -r c5d8bd1a7728 -r 6316d68b58af src/main.rs --- a/src/main.rs Thu Jan 23 23:35:28 2025 +0100 +++ b/src/main.rs Thu Jan 23 23:34:05 2025 +0100 @@ -16,6 +16,7 @@ use clap::Parser; use serde::{Serialize, Deserialize}; use serde_json; +use serde_with::skip_serializing_none; use itertools::Itertools; use std::num::NonZeroUsize; @@ -56,12 +57,12 @@ AlgorithmConfig, }; use experiments::DefaultExperiment; -use measures::merging::SpikeMergingMethod; use DefaultExperiment::*; use DefaultAlgorithm::*; /// Command line parameters -#[derive(Parser, Debug, Serialize)] +#[skip_serializing_none] +#[derive(Parser, Debug, Serialize, Default, Clone)] #[clap( about = env!("CARGO_PKG_DESCRIPTION"), author = env!("CARGO_PKG_AUTHORS"), @@ -96,7 +97,7 @@ /// Not all algorithms are available for all the experiments. /// In particular, only PDPS is available for the experiments with L¹ data term. #[arg(value_enum, value_name = "ALGORITHM", long, short = 'a', - default_values_t = [FB, FISTA, PDPS, SlidingFB, FW, FWRelax])] + default_values_t = [FB, PDPS, SlidingFB, FW, RadonFB])] algorithm : Vec, /// Saved algorithm configration(s) to use on the experiments @@ -119,6 +120,10 @@ /// Number of threads. Overrides the maximum number. num_threads : Option, + #[arg(long, default_value_t = false)] + /// Load saved value ranges (if exists) to do partial update. + load_valuerange : bool, + #[clap(flatten, next_help_heading = "Experiment overrides")] /// Experiment setup overrides experiment_overrides : ExperimentOverrides, @@ -129,7 +134,8 @@ } /// Command line experiment setup overrides -#[derive(Parser, Debug, Serialize, Deserialize)] +#[skip_serializing_none] +#[derive(Parser, Debug, Serialize, Deserialize, Default, Clone)] pub struct ExperimentOverrides { #[arg(long)] /// Regularisation parameter override. @@ -152,7 +158,8 @@ } /// Command line algorithm parametrisation overrides -#[derive(Parser, Debug, Serialize, Deserialize)] +#[skip_serializing_none] +#[derive(Parser, Debug, Serialize, Deserialize, Default, Clone)] pub struct AlgorithmOverrides { #[arg(long, value_names = &["COUNT", "EACH"])] /// Override bootstrap insertion iterations for --algorithm. @@ -187,12 +194,12 @@ theta0 : Option, #[arg(long)] - /// Transport toleranced wrt. ω - transport_tolerance_omega : Option, + /// A priori transport tolerance multiplier (C_pri) + transport_tolerance_pri : Option, #[arg(long)] - /// Transport toleranced wrt. ∇v - transport_tolerance_dv : Option, + /// A posteriori transport tolerance multiplier (C_pos) + transport_tolerance_pos : Option, #[arg(long)] /// Transport adaptation factor. Must be in (0, 1). @@ -218,18 +225,26 @@ /// Only affects FB, FISTA, and PDPS. merge_every : Option, - #[arg(value_enum, long)]//, value_parser = SpikeMergingMethod::::value_parser())] - /// Merging strategy - /// - /// Either the string "none", or a radius value for heuristic merging. - merging : Option>, + #[arg(long)] + /// Enable merging (default: determined by algorithm) + merge : Option, + + #[arg(long)] + /// Merging radius (default: determined by experiment) + merge_radius : Option, - #[arg(value_enum, long)]//, value_parser = SpikeMergingMethod::::value_parser())] - /// Final merging strategy - /// - /// Either the string "none", or a radius value for heuristic merging. - /// Only affects FB, FISTA, and PDPS. - final_merging : Option>, + #[arg(long)] + /// Interpolate when merging (default : determined by algorithm) + merge_interp : Option, + + #[arg(long)] + /// Enable final merging (default: determined by algorithm) + final_merging : Option, + + #[arg(long)] + /// Enable fitness-based merging for relevant FB-type methods. + /// This has worse convergence guarantees that merging based on optimality conditions. + fitness_merging : Option, #[arg(long, value_names = &["ε", "θ", "p"])] /// Set the tolerance to ε_k = ε/(1+θk)^p @@ -266,11 +281,12 @@ let mut algs : Vec>> = cli.algorithm .iter() - .map(|alg| alg.to_named( - experiment.algorithm_defaults(*alg) - .unwrap_or_else(|| alg.default_config()) - .cli_override(&cli.algoritm_overrides) - )) + .map(|alg| { + let cfg = alg.default_config() + .cli_override(&experiment.algorithm_overrides(*alg)) + .cli_override(&cli.algoritm_overrides); + alg.to_named(cfg) + }) .collect(); for filename in cli.saved_algorithm.iter() { let f = std::fs::File::open(filename).unwrap();