2828//! This makes SORF sign generation stable as an extension format contract even if external RNG
2929//! implementations change.
3030//!
31- //! This transform is the crate's practical structured-rotation choice for TurboQuant. It is not
31+ //! This transform is the crate's practical structured transform choice for TurboQuant. It is not
3232//! the dense random Gaussian or orthogonal matrix used by some theoretical analyses, so theoretical
3333//! bounds from those models need separate validation before being presented as implementation
3434//! guarantees.
@@ -118,7 +118,7 @@ impl SorfMatrix {
118118
119119 /// Returns the padded dimension (next power of 2 >= dim).
120120 ///
121- /// All `rotate `/`inverse_rotate ` buffers must be this length.
121+ /// All `transform `/`inverse_transform ` buffers must be this length.
122122 pub ( crate ) fn padded_dim ( & self ) -> usize {
123123 self . padded_dim
124124 }
@@ -127,7 +127,7 @@ impl SorfMatrix {
127127 ///
128128 /// Both `input` and `output` must have length [`padded_dim()`](Self::padded_dim). The caller is
129129 /// responsible for zero-padding input beyond `dim` positions.
130- pub ( crate ) fn rotate ( & self , input : & [ f32 ] , output : & mut [ f32 ] ) {
130+ pub ( crate ) fn transform ( & self , input : & [ f32 ] , output : & mut [ f32 ] ) {
131131 debug_assert_eq ! ( input. len( ) , self . padded_dim) ;
132132 debug_assert_eq ! ( output. len( ) , self . padded_dim) ;
133133
@@ -138,7 +138,7 @@ impl SorfMatrix {
138138 /// Apply the inverse orthogonal transform: `output = R⁻¹(input)`.
139139 ///
140140 /// Both `input` and `output` must have length `padded_dim()`.
141- pub ( crate ) fn inverse_rotate ( & self , input : & [ f32 ] , output : & mut [ f32 ] ) {
141+ pub ( crate ) fn inverse_transform ( & self , input : & [ f32 ] , output : & mut [ f32 ] ) {
142142 debug_assert_eq ! ( input. len( ) , self . padded_dim) ;
143143 debug_assert_eq ! ( output. len( ) , self . padded_dim) ;
144144
@@ -355,9 +355,9 @@ mod tests {
355355 let padded_dim = dim_to_usize ( 64u32 ) ;
356356 let num_rounds = rounds_to_usize ( 3u8 ) ;
357357 let seed = 42u64 ;
358- let r1 = SorfMatrix :: try_new ( padded_dim, num_rounds, seed) ?;
359- let r2 = SorfMatrix :: try_new ( padded_dim, num_rounds, seed) ?;
360- let pd = r1 . padded_dim ( ) ;
358+ let transform1 = SorfMatrix :: try_new ( padded_dim, num_rounds, seed) ?;
359+ let transform2 = SorfMatrix :: try_new ( padded_dim, num_rounds, seed) ?;
360+ let pd = transform1 . padded_dim ( ) ;
361361
362362 let mut input = vec ! [ 0.0f32 ; pd] ;
363363 for i in 0 ..padded_dim {
@@ -366,8 +366,8 @@ mod tests {
366366 let mut out1 = vec ! [ 0.0f32 ; pd] ;
367367 let mut out2 = vec ! [ 0.0f32 ; pd] ;
368368
369- r1 . rotate ( & input, & mut out1) ;
370- r2 . rotate ( & input, & mut out2) ;
369+ transform1 . transform ( & input, & mut out1) ;
370+ transform2 . transform ( & input, & mut out2) ;
371371
372372 assert_eq ! ( out1, out2) ;
373373 Ok ( ( ) )
@@ -378,8 +378,8 @@ mod tests {
378378 let padded_dim = dim_to_usize ( 64u32 ) ;
379379 let num_rounds = rounds_to_usize ( 2u8 ) ;
380380 let seed = 42u64 ;
381- let rot = SorfMatrix :: try_new ( padded_dim, num_rounds, seed) ?;
382- let actual = rot . export_inverse_signs_u8 ( ) ;
381+ let transform = SorfMatrix :: try_new ( padded_dim, num_rounds, seed) ?;
382+ let actual = transform . export_inverse_signs_u8 ( ) ;
383383 let mut rng = SplitMix64 :: new ( seed) ;
384384 let round0_word = rng. next_u64 ( ) ;
385385 let round1_word = rng. next_u64 ( ) ;
@@ -446,18 +446,18 @@ mod tests {
446446 fn roundtrip_exact ( #[ case] dim : u32 , #[ case] num_rounds : u8 ) -> VortexResult < ( ) > {
447447 let dim = dim_to_usize ( dim) ;
448448 let num_rounds = rounds_to_usize ( num_rounds) ;
449- let rot = SorfMatrix :: try_new ( dim. next_power_of_two ( ) , num_rounds, 42u64 ) ?;
450- let padded_dim = rot . padded_dim ( ) ;
449+ let transform = SorfMatrix :: try_new ( dim. next_power_of_two ( ) , num_rounds, 42u64 ) ?;
450+ let padded_dim = transform . padded_dim ( ) ;
451451
452452 let mut input = vec ! [ 0.0f32 ; padded_dim] ;
453453 for i in 0 ..dim {
454454 input[ i] = ( i as f32 + 1.0 ) * 0.01 ;
455455 }
456- let mut rotated = vec ! [ 0.0f32 ; padded_dim] ;
456+ let mut transformed = vec ! [ 0.0f32 ; padded_dim] ;
457457 let mut recovered = vec ! [ 0.0f32 ; padded_dim] ;
458458
459- rot . rotate ( & input, & mut rotated ) ;
460- rot . inverse_rotate ( & rotated , & mut recovered) ;
459+ transform . transform ( & input, & mut transformed ) ;
460+ transform . inverse_transform ( & transformed , & mut recovered) ;
461461
462462 let max_err: f32 = input
463463 . iter ( )
@@ -484,25 +484,25 @@ mod tests {
484484 fn preserves_norm ( #[ case] dim : u32 , #[ case] num_rounds : u8 ) -> VortexResult < ( ) > {
485485 let dim = dim_to_usize ( dim) ;
486486 let num_rounds = rounds_to_usize ( num_rounds) ;
487- let rot = SorfMatrix :: try_new ( dim. next_power_of_two ( ) , num_rounds, 7u64 ) ?;
488- let padded_dim = rot . padded_dim ( ) ;
487+ let transform = SorfMatrix :: try_new ( dim. next_power_of_two ( ) , num_rounds, 7u64 ) ?;
488+ let padded_dim = transform . padded_dim ( ) ;
489489
490490 let mut input = vec ! [ 0.0f32 ; padded_dim] ;
491491 for i in 0 ..dim {
492492 input[ i] = ( i as f32 ) * 0.01 ;
493493 }
494494 let input_norm: f32 = input. iter ( ) . map ( |x| x * x) . sum :: < f32 > ( ) . sqrt ( ) ;
495495
496- let mut rotated = vec ! [ 0.0f32 ; padded_dim] ;
497- rot . rotate ( & input, & mut rotated ) ;
498- let rotated_norm : f32 = rotated . iter ( ) . map ( |x| x * x) . sum :: < f32 > ( ) . sqrt ( ) ;
496+ let mut transformed = vec ! [ 0.0f32 ; padded_dim] ;
497+ transform . transform ( & input, & mut transformed ) ;
498+ let transformed_norm : f32 = transformed . iter ( ) . map ( |x| x * x) . sum :: < f32 > ( ) . sqrt ( ) ;
499499
500500 assert ! (
501- ( input_norm - rotated_norm ) . abs( ) / input_norm < 1e-5 ,
501+ ( input_norm - transformed_norm ) . abs( ) / input_norm < 1e-5 ,
502502 "norm not preserved for dim={dim}: {} vs {} (rel err: {:.2e})" ,
503503 input_norm,
504- rotated_norm ,
505- ( input_norm - rotated_norm ) . abs( ) / input_norm
504+ transformed_norm ,
505+ ( input_norm - transformed_norm ) . abs( ) / input_norm
506506 ) ;
507507 Ok ( ( ) )
508508 }
@@ -517,11 +517,11 @@ mod tests {
517517 fn sign_export_import_roundtrip ( #[ case] dim : u32 , #[ case] num_rounds : u8 ) -> VortexResult < ( ) > {
518518 let dim = dim_to_usize ( dim) ;
519519 let num_rounds = rounds_to_usize ( num_rounds) ;
520- let rot = SorfMatrix :: try_new ( dim. next_power_of_two ( ) , num_rounds, 42u64 ) ?;
521- let padded_dim = rot . padded_dim ( ) ;
520+ let transform = SorfMatrix :: try_new ( dim. next_power_of_two ( ) , num_rounds, 42u64 ) ?;
521+ let padded_dim = transform . padded_dim ( ) ;
522522
523- let signs_u8 = rot . export_inverse_signs_u8 ( ) ;
524- let rot2 = SorfMatrix :: from_u8_slice ( & signs_u8, dim, num_rounds) ?;
523+ let signs_u8 = transform . export_inverse_signs_u8 ( ) ;
524+ let transform2 = SorfMatrix :: from_u8_slice ( & signs_u8, dim, num_rounds) ?;
525525
526526 let mut input = vec ! [ 0.0f32 ; padded_dim] ;
527527 for i in 0 ..dim {
@@ -530,13 +530,13 @@ mod tests {
530530
531531 let mut out1 = vec ! [ 0.0f32 ; padded_dim] ;
532532 let mut out2 = vec ! [ 0.0f32 ; padded_dim] ;
533- rot . rotate ( & input, & mut out1) ;
534- rot2 . rotate ( & input, & mut out2) ;
533+ transform . transform ( & input, & mut out1) ;
534+ transform2 . transform ( & input, & mut out2) ;
535535 assert_eq ! ( out1, out2, "Forward transform mismatch after export/import" ) ;
536536
537- rot . inverse_rotate ( & out1, & mut out2) ;
537+ transform . inverse_transform ( & out1, & mut out2) ;
538538 let mut out3 = vec ! [ 0.0f32 ; padded_dim] ;
539- rot2 . inverse_rotate ( & out1, & mut out3) ;
539+ transform2 . inverse_transform ( & out1, & mut out3) ;
540540 assert_eq ! ( out2, out3, "Inverse transform mismatch after export/import" ) ;
541541
542542 Ok ( ( ) )
0 commit comments