Skip to content

Commit 205c5d1

Browse files
committed
air AIR return (point, values) instead of a vec of evaluations sharing the same point
1 parent 53b1659 commit 205c5d1

File tree

6 files changed

+209
-239
lines changed

6 files changed

+209
-239
lines changed

crates/air/src/prove.rs

Lines changed: 17 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ use utils::PF;
99
use utils::{FSProver, add_multilinears, multilinears_linear_combination};
1010
use whir_p3::fiat_shamir::FSChallenger;
1111
use whir_p3::poly::evals::{eval_eq, fold_multilinear, scale_poly};
12-
use whir_p3::poly::multilinear::Evaluation;
1312
use whir_p3::poly::{evals::EvaluationsList, multilinear::MultilinearPoint};
1413

1514
use crate::{NormalAir, PackedAir};
@@ -38,7 +37,7 @@ fn prove_air<
3837
univariate_skips: usize,
3938
table: &AirTable<EF, A, AP>,
4039
witness: &[&'a [WF]],
41-
) -> Vec<Evaluation<EF>> {
40+
) -> (MultilinearPoint<EF>, Vec<EF>) {
4241
let n_rows = witness[0].len();
4342
assert!(witness.iter().all(|col| col.len() == n_rows));
4443
let log_n_rows = log2_strict_usize(n_rows);
@@ -119,7 +118,7 @@ impl<EF: ExtensionField<PF<EF>>, A: NormalAir<EF>, AP: PackedAir<EF>> AirTable<E
119118
prover_state: &mut FSProver<EF, impl FSChallenger<EF>>,
120119
univariate_skips: usize,
121120
witness: &[&[PF<EF>]],
122-
) -> Vec<Evaluation<EF>> {
121+
) -> (MultilinearPoint<EF>, Vec<EF>) {
123122
prove_air::<PF<EF>, EF, A, AP>(prover_state, univariate_skips, self, witness)
124123
}
125124

@@ -129,7 +128,7 @@ impl<EF: ExtensionField<PF<EF>>, A: NormalAir<EF>, AP: PackedAir<EF>> AirTable<E
129128
prover_state: &mut FSProver<EF, impl FSChallenger<EF>>,
130129
univariate_skips: usize,
131130
witness: &[&[EF]],
132-
) -> Vec<Evaluation<EF>> {
131+
) -> (MultilinearPoint<EF>, Vec<EF>) {
133132
prove_air::<EF, EF, A, AP>(prover_state, univariate_skips, self, witness)
134133
}
135134
}
@@ -143,7 +142,7 @@ fn open_unstructured_columns<
143142
univariate_skips: usize,
144143
witness: &[&[WF]],
145144
outer_sumcheck_challenge: &[EF],
146-
) -> Vec<Evaluation<EF>> {
145+
) -> (MultilinearPoint<EF>, Vec<EF>) {
147146
let log_n_rows = log2_strict_usize(witness[0].len());
148147

149148
let columns_batching_scalars = prover_state.sample_vec(log2_ceil_usize(witness.len()));
@@ -170,20 +169,13 @@ fn open_unstructured_columns<
170169
.concat(),
171170
);
172171

173-
let mut evaluations_remaining_to_prove = vec![];
174-
assert_eq!(sub_evals.len(), 1 << epsilons.len());
175-
176-
for col in witness {
177-
// TODO compute oe time eq(.) then inner product with everything
178-
let value = col.evaluate(&common_point);
179-
prover_state.add_extension_scalars(&[value]);
180-
evaluations_remaining_to_prove.push(Evaluation {
181-
point: common_point.clone(),
182-
value,
183-
});
184-
}
172+
let evaluations_remaining_to_prove = witness
173+
.iter()
174+
.map(|col| col.evaluate(&common_point))
175+
.collect::<Vec<_>>();
176+
prover_state.add_extension_scalars(&evaluations_remaining_to_prove);
185177

186-
evaluations_remaining_to_prove
178+
(common_point, evaluations_remaining_to_prove)
187179
}
188180

189181
#[instrument(skip_all)]
@@ -192,7 +184,7 @@ fn open_structured_columns<EF: ExtensionField<PF<EF>> + ExtensionField<IF>, IF:
192184
univariate_skips: usize,
193185
witness: &[&[IF]],
194186
outer_sumcheck_challenge: &[EF],
195-
) -> Vec<Evaluation<EF>> {
187+
) -> (MultilinearPoint<EF>, Vec<EF>) {
196188
let n_columns = witness.len();
197189
let n_rows = witness[0].len();
198190
let log_n_rows = log2_strict_usize(n_rows);
@@ -246,17 +238,11 @@ fn open_structured_columns<EF: ExtensionField<PF<EF>> + ExtensionField<IF>, IF:
246238
None,
247239
);
248240

