@@ -77,6 +77,8 @@ fn compute_binary_with_length(length: usize, mut value: usize) -> Vec<bool> {
7777    bin
7878} 
7979
80+ /* Old Interleaving Approach for bookkeeping 
81+ 
8082// Given the sizes of a list of polys sorted in decreasing order, 
8183// Compute which list each entry of their interleaved form belong to 
8284// e.g.: [4, 2, 1, 1] => [0, 1, 0, 2, 0, 1, 0, 3] 
@@ -165,6 +167,61 @@ fn interleave_polys<E: ExtensionField>(
165167    } 
166168    DenseMultilinearExtension { num_vars: interleaved_num_vars, evaluations: interleaved_evaluations } 
167169} 
170+ */ 
171+ 
172+ // Interleave the polys give their position on the binary tree 
173+ // Assume the polys are sorted by decreasing size 
174+ // Denote: N - size of the interleaved poly; M - num of polys 
175+ // This function performs interleave in O(M) + O(N) time and is *potentially* parallelizable (maybe? idk) 
176+ fn  interleave_polys < E :  ExtensionField > ( 
177+     polys :  Vec < & DenseMultilinearExtension < E > > , 
178+     comps :  & Vec < Vec < bool > > , 
179+ )  -> DenseMultilinearExtension < E >  { 
180+     assert ! ( polys. len( )  > 0 ) ; 
181+     let  sizes:  Vec < usize >  = polys. iter ( ) . map ( |p| p. evaluations . len ( ) ) . collect ( ) ; 
182+     let  interleaved_size = sizes. iter ( ) . sum :: < usize > ( ) . next_power_of_two ( ) ; 
183+     let  interleaved_num_vars = interleaved_size. ilog2 ( )  as  usize ; 
184+     // Initialize the interleaved poly 
185+     // Is there a better way to deal with field types? 
186+     let  mut  interleaved_evaluations = match  polys[ 0 ] . evaluations  { 
187+         FieldType :: Base ( _)  => FieldType :: Base ( vec ! [ E :: BaseField :: ZERO ;  interleaved_size] ) , 
188+         FieldType :: Ext ( _)  => FieldType :: Ext ( vec ! [ E :: ZERO ;  interleaved_size] ) , 
189+         _ => unreachable ! ( ) 
190+     } ; 
191+     // For every poly, determine its: 
192+     // * Start: where's its first entry in the interleaved poly? 
193+     // * Gap: how many entires are between its consecutive entries in the interleaved poly? 
194+     // Then fill in the corresponding entries in the interleaved poly 
195+     for  ( poly,  comp)  in  polys. iter ( ) . zip ( comps)  { 
196+         // Start is the decimal representation of the inverse of comp 
197+         let  mut  start = 0 ; 
198+         let  mut  pow_2 = 1 ; 
199+         for  b in  comp { 
200+             start += if  * b {  pow_2 }  else  {  0  } ; 
201+             pow_2 *= 2 ; 
202+         } 
203+         // Gap is 2 ** (interleaved_num_vars - poly_num_vars) 
204+         let  gap = 1  << ( interleaved_num_vars - poly. num_vars ) ; 
205+         // Fill in the blank 
206+         match  ( & mut  interleaved_evaluations,  & poly. evaluations )  { 
207+             ( FieldType :: Base ( ie) ,  FieldType :: Base ( pe) )  => { 
208+                 for  ( i,  e)  in  pe. iter ( ) . enumerate ( )  { 
209+                     ie[ start + gap *  i]  = * e; 
210+                 } 
211+             } 
212+             ( FieldType :: Ext ( ie) ,  FieldType :: Ext ( pe) )  => {  
213+                 for  ( i,  e)  in  pe. iter ( ) . enumerate ( )  { 
214+                     ie[ start + gap *  i]  = * e; 
215+                 } 
216+             } 
217+             ( a,  b)  => panic ! ( 
218+                 "do not support merge different field type DME a: {:?} b: {:?}" , 
219+                 a,  b
220+             ) , 
221+         } 
222+     } 
223+     DenseMultilinearExtension  {  num_vars :  interleaved_num_vars,  evaluations :  interleaved_evaluations } 
224+ } 
168225
169226// Pack polynomials of different sizes into the same, returns 
170227// 0: A list of packed polys 
@@ -239,8 +296,10 @@ fn pack_poly_prover<E: ExtensionField>(
239296        } 
240297    } 
241298    // Interleave every poly 
242-     let  mut  packed_polys:  Vec < _ >  = packed_polys. into_iter ( ) . map ( |ps| interleave_polys ( ps) ) . collect ( ) ; 
243-     let  next_packed_poly = interleave_polys ( next_packed_poly) ; 
299+     let  mut  packed_polys:  Vec < _ >  = packed_polys. into_iter ( ) . zip ( & packed_comps) . map ( |( ps,  pc) | 
300+         interleave_polys ( ps,  pc) 
301+     ) . collect ( ) ; 
302+     let  next_packed_poly = interleave_polys ( next_packed_poly,  & next_packed_comp) ; 
244303
245304    // Final packed poly 
246305    if  next_packed_poly. num_vars  == max_poly_num_vars { 
@@ -1119,7 +1178,7 @@ pub mod test_util {
11191178    { 
11201179        use  crate :: { pcs_batch_commit_diff_size_and_write,  pcs_batch_open_diff_size,  pcs_batch_verify_diff_size} ; 
11211180
1122-         for  vars_gap in  1 ..=max_vars_gap { 
1181+         for  vars_gap in  0 ..=max_vars_gap { 
11231182            println ! ( "GAP: {vars_gap}" ) ; 
11241183            assert ! ( max_num_vars > vars_gap *  batch_size) ; 
11251184            let  ( pp,  vp)  = setup_pcs :: < E ,  Pcs > ( max_num_vars) ; 
@@ -1182,19 +1241,19 @@ mod test {
11821241    use  p3_field:: PrimeCharacteristicRing ; 
11831242    use  p3_goldilocks:: Goldilocks ; 
11841243
1185-     use  crate :: interleave_pattern; 
1244+     //  use crate::interleave_pattern;
11861245    type  E  = GoldilocksExt2 ; 
11871246
1188-     #[ test]  
1189-     fn  test_interleave ( )  { 
1190-         let  poly_num_vars = [ vec ! [ 27 ,  26 ,  25 ,  25 ] ,  vec ! [ 4 ,  4 ,  4 ,  4 ,  4 ] ,  vec ! [ 8 ] ,  vec ! [ 23 ,  23 ,  19 ,  13 ] ] ; 
1191-         for  num_vars in  poly_num_vars { 
1192-             println ! ( "NUM_VARS: {:?}" ,  num_vars) ; 
1193-             let  sizes = num_vars. iter ( ) . map ( |n| 2_i32 . pow ( * n)  as  usize ) . collect ( ) ; 
1194-             let  interleaved_indices = interleave_pattern ( sizes) ; 
1195-             println ! ( "INDICES: {:?}" ,  interleaved_indices) ; 
1196-         } 
1197-     } 
1247+     //  #[test]
1248+     //  fn test_interleave() {
1249+     //      let poly_num_vars = [vec![27, 26, 25, 25], vec![4, 4, 4, 4, 4], vec![8], vec![23, 23, 19, 13]];
1250+     //      for num_vars in poly_num_vars {
1251+     //          println!("NUM_VARS: {:?}", num_vars);
1252+     //          let sizes = num_vars.iter().map(|n| 2_i32.pow(*n) as usize).collect();
1253+     //          let interleaved_indices = interleave_pattern(sizes);
1254+     //          println!("INDICES: {:?}", interleaved_indices);
1255+     //      }
1256+     //  }
11981257
11991258    #[ test]  
12001259    fn  test_packing ( )  { 
0 commit comments