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>() -> TensorRSMultilinearPCSConfig<F> {
19    let expansion_factor = 2;
20
21    TensorRSMultilinearPCSConfig::<F> {
22        expansion_factor,
23        domain_powers: None,
24        fft_domain: None,
25        ecfft_config: None,
26        l: 10,
27    }
28}
29
30fn pcs_fft_bench(c: &mut Criterion) {
31    type F = halo2curves::pasta::Fp;
32
33    let num_vars = 13;
34    let ml_poly = poly(num_vars);
35    let open_at = (0..ml_poly.num_vars)
36        .map(|i| F::from(i as u64))
37        .collect::<Vec<F>>();
38
39    let mut config = config_base();
40    config.fft_domain = Some(rs_config::smooth::gen_config::<F>(
41        config.num_cols(ml_poly.evals.len()),
42    ));
43
44    let mut group = c.benchmark_group("pcs fft");
45    group.bench_function("prove", |b| {
46        b.iter(|| {
47            let pcs = TensorMultilinearPCS::<F>::new(config.clone());
48
49            let mut transcript = Transcript::new(b"bench");
50            let comm = pcs.commit(&black_box(ml_poly.clone()));
51            pcs.open(&comm, &ml_poly, &open_at, &mut transcript);
52        })
53    });
54}
55
56fn pcs_ecfft_bench(c: &mut Criterion) {
57    type F = halo2curves::secp256k1::Fp;
58
59    let num_vars = 13;
60    let ml_poly = poly(num_vars);
61    let open_at = (0..ml_poly.num_vars)
62        .map(|i| F::from(i as u64))
63        .collect::<Vec<F>>();
64
65    let mut config = config_base();
66    config.ecfft_config = Some(rs_config::ecfft::gen_config::<F>(
67        config.num_cols(ml_poly.evals.len()),
68    ));
69
70    let mut group = c.benchmark_group("pcs ecfft");
71    group.bench_function("prove", |b| {
72        b.iter(|| {
73            let pcs = TensorMultilinearPCS::<F>::new(config.clone());
74
75            let mut transcript = Transcript::new(b"bench");
76            let comm = pcs.commit(&black_box(ml_poly.clone()));
77            pcs.open(&comm, &ml_poly, &open_at, &mut transcript);
78        })
79    });
80}
81
82fn set_duration() -> Criterion {
83    Criterion::default().sample_size(10)
84}
85
86criterion_group! {
87    name = benches;
88    config = set_duration();
89    targets = pcs_ecfft_bench
90}
91criterion_main!(benches);