249-
// TODO using inner_evals[1], we can avoid 1 of the evaluations below (the last one)
250-
251-
let mut evaluations_remaining_to_prove = vec![];
252-
for col in witness {
253-
let value = col.evaluate(&inner_challenges);
254-
prover_state.add_extension_scalar(value);
255-
evaluations_remaining_to_prove.push(Evaluation {
256-
point: inner_challenges.clone(),
257-
value,
258-
});
259-
}
241+
let evaluations_remaining_to_prove = witness
242+
.iter()
243+
.map(|col| col.evaluate(&inner_challenges))
244+
.collect::<Vec<_>>();
245+
prover_state.add_extension_scalars(&evaluations_remaining_to_prove);
260246

261-
evaluations_remaining_to_prove
247+
(inner_challenges, evaluations_remaining_to_prove)
262248
}

crates/air/src/test.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -181,20 +181,21 @@ fn test_structured_air() {
181181
ExampleStructuredAir::<N_COLUMNS, N_PREPROCESSED_COLUMNS>,
182182
);
183183
table.check_trace_validity(&columns_ref).unwrap();
184-
let evaluations_remaining_to_prove =
184+
let (point_prover, evaluations_remaining_to_prove) =
185185
table.prove_base(&mut prover_state, UNIVARIATE_SKIPS, &columns_ref);
186186
let mut verifier_state = build_verifier_state(&prover_state);
187-
let evaluations_remaining_to_verify = table
187+
let (point_verifier, evaluations_remaining_to_verify) = table
188188
.verify(&mut verifier_state, UNIVARIATE_SKIPS, log_n_rows)
189189
.unwrap();
190+
assert_eq!(point_prover, point_verifier);
190191
assert_eq!(
191192
&evaluations_remaining_to_prove,
192193
&evaluations_remaining_to_verify
193194
);
194195
for i in 0..N_COLUMNS {
195196
assert_eq!(
196-
columns[i].evaluate(&evaluations_remaining_to_verify[i].point),
197-
evaluations_remaining_to_verify[i].value
197+
columns[i].evaluate(&point_prover),
198+
evaluations_remaining_to_verify[i]
198199
);
199200
}
200201
}
@@ -214,20 +215,21 @@ fn test_unstructured_air() {
214215
ExampleUnstructuredAir::<N_COLUMNS, N_PREPROCESSED_COLUMNS>,
215216
);
216217
table.check_trace_validity(&columns_ref).unwrap();
217-
let evaluations_remaining_to_prove =
218+
let (point_prover, evaluations_remaining_to_prove) =
218219
table.prove_base(&mut prover_state, UNIVARIATE_SKIPS, &columns_ref);
219220
let mut verifier_state = build_verifier_state(&prover_state);
220-
let evaluations_remaining_to_verify = table
221+
let (point_verifier, evaluations_remaining_to_verify) = table
221222
.verify(&mut verifier_state, UNIVARIATE_SKIPS, log_n_rows)
222223
.unwrap();
224+
assert_eq!(point_prover, point_verifier);
223225
assert_eq!(
224226
&evaluations_remaining_to_prove,
225227
&evaluations_remaining_to_verify
226228
);
227229
for i in 0..N_COLUMNS {
228230
assert_eq!(
229-
columns[i].evaluate(&evaluations_remaining_to_verify[i].point),
230-
evaluations_remaining_to_verify[i].value
231+
columns[i].evaluate(&point_prover),
232+
evaluations_remaining_to_verify[i]
231233
);
232234
}
233235
}

