@@ -46,7 +46,7 @@ pub struct TurboQuantConfig {
4646impl Default for TurboQuantConfig {
4747 fn default ( ) -> Self {
4848 Self {
49- bit_width : 8 ,
49+ bit_width : TurboQuant :: MAX_BIT_WIDTH ,
5050 seed : Some ( 42 ) ,
5151 }
5252 }
@@ -55,10 +55,12 @@ impl Default for TurboQuantConfig {
5555/// Extract elements from a FixedSizeListArray as a flat f32 PrimitiveArray for quantization.
5656///
5757/// All quantization (rotation, centroid lookup) happens in f32. f16 is upcast; f64 is truncated.
58- #[ allow( clippy:: cast_possible_truncation) ]
59- fn extract_f32_elements ( fsl : & FixedSizeListArray ) -> VortexResult < PrimitiveArray > {
58+ fn extract_f32_elements (
59+ fsl : & FixedSizeListArray ,
60+ ctx : & mut ExecutionCtx ,
61+ ) -> VortexResult < PrimitiveArray > {
6062 let elements = fsl. elements ( ) ;
61- let primitive = elements. to_canonical ( ) ? . into_primitive ( ) ;
63+ let primitive = elements. clone ( ) . execute :: < PrimitiveArray > ( ctx ) ? ;
6264 let ptype = primitive. ptype ( ) ;
6365
6466 match ptype {
@@ -71,7 +73,14 @@ fn extract_f32_elements(fsl: &FixedSizeListArray) -> VortexResult<PrimitiveArray
7173 PType :: F64 => Ok ( primitive
7274 . as_slice :: < f64 > ( )
7375 . iter ( )
74- . map ( |& v| v as f32 )
76+ . map ( |& v| {
77+ #[ expect(
78+ clippy:: cast_possible_truncation,
79+ reason = "TurboQuant quantization operates in f32, so f64 inputs are intentionally downcast"
80+ ) ]
81+ let v = v as f32 ;
82+ v
83+ } )
7584 . collect ( ) ) ,
7685 _ => vortex_bail ! ( "TurboQuant requires float elements, got {ptype:?}" ) ,
7786 }
@@ -94,7 +103,6 @@ struct QuantizationResult {
94103/// Norms are computed in the native element precision via the [`L2Norm`] scalar function.
95104/// The rotation and centroid lookup happen in f32. Null rows (per the input validity) produce
96105/// all-zero codes.
97- #[ allow( clippy:: cast_possible_truncation) ]
98106fn turboquant_quantize_core (
99107 ext : ArrayView < Extension > ,
100108 fsl : & FixedSizeListArray ,
@@ -103,7 +111,8 @@ fn turboquant_quantize_core(
103111 validity : & Validity ,
104112 ctx : & mut ExecutionCtx ,
105113) -> VortexResult < QuantizationResult > {
106- let dimension = fsl. list_size ( ) as usize ;
114+ let dimension =
115+ usize:: try_from ( fsl. list_size ( ) ) . vortex_expect ( "u32 FixedSizeList dimension fits in usize" ) ;
107116 let num_rows = fsl. len ( ) ;
108117
109118 // Compute native-precision norms via the L2Norm scalar fn. L2Norm propagates validity from
@@ -127,10 +136,12 @@ fn turboquant_quantize_core(
127136
128137 let rotation = RotationMatrix :: try_new ( seed, dimension) ?;
129138 let padded_dim = rotation. padded_dim ( ) ;
139+ let padded_dim_u32 =
140+ u32:: try_from ( padded_dim) . vortex_expect ( "padded_dim stays representable as u32" ) ;
130141
131- let f32_elements = extract_f32_elements ( fsl) ?;
142+ let f32_elements = extract_f32_elements ( fsl, ctx ) ?;
132143
133- let centroids = get_centroids ( padded_dim as u32 , bit_width) ?;
144+ let centroids = get_centroids ( padded_dim_u32 , bit_width) ?;
134145 let boundaries = compute_centroid_boundaries ( & centroids) ;
135146
136147 let mut all_indices = BufferMut :: < u8 > :: with_capacity ( num_rows * padded_dim) ;
@@ -173,19 +184,20 @@ fn turboquant_quantize_core(
173184}
174185
175186/// Build a `TurboQuantArray` from quantization results.
176- #[ allow( clippy:: cast_possible_truncation) ]
177187fn build_turboquant (
178188 fsl : & FixedSizeListArray ,
179189 core : QuantizationResult ,
180190 ext_dtype : DType ,
181191) -> VortexResult < TurboQuantArray > {
182192 let num_rows = fsl. len ( ) ;
183193 let padded_dim = core. padded_dim ;
194+ let padded_dim_u32 =
195+ u32:: try_from ( padded_dim) . vortex_expect ( "padded_dim stays representable as u32" ) ;
184196 let codes_elements =
185197 PrimitiveArray :: new :: < u8 > ( core. all_indices . freeze ( ) , Validity :: NonNullable ) ;
186198 let codes = FixedSizeListArray :: try_new (
187199 codes_elements. into_array ( ) ,
188- padded_dim as u32 ,
200+ padded_dim_u32 ,
189201 Validity :: NonNullable ,
190202 num_rows,
191203 ) ?
@@ -220,11 +232,12 @@ pub fn turboquant_encode(
220232) -> VortexResult < ArrayRef > {
221233 let ext_dtype = ext. dtype ( ) . clone ( ) ;
222234 let storage = ext. storage_array ( ) ;
223- let fsl = storage. to_canonical ( ) ? . into_fixed_size_list ( ) ;
235+ let fsl = storage. clone ( ) . execute :: < FixedSizeListArray > ( ctx ) ? ;
224236
225237 vortex_ensure ! (
226- config. bit_width >= 1 && config. bit_width <= 8 ,
227- "bit_width must be 1-8, got {}" ,
238+ config. bit_width >= 1 && config. bit_width <= TurboQuant :: MAX_BIT_WIDTH ,
239+ "bit_width must be 1-{}, got {}" ,
240+ TurboQuant :: MAX_BIT_WIDTH ,
228241 config. bit_width
229242 ) ;
230243 let dimension = fsl. list_size ( ) ;
0 commit comments