1- use multilinear_toolkit:: prelude:: * ;
2- use p3_util:: { log2_ceil_usize, log2_strict_usize} ;
1+ use backend:: * ;
32use tracing:: { info_span, instrument} ;
4- use utils:: { fold_multilinear_chunks , multilinears_linear_combination} ;
3+ use utils:: multilinears_linear_combination;
54
65use crate :: { AirClaims , uni_skip_utils:: matrix_next_mle_folded, utils:: column_shifted} ;
76
@@ -17,7 +16,6 @@ pub fn prove_air<EF: ExtensionField<PF<EF>>, A: Air>(
1716 prover_state : & mut impl FSProver < EF > ,
1817 air : & A ,
1918 extra_data : A :: ExtraData ,
20- univariate_skips : usize ,
2119 columns_f : & [ impl AsRef < [ PF < EF > ] > ] ,
2220 columns_ef : & [ impl AsRef < [ EF ] > ] ,
2321 virtual_column_statement : Option < Evaluation < EF > > , // point should be randomness generated after committing to the columns
@@ -32,22 +30,16 @@ where
3230 assert ! ( columns_f. iter( ) . all( |col| col. len( ) == n_rows) ) ;
3331 assert ! ( columns_ef. iter( ) . all( |col| col. len( ) == n_rows) ) ;
3432 let log_n_rows = log2_strict_usize ( n_rows) ;
35- assert ! (
36- univariate_skips < log_n_rows,
37- "TODO handle the case UNIVARIATE_SKIPS >= log_length"
38- ) ;
3933
4034 // crate::check_air_validity(air, &extra_data, &columns_f, &columns_ef).unwrap();
4135
4236 assert ! ( extra_data. alpha_powers( ) . len( ) >= air. n_constraints( ) + virtual_column_statement. is_some( ) as usize ) ;
4337
44- let n_sc_rounds = log_n_rows + 1 - univariate_skips;
45-
4638 let zerocheck_challenges = virtual_column_statement
4739 . as_ref ( )
4840 . map ( |st| st. point . 0 . clone ( ) )
49- . unwrap_or_else ( || prover_state. sample_vec ( n_sc_rounds ) ) ;
50- assert_eq ! ( zerocheck_challenges. len( ) , n_sc_rounds ) ;
41+ . unwrap_or_else ( || prover_state. sample_vec ( log_n_rows ) ) ;
42+ assert_eq ! ( zerocheck_challenges. len( ) , log_n_rows ) ;
5143
5244 let shifted_rows_f = air
5345 . down_column_indexes_f ( )
7466
7567 let ( outer_sumcheck_challenge, inner_sums, _) = info_span ! ( "zerocheck" ) . in_scope ( || {
7668 sumcheck_prove (
77- univariate_skips,
7869 columns_up_down_group_f_packed,
7970 Some ( columns_up_down_group_ef_packed) ,
8071 air,
@@ -92,121 +83,19 @@ where
9283
9384 prover_state. add_extension_scalars ( & inner_sums) ;
9485
95- if univariate_skips == 1 {
96- open_columns_no_skip (
97- prover_state,
98- & inner_sums,
99- & air. down_column_indexes_f ( ) ,
100- & air. down_column_indexes_ef ( ) ,
101- & columns_f,
102- & columns_ef,
103- & outer_sumcheck_challenge,
104- )
105- } else if shifted_rows_f. is_empty ( ) && shifted_rows_ef. is_empty ( ) {
106- // usefull for poseidon2 benchmark
107- open_flat_columns (
108- prover_state,
109- univariate_skips,
110- & columns_f,
111- & columns_ef,
112- & outer_sumcheck_challenge,
113- )
114- } else {
115- panic ! (
116- "Currently unsupported for simplicty (checkout c7944152a4325b1e1913446e6684112099db5d78 for a version that supported this case)"
117- ) ;
118- }
119- }
120-
121- #[ instrument( skip_all) ]
122- fn open_flat_columns < EF : ExtensionField < PF < EF > > > (
123- prover_state : & mut impl FSProver < EF > ,
124- univariate_skips : usize ,
125- columns_f : & [ & [ PF < EF > ] ] ,
126- columns_ef : & [ & [ EF ] ] ,
127- outer_sumcheck_challenge : & [ EF ] ,
128- ) -> AirClaims < EF > {
129- let n_up_down_columns = columns_f. len ( ) + columns_ef. len ( ) ;
130- let batching_scalars = prover_state. sample_vec ( log2_ceil_usize ( n_up_down_columns) ) ;
131-
132- let eval_eq_batching_scalars = eval_eq ( & batching_scalars) [ ..n_up_down_columns] . to_vec ( ) ;
133-
134- let mut batched_column_up =
135- multilinears_linear_combination ( columns_f, & eval_eq_batching_scalars[ ..columns_f. len ( ) ] ) ;
136- if !columns_ef. is_empty ( ) {
137- let batched_column_up_ef = multilinears_linear_combination (
138- columns_ef,
139- & eval_eq_batching_scalars[ columns_f. len ( ) ..] [ ..columns_ef. len ( ) ] ,
140- ) ;
141- batched_column_up
142- . par_iter_mut ( )
143- . zip ( & batched_column_up_ef)
144- . for_each ( |( a, & b) | {
145- * a += b;
146- } ) ;
147- }
148-
149- let sub_evals = fold_multilinear_chunks (
150- & batched_column_up,
151- & MultilinearPoint ( outer_sumcheck_challenge[ 1 ..] . to_vec ( ) ) ,
152- ) ;
153- prover_state. add_extension_scalars ( & sub_evals) ;
154-
155- let epsilons = prover_state. sample_vec ( univariate_skips) ;
156-
157- let inner_sum = sub_evals. evaluate ( & MultilinearPoint ( epsilons. clone ( ) ) ) ;
158-
159- let point = [ epsilons, outer_sumcheck_challenge[ 1 ..] . to_vec ( ) ] . concat ( ) ;
160-
161- // TODO opti in case of flat AIR (no need of `matrix_next_mle_folded`)
162- let matrix_up = eval_eq ( & point) ;
163- let inner_mle = info_span ! ( "packing" ) . in_scope ( || {
164- MleGroupOwned :: ExtensionPacked ( vec ! [ pack_extension( & matrix_up) , pack_extension( & batched_column_up) ] )
165- } ) ;
166-
167- let ( inner_challenges, _, _) = info_span ! ( "structured columns sumcheck" ) . in_scope ( || {
168- sumcheck_prove :: < EF , _ , _ > (
169- 1 ,
170- inner_mle,
171- None ,
172- & ProductComputation { } ,
173- & vec ! [ ] ,
174- None ,
175- false ,
176- prover_state,
177- inner_sum,
178- false ,
179- )
180- } ) ;
181-
182- let ( evaluations_remaining_to_prove_f, evaluations_remaining_to_prove_ef) =
183- info_span ! ( "final evals" ) . in_scope ( || {
184- (
185- columns_f
186- . par_iter ( )
187- . map ( |col| col. evaluate ( & inner_challenges) )
188- . collect :: < Vec < _ > > ( ) ,
189- columns_ef
190- . par_iter ( )
191- . map ( |col| col. evaluate ( & inner_challenges) )
192- . collect :: < Vec < _ > > ( ) ,
193- )
194- } ) ;
195- prover_state. add_extension_scalars ( & evaluations_remaining_to_prove_f) ;
196- prover_state. add_extension_scalars ( & evaluations_remaining_to_prove_ef) ;
197-
198- AirClaims {
199- point : inner_challenges,
200- evals_f : evaluations_remaining_to_prove_f,
201- evals_ef : evaluations_remaining_to_prove_ef,
202- down_point : None ,
203- evals_f_on_down_columns : vec ! [ ] ,
204- evals_ef_on_down_columns : vec ! [ ] ,
205- }
86+ open_columns (
87+ prover_state,
88+ & inner_sums,
89+ & air. down_column_indexes_f ( ) ,
90+ & air. down_column_indexes_ef ( ) ,
91+ & columns_f,
92+ & columns_ef,
93+ & outer_sumcheck_challenge,
94+ )
20695}
20796
20897#[ instrument( skip_all) ]
209- fn open_columns_no_skip < EF : ExtensionField < PF < EF > > > (
98+ fn open_columns < EF : ExtensionField < PF < EF > > > (
21099 prover_state : & mut impl FSProver < EF > ,
211100 inner_evals : & [ EF ] ,
212101 columns_with_shift_f : & [ usize ] ,
@@ -270,7 +159,6 @@ fn open_columns_no_skip<EF: ExtensionField<PF<EF>>>(
270159
271160 let ( inner_challenges, _, _) = info_span ! ( "structured columns sumcheck" ) . in_scope ( || {
272161 sumcheck_prove :: < EF , _ , _ > (
273- 1 ,
274162 inner_mle,
275163 None ,
276164 & ProductComputation { } ,
0 commit comments