crates/air/src/verify.rs

Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ fn verify_air<EF: ExtensionField<PF<EF>>, A: NormalAir<EF>, AP: PackedAir<EF>>(
2222
table: &AirTable<EF, A, AP>,
2323
univariate_skips: usize,
2424
log_n_rows: usize,
25-
) -> Result<Vec<Evaluation<EF>>, ProofError> {
25+
) -> Result<(MultilinearPoint<EF>, Vec<EF>), ProofError> {
2626
let constraints_batching_scalar = verifier_state.sample();
2727

2828
let n_zerocheck_challenges = log_n_rows + 1 - univariate_skips;
@@ -109,7 +109,7 @@ impl<EF: ExtensionField<PF<EF>>, A: NormalAir<EF>, AP: PackedAir<EF>> AirTable<E
109109
verifier_state: &mut FSVerifier<EF, impl FSChallenger<EF>>,
110110
univariate_skips: usize,
111111
log_n_rows: usize,
112-
) -> Result<Vec<Evaluation<EF>>, ProofError> {
112+
) -> Result<(MultilinearPoint<EF>, Vec<EF>), ProofError> {
113113
verify_air::<EF, A, AP>(verifier_state, self, univariate_skips, log_n_rows)
114114
}
115115
}
@@ -121,7 +121,7 @@ fn verify_unstructured_columns<EF: ExtensionField<PF<EF>>>(
121121
outer_sumcheck_point: &MultilinearPoint<EF>,
122122
outer_selector_evals: &[EF],
123123
log_n_rows: usize,
124-
) -> Result<Vec<Evaluation<EF>>, ProofError> {
124+
) -> Result<(MultilinearPoint<EF>, Vec<EF>), ProofError> {
125125
let n_columns = inner_sums.len();
126126
let columns_batching_scalars = verifier_state.sample_vec(log2_ceil_usize(n_columns));
127127

@@ -146,25 +146,18 @@ fn verify_unstructured_columns<EF: ExtensionField<PF<EF>>>(
146146
.concat(),
147147
);
148148

149-
let mut evaluations_remaining_to_verify = vec![];
150-
for _ in 0..n_columns {
151-
let value = verifier_state.next_extension_scalar()?;
152-
evaluations_remaining_to_verify.push(Evaluation {
153-
point: common_point.clone(),
154-
value,
155-
});
156-
}
149+
let evaluations_remaining_to_verify = verifier_state.next_extension_scalars_vec(n_columns)?;
157150

158151
if sub_evals.evaluate(&epsilons)
159152
!= dot_product(
160153
eval_eq(&columns_batching_scalars).into_iter(),
161-
evaluations_remaining_to_verify.iter().map(|e| e.value),
154+
evaluations_remaining_to_verify.iter().copied(),
162155
)
163156
{
164157
return Err(ProofError::InvalidProof);
165158
}
166159

167-
Ok(evaluations_remaining_to_verify)
160+
Ok((common_point, evaluations_remaining_to_verify))
168161
}
169162

170163
#[allow(clippy::too_many_arguments)] // TODO
@@ -176,7 +169,7 @@ fn verify_structured_columns<EF: ExtensionField<PF<EF>>>(
176169
outer_sumcheck_challenge: &Evaluation<EF>,
177170
outer_selector_evals: &[EF],
178171
log_n_rows: usize,
179-
) -> Result<Vec<Evaluation<EF>>, ProofError> {
172+
) -> Result<(MultilinearPoint<EF>, Vec<EF>), ProofError> {
180173
let columns_batching_scalars = verifier_state.sample_vec(log2_ceil_usize(n_columns));
181174
let alpha = verifier_state.sample();
182175

@@ -220,22 +213,18 @@ fn verify_structured_columns<EF: ExtensionField<PF<EF>>>(
220213

221214
let final_value = inner_sumcheck_stement.value / (up + alpha * down);
222215

223-
let mut evaluations_remaining_to_verify = vec![];
224-
for _ in 0..n_columns {
225-
let value = verifier_state.next_extension_scalar()?;
226-
evaluations_remaining_to_verify.push(Evaluation {
227-
point: inner_sumcheck_stement.point.clone(),
228-
value,
229-
});
230-
}
216+
let evaluations_remaining_to_verify = verifier_state.next_extension_scalars_vec(n_columns)?;
231217

232218
if final_value
233219
!= dot_product(
234220
eval_eq(&columns_batching_scalars).into_iter(),
235-
evaluations_remaining_to_verify.iter().map(|e| e.value),
221+
evaluations_remaining_to_verify.iter().copied(),
236222
)
237223
{
238224
return Err(ProofError::InvalidProof);
239225
}
240-
Ok(evaluations_remaining_to_verify)
226+
Ok((
227+
inner_sumcheck_stement.point.clone(),
228+
evaluations_remaining_to_verify,
229+
))
241230
}

0 commit comments

Comments
 (0)