Skip to content

Commit 40887fc

Browse files
committed
gkr iop support table circuit
1 parent aeea15d commit 40887fc

File tree

2 files changed

+48
-19
lines changed

2 files changed

+48
-19
lines changed

ceno_zkvm/src/scheme/cpu/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -743,7 +743,8 @@ impl<E: ExtensionField, PCS: PolynomialCommitmentScheme<E>> MainSumcheckProver<C
743743
cs.num_structural_witin as WitnessId,
744744
cs.num_fixed as WitnessId,
745745
);
746-
let main_sumcheck_challenges = chain!(challenges.iter().copied()
746+
let main_sumcheck_challenges = chain!(
747+
challenges.iter().copied(),
747748
get_challenge_pows(
748749
cs.w_table_expressions.len() + cs.r_table_expressions.len(),
749750
transcript,

gkr_iop/src/gkr/layer.rs

Lines changed: 46 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use either::Either;
12
use ff_ext::ExtensionField;
23
use itertools::{Itertools, chain, izip};
34
use linear_layer::{LayerClaims, LinearLayer};
@@ -319,9 +320,9 @@ impl<E: ExtensionField> Layer<E> {
319320
n_challenges: usize,
320321
out_evals: OutEvalGroups,
321322
) -> Layer<E> {
322-
let w_len = cb.cs.w_expressions.len();
323-
let r_len = cb.cs.r_expressions.len();
324-
let lk_len = cb.cs.lk_expressions.len();
323+
let w_len = cb.cs.w_expressions.len() + cb.cs.w_table_expressions.len();
324+
let r_len = cb.cs.r_expressions.len() + cb.cs.r_table_expressions.len();
325+
let lk_len = cb.cs.lk_expressions.len() + cb.cs.lk_table_expressions.len() * 2; // logup lk table include p, q
325326
let zero_len =
326327
cb.cs.assert_zero_expressions.len() + cb.cs.assert_zero_sumcheck_expressions.len();
327328

@@ -331,9 +332,12 @@ impl<E: ExtensionField> Layer<E> {
331332
assert_eq!(lookup_evals.len(), lk_len);
332333
assert_eq!(zero_evals.len(), zero_len);
333334

334-
let non_zero_expr_len = cb.cs.w_expressions_namespace_map.len()
335-
+ cb.cs.r_expressions_namespace_map.len()
336-
+ cb.cs.lk_expressions.len();
335+
let non_zero_expr_len = cb.cs.w_expressions.len()
336+
+ cb.cs.w_table_expressions.len()
337+
+ cb.cs.r_expressions.len()
338+
+ cb.cs.r_table_expressions.len()
339+
+ cb.cs.lk_expressions.len()
340+
+ cb.cs.lk_table_expressions.len() * 2;
337341
let zero_expr_len =
338342
cb.cs.assert_zero_expressions.len() + cb.cs.assert_zero_sumcheck_expressions.len();
339343

@@ -344,13 +348,19 @@ impl<E: ExtensionField> Layer<E> {
344348
// process r_record
345349
let evals =
346350
Self::dedup_last_selector_evals(cb.cs.r_selector.as_ref().unwrap(), &mut expr_evals);
347-
for (idx, ((ram_expr, name), ram_eval)) in cb
351+
for (idx, ((ram_expr, name), ram_eval)) in (cb
348352
.cs
349353
.r_expressions
350354
.iter()
351-
.zip_eq(&cb.cs.r_expressions_namespace_map)
352-
.zip_eq(&r_record_evals)
353-
.enumerate()
355+
.chain(cb.cs.r_table_expressions.iter().map(|t| &t.expr)))
356+
.zip_eq(
357+
cb.cs
358+
.r_expressions_namespace_map
359+
.iter()
360+
.chain(&cb.cs.r_table_expressions_namespace_map),
361+
)
362+
.zip_eq(&r_record_evals)
363+
.enumerate()
354364
{
355365
expressions.push(ram_expr - E::BaseField::ONE.expr());
356366
evals.push(EvalExpression::<E>::Linear(
@@ -365,13 +375,19 @@ impl<E: ExtensionField> Layer<E> {
365375
// process w_record
366376
let evals =
367377
Self::dedup_last_selector_evals(cb.cs.w_selector.as_ref().unwrap(), &mut expr_evals);
368-
for (idx, ((ram_expr, name), ram_eval)) in cb
378+
for (idx, ((ram_expr, name), ram_eval)) in (cb
369379
.cs
370380
.w_expressions
371381
.iter()
372-
.zip_eq(&cb.cs.w_expressions_namespace_map)
373-
.zip_eq(&w_record_evals)
374-
.enumerate()
382+
.chain(cb.cs.w_table_expressions.iter().map(|t| &t.expr)))
383+
.zip_eq(
384+
cb.cs
385+
.w_expressions_namespace_map
386+
.iter()
387+
.chain(&cb.cs.w_table_expressions_namespace_map),
388+
)
389+
.zip_eq(&w_record_evals)
390+
.enumerate()
375391
{
376392
expressions.push(ram_expr - E::BaseField::ONE.expr());
377393
evals.push(EvalExpression::<E>::Linear(
@@ -386,13 +402,25 @@ impl<E: ExtensionField> Layer<E> {
386402
// process lookup records
387403
let evals =
388404
Self::dedup_last_selector_evals(cb.cs.lk_selector.as_ref().unwrap(), &mut expr_evals);
389-
for (idx, ((lookup, name), lookup_eval)) in cb
405+
for (idx, ((lookup, name), lookup_eval)) in (cb
390406
.cs
391407
.lk_expressions
392408
.iter()
393-
.zip_eq(&cb.cs.lk_expressions_namespace_map)
394-
.zip_eq(&lookup_evals)
395-
.enumerate()
409+
.chain(cb.cs.lk_table_expressions.iter().map(|t| &t.multiplicity))
410+
.chain(cb.cs.lk_table_expressions.iter().map(|t| &t.values)))
411+
.zip_eq(if cb.cs.lk_table_expressions.is_empty() {
412+
Either::Left(cb.cs.lk_expressions_namespace_map.iter())
413+
} else {
414+
// repeat expressions_namespace_map twice to deal with lk p, q
415+
Either::Right(
416+
cb.cs
417+
.lk_expressions_namespace_map
418+
.iter()
419+
.chain(&cb.cs.lk_expressions_namespace_map),
420+
)
421+
})
422+
.zip_eq(&lookup_evals)
423+
.enumerate()
396424
{
397425
expressions.push(lookup - cb.cs.chip_record_alpha.clone());
398426
evals.push(EvalExpression::<E>::Linear(

0 commit comments

Comments
 (0)