src/main.rs

branch
dev
changeset 39
6316d68b58af
parent 37
c5d8bd1a7728
child 41
b6bdb6cb4d44
--- 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<DefaultAlgorithm>,
 
     /// Saved algorithm configration(s) to use on the experiments
@@ -119,6 +120,10 @@
     /// Number of threads. Overrides the maximum number.
     num_threads : Option<usize>,
 
+    #[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<float>,
@@ -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<F : ClapFloat> {
     #[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<F : ClapFloat> {
     #[arg(long, value_names = &["COUNT", "EACH"])]
     /// Override bootstrap insertion iterations for --algorithm.
@@ -187,12 +194,12 @@
     theta0 : Option<F>,
 
     #[arg(long)]
-    /// Transport toleranced wrt. ω
-    transport_tolerance_omega : Option<F>,
+    /// A priori transport tolerance multiplier (C_pri)
+    transport_tolerance_pri : Option<F>,
 
     #[arg(long)]
-    /// Transport toleranced wrt. ∇v
-    transport_tolerance_dv : Option<F>,
+    /// A posteriori transport tolerance multiplier (C_pos)
+    transport_tolerance_pos : Option<F>,
 
     #[arg(long)]
     /// Transport adaptation factor. Must be in (0, 1).
@@ -218,18 +225,26 @@
     /// Only affects FB, FISTA, and PDPS.
     merge_every : Option<usize>,
 
-    #[arg(value_enum, long)]//, value_parser = SpikeMergingMethod::<float>::value_parser())]
-    /// Merging strategy
-    ///
-    /// Either the string "none", or a radius value for heuristic merging.
-    merging : Option<SpikeMergingMethod<F>>,
+    #[arg(long)]
+    /// Enable merging (default: determined by algorithm)
+    merge : Option<bool>,
+
+    #[arg(long)]
+    /// Merging radius (default: determined by experiment)
+    merge_radius : Option<F>,
 
-    #[arg(value_enum, long)]//, value_parser = SpikeMergingMethod::<float>::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<SpikeMergingMethod<F>>,
+    #[arg(long)]
+    /// Interpolate when merging (default : determined by algorithm)
+    merge_interp : Option<bool>,
+
+    #[arg(long)]
+    /// Enable final merging (default: determined by algorithm)
+    final_merging : Option<bool>,
+
+    #[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<bool>,
 
     #[arg(long, value_names = &["ε", "θ", "p"])]
     /// Set the tolerance to ε_k = ε/(1+θk)^p
@@ -266,11 +281,12 @@
         let mut algs : Vec<Named<AlgorithmConfig<float>>>
             = 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();

mercurial