1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
use std::collections::{HashMap, HashSet};

use clap::builder::Styles;

#[::linkme::distributed_slice]
pub static PARAMS: [(&str, &str)];

pub fn generate_params_help() -> String {
    let mut params: HashMap<String, HashSet<String>> = HashMap::default();
    if PARAMS.len() == 0 {
        return "".to_string();
    }
    for kv in PARAMS {
        params
            .entry(kv.0.to_string())
            .and_modify(|s| {
                s.insert(kv.1.to_string());
            })
            .or_insert(HashSet::from([kv.1.to_string()]));
    }
    let mut params: Vec<_> = params
        .iter()
        .map(|kv| {
            let mut descs = Vec::from_iter(kv.1.iter().cloned());
            descs.sort();
            (kv.0.clone(), descs.join("\n\t"))
        })
        .collect();
    params.sort_by_key(|x| x.0.clone());

    let styles = Styles::default();
    let header = styles.get_header();
    let literal = styles.get_literal();
    format!(
        "{}Hyperparameters:{}\n",
        header.render(),
        header.render_reset()
    ) + &params
        .iter()
        .map(|kv| {
            format!(
                "  {}{}{}\n\t{}",
                literal.render(),
                kv.0,
                literal.render_reset(),
                kv.1
            )
        })
        .collect::<Vec<String>>()
        .join("\n\n")
}