1+ use either:: Either ;
12use ff_ext:: ExtensionField ;
23use itertools:: { Itertools , chain, izip} ;
34use 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