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);