generate_param_sweep/
generate_param_sweep.rs

1use std::path::Path;
2
3use openvm_stark_backend::{SystemParams, WhirProximityStrategy};
4use openvm_stark_sdk::config::{params_with_100_bits_security, RECURSION_MAX_CONSTRAINT_DEGREE};
5use serde::Serialize;
6
7#[derive(Serialize, Default)]
8struct ParamSet {
9    app: Option<SystemParams>,
10    leaf: Option<SystemParams>,
11    internal: Option<SystemParams>,
12    root: Option<SystemParams>,
13}
14
15fn main() {
16    let output_dir = std::env::args()
17        .nth(1)
18        .unwrap_or_else(|| env!("CARGO_MANIFEST_DIR").to_string());
19    generate_interesting_internal_params(&output_dir);
20    generate_interesting_root_params(&output_dir);
21}
22
23fn generate_interesting_internal_params(output_dir: impl AsRef<Path>) {
24    let w_stack = 512;
25    let make_internal_params =
26        |max_log_height, k_whir, log_blowup, l_skip, pow_bits, folding_pow_bits| -> SystemParams {
27            let n_stack = max_log_height - l_skip;
28            let proximity = WhirProximityStrategy::ListDecoding { m: 2 };
29            params_with_100_bits_security(
30                log_blowup,
31                l_skip,
32                n_stack,
33                w_stack,
34                folding_pow_bits,
35                pow_bits,
36                proximity,
37                RECURSION_MAX_CONSTRAINT_DEGREE,
38                pow_bits,
39                k_whir,
40            )
41        };
42    // Root override matching internal_sweep_root.json: fixed l_skip=2, n_stack=18, log_blowup=4,
43    // k_whir=4, proximity=ListDecoding{m:1}, all pow_bits=20; only w_stack varies per entry.
44    let make_root_params = |root_w_stack| -> SystemParams {
45        let max_log_height = 20;
46        let l_skip = 2;
47        let n_stack = max_log_height - l_skip;
48        let log_blowup = 4;
49        let k_whir = 4;
50        let proximity = WhirProximityStrategy::ListDecoding { m: 1 };
51        let pow_bits = 20;
52        params_with_100_bits_security(
53            log_blowup,
54            l_skip,
55            n_stack,
56            root_w_stack,
57            pow_bits,
58            pow_bits,
59            proximity,
60            RECURSION_MAX_CONSTRAINT_DEGREE,
61            pow_bits,
62            k_whir,
63        )
64    };
65    let make_param =
66        |max_log_height, k_whir, log_blowup, l_skip, pow_bits, folding_pow_bits| ParamSet {
67            internal: Some(make_internal_params(
68                max_log_height,
69                k_whir,
70                log_blowup,
71                l_skip,
72                pow_bits,
73                folding_pow_bits,
74            )),
75            ..Default::default()
76        };
77    let make_param_with_root =
78        |max_log_height, k_whir, log_blowup, l_skip, pow_bits, folding_pow_bits, root_w_stack| {
79            ParamSet {
80                internal: Some(make_internal_params(
81                    max_log_height,
82                    k_whir,
83                    log_blowup,
84                    l_skip,
85                    pow_bits,
86                    folding_pow_bits,
87                )),
88                root: Some(make_root_params(root_w_stack)),
89                ..Default::default()
90            }
91        };
92    let no_root_params = vec![
93        // log_blowup=2, k_whir=3, max_log_height=19
94        make_param(19, 3, 2, 1, 20, 18),
95        make_param(19, 3, 2, 2, 20, 18),
96        make_param(19, 3, 2, 3, 20, 18),
97        make_param(19, 3, 2, 4, 20, 18),
98        make_param(19, 3, 2, 5, 20, 18),
99        // log_blowup=3, k_whir=3, max_log_height=19
100        make_param(19, 3, 3, 1, 20, 18),
101        make_param(19, 3, 3, 2, 20, 18),
102        make_param(19, 3, 3, 3, 20, 18),
103        make_param(19, 3, 3, 4, 20, 18),
104        make_param(19, 3, 3, 5, 20, 18),
105        // log_blowup=2, k_whir=4, max_log_height=19
106        make_param(19, 4, 2, 1, 20, 18),
107        make_param(19, 4, 2, 2, 20, 18),
108        make_param(19, 4, 2, 3, 20, 18),
109        make_param(19, 4, 2, 4, 20, 18),
110        make_param(19, 4, 2, 5, 20, 18),
111        // log_blowup=3, k_whir=4, max_log_height=19
112        make_param(19, 4, 3, 1, 20, 18),
113        make_param(19, 4, 3, 2, 20, 18),
114        make_param(19, 4, 3, 3, 20, 18),
115        make_param(19, 4, 3, 4, 20, 18),
116        make_param(19, 4, 3, 5, 20, 18),
117        // log_blowup=1, k_whir=4, max_log_height=20
118        make_param(20, 4, 1, 1, 20, 18),
119        make_param(20, 4, 1, 2, 20, 18),
120        make_param(20, 4, 1, 3, 20, 18),
121        make_param(20, 4, 1, 4, 20, 18),
122        make_param(20, 4, 1, 5, 20, 18),
123        // log_blowup=2, k_whir=4, max_log_height=20
124        make_param(20, 4, 2, 1, 20, 18),
125        make_param(20, 4, 2, 2, 20, 18),
126        make_param(20, 4, 2, 3, 20, 18),
127        make_param(20, 4, 2, 4, 20, 18),
128        make_param(20, 4, 2, 5, 20, 18),
129    ];
130    let root_params = vec![
131        // internal log_blowup=3, k_whir=4, max_log_height=19; root w_stack=18
132        make_param_with_root(19, 4, 3, 1, 20, 18, 18),
133        make_param_with_root(19, 4, 3, 2, 20, 18, 18),
134        make_param_with_root(19, 4, 3, 3, 20, 18, 18),
135        make_param_with_root(19, 4, 3, 4, 20, 18, 18),
136        make_param_with_root(19, 4, 3, 5, 20, 18, 18),
137    ];
138
139    let tests_dir = output_dir.as_ref();
140    let no_root_path = tests_dir.join("internal_sweep_no_root.json");
141    serde_json::to_writer_pretty(
142        std::fs::File::create(&no_root_path).expect("failed to create internal_sweep_no_root.json"),
143        &no_root_params,
144    )
145    .expect("failed to write internal_sweep_no_root.json");
146    println!(
147        "wrote {} entries to {}",
148        no_root_params.len(),
149        no_root_path.display()
150    );
151
152    let root_path = tests_dir.join("internal_sweep_root.json");
153    serde_json::to_writer_pretty(
154        std::fs::File::create(&root_path).expect("failed to create internal_sweep_root.json"),
155        &root_params,
156    )
157    .expect("failed to write internal_sweep_root.json");
158    println!(
159        "wrote {} entries to {}",
160        root_params.len(),
161        root_path.display()
162    );
163}
164
165fn generate_interesting_root_params(output_dir: impl AsRef<Path>) {
166    let max_log_height = 20;
167    let w_stack = 18;
168    let make_param = |k_whir, log_blowup, l_skip, pow_bits| {
169        let n_stack = max_log_height - l_skip;
170        let proximity = WhirProximityStrategy::ListDecoding { m: 1 };
171        let root = params_with_100_bits_security(
172            log_blowup,
173            l_skip,
174            n_stack,
175            w_stack,
176            pow_bits,
177            pow_bits,
178            proximity,
179            RECURSION_MAX_CONSTRAINT_DEGREE,
180            pow_bits,
181            k_whir,
182        );
183        ParamSet {
184            root: Some(root),
185            ..Default::default()
186        }
187    };
188    let good_params = vec![
189        // k_whir = 4
190        make_param(4, 2, 1, 20),
191        make_param(4, 2, 4, 20),
192        make_param(4, 2, 5, 20),
193        make_param(4, 3, 1, 20),
194        make_param(4, 3, 2, 20),
195        make_param(4, 3, 3, 20),
196        make_param(4, 3, 5, 20),
197        // k_whir = 3
198        make_param(3, 4, 1, 20),
199        make_param(3, 4, 2, 20),
200        make_param(3, 4, 4, 20),
201        make_param(3, 3, 1, 20),
202        make_param(3, 3, 3, 20),
203        make_param(3, 3, 5, 20),
204        // k_whir = 4, pow_bits lowered
205        make_param(4, 4, 2, 15),
206        make_param(4, 4, 2, 18),
207    ];
208
209    let output_path = output_dir.as_ref().join("root_params.json");
210    let file = std::fs::File::create(&output_path).expect("failed to create root_params.json");
211    serde_json::to_writer_pretty(file, &good_params).expect("failed to write root_params.json");
212    println!(
213        "wrote {} good params to {}",
214        good_params.len(),
215        output_path.display()
216    );
217}