44use itertools:: Itertools ;
55use vortex_array:: ArrayRef ;
66use vortex_array:: ArrayView ;
7+ use vortex_array:: ExecutionCtx ;
78use vortex_array:: IntoArray ;
8- use vortex_array:: LEGACY_SESSION ;
9- use vortex_array:: VortexSessionExecute ;
109use vortex_array:: arrays:: Primitive ;
1110use vortex_array:: arrays:: PrimitiveArray ;
1211use vortex_array:: dtype:: PType ;
@@ -46,10 +45,11 @@ macro_rules! match_each_alp_float_ptype {
4645pub fn alp_encode (
4746 parray : ArrayView < ' _ , Primitive > ,
4847 exponents : Option < Exponents > ,
48+ ctx : & mut ExecutionCtx ,
4949) -> VortexResult < ALPArray > {
5050 let ( exponents, encoded, patches) = match parray. ptype ( ) {
51- PType :: F32 => alp_encode_components_typed :: < f32 > ( parray, exponents) ?,
52- PType :: F64 => alp_encode_components_typed :: < f64 > ( parray, exponents) ?,
51+ PType :: F32 => alp_encode_components_typed :: < f32 > ( parray, exponents, ctx ) ?,
52+ PType :: F64 => alp_encode_components_typed :: < f64 > ( parray, exponents, ctx ) ?,
5353 _ => vortex_bail ! ( "ALP can only encode f32 and f64" ) ,
5454 } ;
5555
@@ -64,6 +64,7 @@ pub fn alp_encode(
6464fn alp_encode_components_typed < T > (
6565 values : ArrayView < ' _ , Primitive > ,
6666 exponents : Option < Exponents > ,
67+ ctx : & mut ExecutionCtx ,
6768) -> VortexResult < ( Exponents , ArrayRef , Option < Patches > ) >
6869where
6970 T : ALPFloat ,
@@ -75,10 +76,10 @@ where
7576
7677 let encoded_array = PrimitiveArray :: new ( encoded, values. validity ( ) ?) . into_array ( ) ;
7778
78- let validity = values. array ( ) . validity ( ) ? . to_mask (
79- values . array ( ) . len ( ) ,
80- & mut LEGACY_SESSION . create_execution_ctx ( ) ,
81- ) ?;
79+ let validity = values
80+ . array ( )
81+ . validity ( ) ?
82+ . to_mask ( values . array ( ) . len ( ) , ctx ) ?;
8283 // exceptional_positions may contain exceptions at invalid positions (which contain garbage
8384 // data). We remove null exceptions in order to keep the Patches small.
8485 let ( valid_exceptional_positions, valid_exceptional_values) : ( Buffer < u64 > , Buffer < T > ) =
@@ -151,7 +152,7 @@ mod tests {
151152 #[ test]
152153 fn test_compress ( ) {
153154 let array = PrimitiveArray :: new ( buffer ! [ 1.234f32 ; 1025 ] , Validity :: NonNullable ) ;
154- let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
155+ let encoded = alp_encode ( array. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
155156 assert ! ( encoded. patches( ) . is_none( ) ) ;
156157 let expected_encoded = PrimitiveArray :: from_iter ( vec ! [ 1234i32 ; 1025 ] ) ;
157158 assert_arrays_eq ! ( encoded. encoded( ) , expected_encoded) ;
@@ -165,7 +166,7 @@ mod tests {
165166 #[ test]
166167 fn test_nullable_compress ( ) {
167168 let array = PrimitiveArray :: from_option_iter ( [ None , Some ( 1.234f32 ) , None ] ) ;
168- let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
169+ let encoded = alp_encode ( array. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
169170 assert ! ( encoded. patches( ) . is_none( ) ) ;
170171 let expected_encoded = PrimitiveArray :: from_option_iter ( [ None , Some ( 1234i32 ) , None ] ) ;
171172 assert_arrays_eq ! ( encoded. encoded( ) , expected_encoded) ;
@@ -182,7 +183,7 @@ mod tests {
182183 fn test_patched_compress ( ) {
183184 let values = buffer ! [ 1.234f64 , 2.718 , PI , 4.0 ] ;
184185 let array = PrimitiveArray :: new ( values. clone ( ) , Validity :: NonNullable ) ;
185- let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
186+ let encoded = alp_encode ( array. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
186187 assert ! ( encoded. patches( ) . is_some( ) ) ;
187188 let expected_encoded = PrimitiveArray :: from_iter ( vec ! [ 1234i64 , 2718 , 1234 , 4000 ] ) ;
188189 assert_arrays_eq ! ( encoded. encoded( ) , expected_encoded) ;
@@ -199,7 +200,7 @@ mod tests {
199200 fn test_compress_ignores_invalid_exceptional_values ( ) {
200201 let values = buffer ! [ 1.234f64 , 2.718 , PI , 4.0 ] ;
201202 let array = PrimitiveArray :: new ( values, Validity :: from_iter ( [ true , true , false , true ] ) ) ;
202- let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
203+ let encoded = alp_encode ( array. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
203204 assert ! ( encoded. patches( ) . is_none( ) ) ;
204205 let expected_encoded =
205206 PrimitiveArray :: from_option_iter ( buffer ! [ Some ( 1234i64 ) , Some ( 2718 ) , None , Some ( 4000 ) ] ) ;
@@ -221,7 +222,7 @@ mod tests {
221222 Some ( 4.0 ) ,
222223 None ,
223224 ] ) ;
224- let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
225+ let encoded = alp_encode ( array. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
225226 assert ! ( encoded. patches( ) . is_some( ) ) ;
226227
227228 assert_eq ! ( encoded. exponents( ) , Exponents { e: 16 , f: 13 } ) ;
@@ -235,15 +236,15 @@ mod tests {
235236 #[ test]
236237 fn roundtrips_close_fractional ( ) {
237238 let original = PrimitiveArray :: from_iter ( [ 195.26274f32 , 195.27837 , -48.815685 ] ) ;
238- let alp_arr = alp_encode ( original. as_view ( ) , None ) . unwrap ( ) ;
239+ let alp_arr = alp_encode ( original. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
239240 assert_arrays_eq ! ( alp_arr, original) ;
240241 }
241242
242243 #[ test]
243244 fn roundtrips_all_null ( ) {
244245 let original =
245246 PrimitiveArray :: new ( buffer ! [ 195.26274f64 , PI , -48.815685 ] , Validity :: AllInvalid ) ;
246- let alp_arr = alp_encode ( original. as_view ( ) , None ) . unwrap ( ) ;
247+ let alp_arr = alp_encode ( original. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
247248 let decompressed = alp_arr. into_array ( ) . to_primitive ( ) ;
248249
249250 assert_eq ! (
@@ -261,7 +262,7 @@ mod tests {
261262 buffer ! [ 0.0f32 , -0.0 , f32 :: NAN , f32 :: NEG_INFINITY , f32 :: INFINITY ] ,
262263 Validity :: NonNullable ,
263264 ) ;
264- let encoded = alp_encode ( original. as_view ( ) , None ) . unwrap ( ) ;
265+ let encoded = alp_encode ( original. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
265266 let decoded = encoded. as_array ( ) . to_primitive ( ) ;
266267 for idx in 0 ..original. len ( ) {
267268 let decoded_val = decoded. as_slice :: < f32 > ( ) [ idx] ;
@@ -282,7 +283,7 @@ mod tests {
282283 values[ 1025 ] = PI ;
283284
284285 let array = PrimitiveArray :: new ( Buffer :: from ( values) , Validity :: NonNullable ) ;
285- let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
286+ let encoded = alp_encode ( array. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
286287 let patches = encoded. patches ( ) . unwrap ( ) ;
287288
288289 let chunk_offsets = patches. chunk_offsets ( ) . clone ( ) . unwrap ( ) . to_primitive ( ) ;
@@ -305,7 +306,7 @@ mod tests {
305306 values[ 2048 ] = E ;
306307
307308 let array = PrimitiveArray :: new ( Buffer :: from ( values) , Validity :: NonNullable ) ;
308- let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
309+ let encoded = alp_encode ( array. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
309310 let patches = encoded. patches ( ) . unwrap ( ) ;
310311
311312 let chunk_offsets = patches. chunk_offsets ( ) . clone ( ) . unwrap ( ) . to_primitive ( ) ;
@@ -327,7 +328,7 @@ mod tests {
327328 values[ 0 ] = PI ;
328329
329330 let array = PrimitiveArray :: new ( Buffer :: from ( values) , Validity :: NonNullable ) ;
330- let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
331+ let encoded = alp_encode ( array. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
331332 let patches = encoded. patches ( ) . unwrap ( ) ;
332333
333334 let chunk_offsets = patches. chunk_offsets ( ) . clone ( ) . unwrap ( ) . to_primitive ( ) ;
@@ -350,7 +351,7 @@ mod tests {
350351 values[ 100 ] = E ;
351352
352353 let array = PrimitiveArray :: new ( Buffer :: from ( values) , Validity :: NonNullable ) ;
353- let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
354+ let encoded = alp_encode ( array. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
354355 let patches = encoded. patches ( ) . unwrap ( ) ;
355356
356357 let chunk_offsets = patches. chunk_offsets ( ) . clone ( ) . unwrap ( ) . to_primitive ( ) ;
@@ -371,7 +372,7 @@ mod tests {
371372 // Create 1024 elements, encode, slice to first 512, then decode
372373 let values = vec ! [ 1.234f32 ; 1024 ] ;
373374 let original = PrimitiveArray :: new ( Buffer :: from ( values) , Validity :: NonNullable ) ;
374- let encoded = alp_encode ( original. as_view ( ) , None ) . unwrap ( ) ;
375+ let encoded = alp_encode ( original. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
375376
376377 let sliced_alp = encoded. slice ( 512 ..1024 ) . unwrap ( ) ;
377378
@@ -383,7 +384,7 @@ mod tests {
383384 fn test_slice_half_chunk_f64_roundtrip ( ) {
384385 let values = vec ! [ 5.678f64 ; 1024 ] ;
385386 let original = PrimitiveArray :: new ( Buffer :: from ( values) , Validity :: NonNullable ) ;
386- let encoded = alp_encode ( original. as_view ( ) , None ) . unwrap ( ) ;
387+ let encoded = alp_encode ( original. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
387388
388389 let sliced_alp = encoded. slice ( 512 ..1024 ) . unwrap ( ) ;
389390
@@ -399,7 +400,7 @@ mod tests {
399400 values[ 600 ] = 42.42 ;
400401
401402 let original = PrimitiveArray :: new ( Buffer :: from ( values) , Validity :: NonNullable ) ;
402- let encoded = alp_encode ( original. as_view ( ) , None ) . unwrap ( ) ;
403+ let encoded = alp_encode ( original. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
403404
404405 let sliced_alp = encoded. slice ( 512 ..1024 ) . unwrap ( ) ;
405406
@@ -419,7 +420,7 @@ mod tests {
419420 values[ 1023 ] = 42.42 ;
420421
421422 let original = PrimitiveArray :: new ( Buffer :: from ( values) , Validity :: NonNullable ) ;
422- let encoded = alp_encode ( original. as_view ( ) , None ) . unwrap ( ) ;
423+ let encoded = alp_encode ( original. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
423424
424425 let sliced_alp = encoded. slice ( 1023 ..1025 ) . unwrap ( ) ;
425426
@@ -435,7 +436,7 @@ mod tests {
435436 . collect :: < Vec < _ > > ( ) ;
436437
437438 let original = PrimitiveArray :: from_option_iter ( values) ;
438- let encoded = alp_encode ( original. as_view ( ) , None ) . unwrap ( ) ;
439+ let encoded = alp_encode ( original. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
439440
440441 let sliced_alp = encoded. slice ( 512 ..1024 ) . unwrap ( ) ;
441442 let decoded = sliced_alp. to_primitive ( ) ;
@@ -448,7 +449,7 @@ mod tests {
448449 fn test_large_f32_array_uniform_values ( ) {
449450 let size = 10_000 ;
450451 let array = PrimitiveArray :: new ( buffer ! [ 42.125f32 ; size] , Validity :: NonNullable ) ;
451- let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
452+ let encoded = alp_encode ( array. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
452453
453454 assert ! ( encoded. patches( ) . is_none( ) ) ;
454455 let decoded =
@@ -460,7 +461,7 @@ mod tests {
460461 fn test_large_f64_array_uniform_values ( ) {
461462 let size = 50_000 ;
462463 let array = PrimitiveArray :: new ( buffer ! [ 123.456789f64 ; size] , Validity :: NonNullable ) ;
463- let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
464+ let encoded = alp_encode ( array. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
464465
465466 assert ! ( encoded. patches( ) . is_none( ) ) ;
466467 let decoded =
@@ -478,7 +479,7 @@ mod tests {
478479 values[ 4500 ] = f32:: INFINITY ;
479480
480481 let array = PrimitiveArray :: new ( Buffer :: from ( values) , Validity :: NonNullable ) ;
481- let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
482+ let encoded = alp_encode ( array. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
482483
483484 assert ! ( encoded. patches( ) . is_some( ) ) ;
484485 let decoded =
@@ -500,7 +501,7 @@ mod tests {
500501 values[ 7000 ] = 999.999999999 ;
501502
502503 let array = PrimitiveArray :: new ( Buffer :: from ( values. clone ( ) ) , Validity :: NonNullable ) ;
503- let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
504+ let encoded = alp_encode ( array. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
504505
505506 assert ! ( encoded. patches( ) . is_some( ) ) ;
506507 let decoded =
@@ -530,7 +531,7 @@ mod tests {
530531 . collect ( ) ;
531532
532533 let array = PrimitiveArray :: from_option_iter ( values) ;
533- let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
534+ let encoded = alp_encode ( array. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
534535 let decoded =
535536 decompress_into_array ( encoded, & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
536537
@@ -551,7 +552,7 @@ mod tests {
551552 let validity = Validity :: from_iter ( ( 0 ..size) . map ( |i| !matches ! ( i, 500 | 2500 ) ) ) ;
552553
553554 let array = PrimitiveArray :: new ( Buffer :: from ( values) , validity) ;
554- let encoded = alp_encode ( array. as_view ( ) , None ) . unwrap ( ) ;
555+ let encoded = alp_encode ( array. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
555556 let decoded =
556557 decompress_into_array ( encoded, & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
557558
@@ -582,7 +583,7 @@ mod tests {
582583 values[ 2900 ] = PI ;
583584
584585 let original = PrimitiveArray :: new ( Buffer :: from ( values) , Validity :: NonNullable ) ;
585- let encoded = alp_encode ( original. as_view ( ) , None ) . unwrap ( ) ;
586+ let encoded = alp_encode ( original. as_view ( ) , None , & mut LEGACY_SESSION . create_execution_ctx ( ) ) . unwrap ( ) ;
586587 assert ! ( encoded. patches( ) . is_some( ) ) ;
587588
588589 // Slice ending mid-chunk-2 (element 2500 is inside chunk 2 = 2048..3072).
0 commit comments