@@ -75,6 +75,17 @@ impl SourceOp {
7575 } ,
7676 }
7777 }
78+
79+ /// Generate a linear sequence: `value[i] = base + i * multiplier`.
80+ /// Used for SequenceArray (e.g. monotonic run-end endpoints).
81+ pub fn sequence ( base : i64 , multiplier : i64 ) -> Self {
82+ Self {
83+ op_code : SourceOp_SourceOpCode_SEQUENCE ,
84+ params : SourceParams {
85+ sequence : SourceParams_SequenceParams { base, multiplier } ,
86+ } ,
87+ }
88+ }
7889}
7990
8091impl ScalarOp {
@@ -1004,4 +1015,60 @@ mod tests {
10041015
10051016 Ok ( ( ) )
10061017 }
1018+
1019+ #[ rstest]
1020+ #[ case( 0u32 , 1u32 , 100 ) ]
1021+ #[ case( 5u32 , 3u32 , 2048 ) ]
1022+ #[ case( 0u32 , 1u32 , 4096 ) ]
1023+ #[ case( 100u32 , 7u32 , 5000 ) ]
1024+ #[ crate :: test]
1025+ fn test_sequence_unsigned (
1026+ #[ case] base : u32 ,
1027+ #[ case] multiplier : u32 ,
1028+ #[ case] len : usize ,
1029+ ) -> VortexResult < ( ) > {
1030+ use vortex:: dtype:: Nullability ;
1031+ use vortex:: encodings:: sequence:: SequenceArray ;
1032+
1033+ let expected: Vec < u32 > = ( 0 ..len) . map ( |i| base + ( i as u32 ) * multiplier) . collect ( ) ;
1034+
1035+ let seq = SequenceArray :: try_new_typed ( base, multiplier, Nullability :: NonNullable , len) ?;
1036+
1037+ let cuda_ctx = CudaSession :: create_execution_ctx ( & VortexSession :: empty ( ) ) ?;
1038+ let ( plan, _bufs) = build_plan ( & seq. into_array ( ) , & cuda_ctx) ?;
1039+
1040+ let actual = run_dynamic_dispatch_plan ( & cuda_ctx, expected. len ( ) , & plan) ?;
1041+ assert_eq ! ( actual, expected) ;
1042+
1043+ Ok ( ( ) )
1044+ }
1045+
1046+ #[ rstest]
1047+ #[ case( 0i32 , 1i32 , 100 ) ]
1048+ #[ case( -10i32 , 3i32 , 2048 ) ]
1049+ #[ case( 100i32 , -1i32 , 100 ) ]
1050+ #[ case( -500i32 , -7i32 , 50 ) ]
1051+ #[ case( 0i32 , 1i32 , 5000 ) ]
1052+ #[ crate :: test]
1053+ fn test_sequence_signed (
1054+ #[ case] base : i32 ,
1055+ #[ case] multiplier : i32 ,
1056+ #[ case] len : usize ,
1057+ ) -> VortexResult < ( ) > {
1058+ use vortex:: dtype:: Nullability ;
1059+ use vortex:: encodings:: sequence:: SequenceArray ;
1060+
1061+ let expected: Vec < i32 > = ( 0 ..len) . map ( |i| base + ( i as i32 ) * multiplier) . collect ( ) ;
1062+
1063+ let seq = SequenceArray :: try_new_typed ( base, multiplier, Nullability :: NonNullable , len) ?;
1064+
1065+ let cuda_ctx = CudaSession :: create_execution_ctx ( & VortexSession :: empty ( ) ) ?;
1066+ let ( plan, _bufs) = build_plan ( & seq. into_array ( ) , & cuda_ctx) ?;
1067+
1068+ let actual_u32 = run_dynamic_dispatch_plan ( & cuda_ctx, expected. len ( ) , & plan) ?;
1069+ let actual: Vec < i32 > = actual_u32. into_iter ( ) . map ( |v| v as i32 ) . collect ( ) ;
1070+ assert_eq ! ( actual, expected) ;
1071+
1072+ Ok ( ( ) )
1073+ }
10071074}
0 commit comments