arnaucube
arnaucube/shockwave-plusPublic Self-hosted repository
shockwave-plus/tensor_pcs/benches/prove.rs
tensor_pcs/benches/prove.rsRaw
 1use criterion::{black_box, criterion_group, criterion_main, Criterion};
 2use tensor_pcs::{
 3    rs_config, FieldExt, SparseMLPoly, TensorMultilinearPCS, TensorRSMultilinearPCSConfig,
 4    Transcript,
 5};
 6
 7fn poly<F: FieldExt>(num_vars: usize) -> SparseMLPoly<F> {
 8    let num_entries: usize = 2usize.pow(num_vars as u32);
 9
10    let evals = (0..num_entries)
11        .map(|i| (i, F::from(i as u64)))
12        .collect::<Vec<(usize, F)>>();
13
14    let ml_poly = SparseMLPoly::new(evals, num_vars);
15    ml_poly
16}
17
18fn config_base<F: FieldExt>(ml_poly: &SparseMLPoly<F>) -> TensorRSMultilinearPCSConfig<F> {
19    let num_vars = ml_poly.num_vars;
20    let num_evals = 2usize.pow(num_vars as u32);
21    let num_rows = 2usize.pow((num_vars / 2) as u32);
22
23    let expansion_factor = 2;
24
25    TensorRSMultilinearPCSConfig::<F> {
26        expansion_factor,
27        domain_powers: None,
28        fft_domain: None,
29        ecfft_config: None,
30        l: 10,
31        num_entries: num_evals,
32        num_rows,
33    }
34}
35
36fn pcs_fft_bench(c: &mut Criterion) {
37    type F = halo2curves::pasta::Fp;
38
39    let num_vars = 13;
40    let ml_poly = poly(num_vars);
41    let open_at = (0..ml_poly.num_vars)
42        .map(|i| F::from(i as u64))
43        .collect::<Vec<F>>();
44
45    let mut config = config_base(&ml_poly);
46    config.fft_domain = Some(rs_config::smooth::gen_config::<F>(config.num_cols()));
47
48    let mut group = c.benchmark_group("pcs fft");
49    group.bench_function("prove", |b| {
50        b.iter(|| {
51            let pcs = TensorMultilinearPCS::<F>::new(config.clone());
52
53            let mut transcript = Transcript::new(b"bench");
54            let comm = pcs.commit(&black_box(ml_poly.clone()));
55            pcs.open(&comm, &ml_poly, &open_at, &mut transcript);
56        })
57    });
58}
59
60fn pcs_ecfft_bench(c: &mut Criterion) {
61    type F = halo2curves::secp256k1::Fp;
62
63    let num_vars = 13;
64    let ml_poly = poly(num_vars);
65    let open_at = (0..ml_poly.num_vars)
66        .map(|i| F::from(i as u64))
67        .collect::<Vec<F>>();
68
69    let mut config = config_base(&ml_poly);
70    config.ecfft_config = Some(rs_config::ecfft::gen_config::<F>(config.num_cols()));
71
72    let mut group = c.benchmark_group("pcs ecfft");
73    group.bench_function("prove", |b| {
74        b.iter(|| {
75            let pcs = TensorMultilinearPCS::<F>::new(config.clone());
76
77            let mut transcript = Transcript::new(b"bench");
78            let comm = pcs.commit(&black_box(ml_poly.clone()));
79            pcs.open(&comm, &ml_poly, &open_at, &mut transcript);
80        })
81    });
82}
83
84fn set_duration() -> Criterion {
85    Criterion::default().sample_size(10)
86}
87
88criterion_group! {
89    name = benches;
90    config = set_duration();
91    targets = pcs_fft_bench, pcs_ecfft_bench
92}
93criterion_main!(benches);