@@ -77,6 +77,8 @@ fn compute_binary_with_length(length: usize, mut value: usize) -> Vec<bool> {
77
77
bin
78
78
}
79
79
80
+ /* Old Interleaving Approach for bookkeeping
81
+
80
82
// Given the sizes of a list of polys sorted in decreasing order,
81
83
// Compute which list each entry of their interleaved form belong to
82
84
// e.g.: [4, 2, 1, 1] => [0, 1, 0, 2, 0, 1, 0, 3]
@@ -165,6 +167,61 @@ fn interleave_polys<E: ExtensionField>(
165
167
}
166
168
DenseMultilinearExtension { num_vars: interleaved_num_vars, evaluations: interleaved_evaluations }
167
169
}
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
+ }
168
225
169
226
// Pack polynomials of different sizes into the same, returns
170
227
// 0: A list of packed polys
@@ -239,8 +296,10 @@ fn pack_poly_prover<E: ExtensionField>(
239
296
}
240
297
}
241
298
// 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) ;
244
303
245
304
// Final packed poly
246
305
if next_packed_poly. num_vars == max_poly_num_vars {
@@ -1119,7 +1178,7 @@ pub mod test_util {
1119
1178
{
1120
1179
use crate :: { pcs_batch_commit_diff_size_and_write, pcs_batch_open_diff_size, pcs_batch_verify_diff_size} ;
1121
1180
1122
- for vars_gap in 1 ..=max_vars_gap {
1181
+ for vars_gap in 0 ..=max_vars_gap {
1123
1182
println ! ( "GAP: {vars_gap}" ) ;
1124
1183
assert ! ( max_num_vars > vars_gap * batch_size) ;
1125
1184
let ( pp, vp) = setup_pcs :: < E , Pcs > ( max_num_vars) ;
@@ -1182,19 +1241,19 @@ mod test {
1182
1241
use p3_field:: PrimeCharacteristicRing ;
1183
1242
use p3_goldilocks:: Goldilocks ;
1184
1243
1185
- use crate :: interleave_pattern;
1244
+ // use crate::interleave_pattern;
1186
1245
type E = GoldilocksExt2 ;
1187
1246
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
+ // }
1198
1257
1199
1258
#[ test]
1200
1259
fn test_packing ( ) {
0 commit comments