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