Skip to content

Commit 5871a45

Browse files
committed
replace the dedicated sumcheck that evaluates AIR shifted (down) columns, by "next" weights in WHIR (-> removes 2 sumchecks overall)
1 parent 0771a14 commit 5871a45

22 files changed

Lines changed: 238 additions & 344 deletions

File tree

Cargo.lock

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/air/Cargo.toml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@ workspace = true
88

99
[dependencies]
1010
tracing.workspace = true
11-
utils.workspace = true
12-
1311
backend.workspace = true
1412

1513
[dev-dependencies]
16-
1714
rand.workspace = true

crates/air/src/lib.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
#![cfg_attr(not(test), warn(unused_crate_dependencies))]
22

33
mod prove;
4-
mod uni_skip_utils;
5-
mod utils;
64
mod validity_check;
75
mod verify;
86

@@ -15,8 +13,5 @@ pub use verify::*;
1513
pub struct AirClaims<EF: Field> {
1614
pub point: MultilinearPoint<EF>,
1715
pub evals: Vec<EF>,
18-
19-
// only for columns with a "shift", in case univariate skip == 1
20-
pub down_point: Option<MultilinearPoint<EF>>,
21-
pub evals_on_down_columns: Vec<EF>,
16+
pub evals_down: Vec<EF>, // columns 'shifted down' by one row
2217
}

crates/air/src/prove.rs

Lines changed: 10 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
use backend::*;
22
use tracing::{info_span, instrument};
3-
use utils::multilinears_linear_combination;
43

5-
use crate::{AirClaims, uni_skip_utils::matrix_next_mle_folded, utils::column_shifted};
4+
use crate::AirClaims;
65

76
/*
87
@@ -66,77 +65,16 @@ where
6665

6766
prover_state.add_extension_scalars(&inner_sums);
6867

69-
open_columns(
70-
prover_state,
71-
&inner_sums,
72-
&air.down_column_indexes(),
73-
&columns,
74-
&outer_sumcheck_challenge,
75-
)
76-
}
77-
78-
#[instrument(skip_all)]
79-
fn open_columns<EF: ExtensionField<PF<EF>>>(
80-
prover_state: &mut impl FSProver<EF>,
81-
inner_evals: &[EF],
82-
columns_with_shift: &[usize],
83-
columns: &[&[PF<EF>]],
84-
outer_sumcheck_challenge: &[EF],
85-
) -> AirClaims<EF> {
86-
let n_columns_up = columns.len();
87-
let n_columns_down = columns_with_shift.len();
88-
assert_eq!(inner_evals.len(), n_columns_up + n_columns_down);
89-
90-
let evals_up = inner_evals[..n_columns_up].to_vec();
91-
let evals_down = &inner_evals[n_columns_up..];
92-
93-
if n_columns_down == 0 {
94-
return AirClaims {
95-
point: MultilinearPoint(outer_sumcheck_challenge.to_vec()),
96-
evals: evals_up,
97-
down_point: None,
98-
evals_on_down_columns: vec![],
99-
};
100-
}
101-
102-
let batching_scalar = prover_state.sample();
103-
let batching_scalar_powers = batching_scalar.powers().collect_n(n_columns_down);
104-
105-
let columns_shifted = &columns_with_shift.iter().map(|&i| columns[i]).collect::<Vec<_>>();
106-
107-
let batched_column_down = multilinears_linear_combination(columns_shifted, &batching_scalar_powers);
108-
109-
let matrix_down = matrix_next_mle_folded(outer_sumcheck_challenge);
110-
let inner_mle = info_span!("packing").in_scope(|| {
111-
MleGroupOwned::ExtensionPacked(vec![pack_extension(&matrix_down), pack_extension(&batched_column_down)])
112-
});
113-
114-
let inner_sum = dot_product(evals_down.iter().copied(), batching_scalar_powers.iter().copied());
115-
116-
let (inner_challenges, _, _) = info_span!("structured columns sumcheck").in_scope(|| {
117-
sumcheck_prove::<EF, _, _>(
118-
inner_mle,
119-
&ProductComputation {},
120-
&vec![],
121-
None,
122-
prover_state,
123-
inner_sum,
124-
false,
125-
)
126-
});
127-
128-
let evals_on_down_columns = info_span!("final evals").in_scope(|| {
129-
columns_shifted
130-
.par_iter()
131-
.map(|col| col.evaluate(&inner_challenges))
132-
.collect::<Vec<_>>()
133-
});
134-
prover_state.add_extension_scalars(&evals_on_down_columns);
135-
13668
AirClaims {
13769
point: MultilinearPoint(outer_sumcheck_challenge.to_vec()),
138-
evals: evals_up,
139-
down_point: Some(inner_challenges),
140-
evals_on_down_columns,
70+
evals: inner_sums[..columns.len()].to_vec(),
71+
evals_down: inner_sums[columns.len()..].to_vec(),
14172
}
14273
}
74+
75+
pub(crate) fn column_shifted<F: Field>(column: &[F]) -> Vec<F> {
76+
let mut down = unsafe { uninitialized_vec(column.len()) };
77+
parallel_clone(&column[1..], &mut down[..column.len() - 1]);
78+
down[column.len() - 1] = column[column.len() - 1];
79+
down
80+
}

crates/air/src/uni_skip_utils.rs

Lines changed: 0 additions & 50 deletions
This file was deleted.

crates/air/src/utils.rs

Lines changed: 0 additions & 64 deletions
This file was deleted.

crates/air/src/verify.rs

Lines changed: 4 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use backend::*;
22

3-
use crate::{AirClaims, utils::next_mle};
3+
use crate::AirClaims;
44

55
#[allow(clippy::type_complexity)]
66
#[allow(clippy::too_many_arguments)]
@@ -42,55 +42,13 @@ where
4242
return Err(ProofError::InvalidProof);
4343
}
4444

45-
open_columns(verifier_state, air, log_n_rows, &inner_evals, &outer_statement.point)
46-
}
47-
48-
fn open_columns<A: Air, EF: ExtensionField<PF<EF>>>(
49-
verifier_state: &mut impl FSVerifier<EF>,
50-
air: &A,
51-
log_n_rows: usize,
52-
inner_evals: &[EF],
53-
outer_sumcheck_challenge: &[EF],
54-
) -> ProofResult<AirClaims<EF>> {
5545
let n_columns_up = air.n_columns();
5646
let n_columns_down = air.n_down_columns();
5747
assert_eq!(inner_evals.len(), n_columns_up + n_columns_down);
5848

59-
let evals_up = inner_evals[..n_columns_up].to_vec();
60-
let evals_down = inner_evals[n_columns_up..].to_vec();
61-
62-
if n_columns_down == 0 {
63-
return Ok(AirClaims {
64-
point: MultilinearPoint(outer_sumcheck_challenge.to_vec()),
65-
evals: evals_up,
66-
down_point: None,
67-
evals_on_down_columns: vec![],
68-
});
69-
}
70-
71-
let batching_scalar = verifier_state.sample();
72-
let batching_scalar_powers = batching_scalar.powers().collect_n(n_columns_down);
73-
74-
let inner_sum: EF = dot_product(evals_down.into_iter(), batching_scalar_powers.iter().copied());
75-
76-
let inner_sumcheck_stement = sumcheck_verify(verifier_state, log_n_rows, 2, inner_sum, None)?;
77-
78-
let matrix_down_sc_eval = next_mle(outer_sumcheck_challenge, &inner_sumcheck_stement.point);
79-
80-
let evals_on_down_columns = verifier_state.next_extension_scalars_vec(n_columns_down)?;
81-
let batched_col_down_sc_eval = dot_product::<EF, _, _>(
82-
batching_scalar_powers.iter().copied(),
83-
evals_on_down_columns.iter().copied(),
84-
);
85-
86-
if inner_sumcheck_stement.value != matrix_down_sc_eval * batched_col_down_sc_eval {
87-
return Err(ProofError::InvalidProof);
88-
}
89-
9049
Ok(AirClaims {
91-
point: MultilinearPoint(outer_sumcheck_challenge.to_vec()),
92-
evals: evals_up,
93-
down_point: Some(inner_sumcheck_stement.point.clone()),
94-
evals_on_down_columns,
50+
point: outer_statement.point,
51+
evals: inner_evals[..n_columns_up].to_vec(),
52+
evals_down: inner_evals[n_columns_up..].to_vec(),
9553
})
9654
}

crates/backend/poly/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ pub use utils::*;
1515
mod eq_mle;
1616
pub use eq_mle::*;
1717

18+
mod next_mle;
19+
pub use next_mle::*;
20+
1821
mod evals;
1922
pub use evals::*;
2023

0 commit comments

Comments
 (0)