@@ -5,7 +5,7 @@ use defines::AfError;
55use dim4:: Dim4 ;
66use seq:: Seq ;
77use defines:: Aftype ;
8- use self :: libc:: { uint8_t , c_void , c_int, c_uint, c_longlong} ;
8+ use self :: libc:: { c_int, c_uint, c_longlong} ;
99
1010type MutAfArray = * mut self :: libc:: c_longlong ;
1111type MutAfSeq = * mut Seq ;
@@ -39,7 +39,7 @@ pub struct Index {
3939
4040impl Index {
4141 #[ allow( unused_mut) ]
42- pub fn new < T > ( arr : Option < Array > , seq : Option < Seq > , is_batch : bool ) -> Result < Index , AfError > {
42+ pub fn new ( arr : Option < Array > , seq : Option < Seq > , is_batch : bool ) -> Result < Index , AfError > {
4343 unsafe {
4444 let mut err_val: c_int = 0 ;
4545 let mut temp: i64 = 0 ;
@@ -63,97 +63,157 @@ impl Index {
6363 }
6464 }
6565
66- pub fn index ( & self , input : Array , seqs : & [ Seq ] ) -> Result < Array , AfError > {
67- unsafe {
68- let mut temp: i64 = 0 ;
69- let err_val = af_index ( & mut temp as MutAfArray
70- , input. get ( ) as AfArray , seqs. len ( ) as u32
71- , seqs. as_ptr ( ) as * const SeqT ) ;
72- match err_val {
73- 0 => Ok ( Array :: from ( temp) ) ,
74- _ => Err ( AfError :: from ( err_val) ) ,
75- }
76- }
66+ pub fn get ( & self ) -> i64 {
67+ self . handle
7768 }
7869
79- pub fn lookup ( & self , input : Array , indices : Array , seq_dim : i32 ) -> Result < Array , AfError > {
70+ pub fn is_seq ( & self ) -> bool {
71+ self . is_seq
72+ }
73+
74+ pub fn is_batch ( & self ) -> bool {
75+ self . is_batch
76+ }
77+ }
78+
79+ impl Drop for Index {
80+ fn drop ( & mut self ) {
8081 unsafe {
81- let mut temp: i64 = 0 ;
82- let err_val = af_lookup ( & mut temp as MutAfArray
83- , input. get ( ) as AfArray
84- , indices. get ( ) as AfArray
85- , seq_dim as c_uint ) ;
86- match err_val {
87- 0 => Ok ( Array :: from ( temp) ) ,
88- _ => Err ( AfError :: from ( err_val) ) ,
82+ let ret_val = af_release_index ( self . handle as MutAfIndex ) ;
83+ match ret_val {
84+ 0 => ( ) ,
85+ _ => panic ! ( "Failed to destruct Index: {}" , ret_val) ,
8986 }
9087 }
9188 }
89+ }
9290
93- pub fn assign_seq ( & self , lhs : Array , ndims : usize , seq_dim : i32 , seqs : & [ Seq ] , rhs : Array ) -> Result < Array , AfError > {
94- unsafe {
95- let mut temp: i64 = 0 ;
96- let err_val = af_assign_seq ( & mut temp as MutAfArray
97- , lhs. get ( ) as AfArray
98- , ndims as c_uint , seqs. as_ptr ( ) as * const IndexT
99- , rhs. get ( ) as AfArray ) ;
100- match err_val {
101- 0 => Ok ( Array :: from ( temp) ) ,
102- _ => Err ( AfError :: from ( err_val) ) ,
103- }
91+ pub fn index ( input : & Array , seqs : & [ Seq ] ) -> Result < Array , AfError > {
92+ unsafe {
93+ let mut temp: i64 = 0 ;
94+ let err_val = af_index ( & mut temp as MutAfArray
95+ , input. get ( ) as AfArray , seqs. len ( ) as u32
96+ , seqs. as_ptr ( ) as * const SeqT ) ;
97+ match err_val {
98+ 0 => Ok ( Array :: from ( temp) ) ,
99+ _ => Err ( AfError :: from ( err_val) ) ,
104100 }
105101 }
102+ }
106103
107- pub fn index_gen ( & self , input : Array , ndims : Dim4 , indices : & [ Index ] ) -> Result < Array , AfError > {
108- unsafe {
109- let mut temp: i64 = 0 ;
110- let err_val = af_index_gen ( & mut temp as MutAfArray
111- , input. get ( ) as AfArray
112- , ndims. get ( ) . as_ptr ( ) as DimT
113- , indices. as_ptr ( ) as * const IndexT ) ;
114- match err_val {
115- 0 => Ok ( Array :: from ( temp) ) ,
116- _ => Err ( AfError :: from ( err_val) ) ,
117- }
118- }
104+ pub fn row ( input : & Array , row_num : u64 ) -> Result < Array , AfError > {
105+ let dims_err = input. dims ( ) ;
106+ let mut dims = [ 0 , 0 , 0 , 0 ] ;
107+ match dims_err {
108+ Ok ( dim) => dims = dim. get ( ) . clone ( ) ,
109+ Err ( e) => panic ! ( "Error unwrapping dims in row(): {}" , e) ,
119110 }
120111
121- pub fn assign_gen ( & self , lhs : Array , ndims : Dim4 , indices : & [ Index ] , rhs : Array ) -> Result < Array , AfError > {
122- unsafe {
123- let mut temp: i64 = 0 ;
124- let err_val = af_assign_gen ( & mut temp as MutAfArray
125- , lhs. get ( ) as AfArray
126- , ndims. get ( ) . as_ptr ( ) as DimT
127- , indices. as_ptr ( ) as * const IndexT
128- , rhs. get ( ) as AfArray ) ;
129- match err_val {
130- 0 => Ok ( Array :: from ( temp) ) ,
131- _ => Err ( AfError :: from ( err_val) ) ,
132- }
133- }
112+ let array_end = dims[ 0 ] as f64 * dims[ 1 ] as f64 * dims[ 2 ] as f64 * dims[ 3 ] as f64 ;
113+ let row_begin: f64 = dims[ 1 ] as f64 * row_num as f64 ;
114+ assert ! ( row_begin <= array_end - dims[ 1 ] as f64 ) ;
115+
116+ let row_end: f64 = row_begin + dims[ 1 ] as f64 - 1.0 ;
117+ assert ! ( row_end <= array_end) ;
118+
119+ let index = Index :: new ( None , Some ( Seq :: new ( row_begin, row_end, 1.0 ) ) , false ) ;
120+ println ! ( "origin size {} x {} x {} x {}" , dims[ 0 ] , dims[ 1 ] , dims[ 2 ] , dims[ 3 ] ) ;
121+ println ! ( "passed index gen from {} to {}" , row_begin, row_end) ;
122+
123+ match index {
124+ Ok ( i) => { println ! ( "index raw handle: {}" , i. get( ) ) ; index_gen ( input, Dim4 :: new ( & [ 1 , 1 , 1 , 1 ] ) , & [ i] ) } ,
125+ Err ( e) => Err ( AfError :: from ( e) ) ,
134126 }
127+ }
135128
136- pub fn get ( & self ) -> i64 {
137- self . handle
129+ pub fn col ( input : & Array , col_num : u64 ) -> Result < Array , AfError > {
130+ let dims_err = input. dims ( ) ;
131+ let mut dims = [ 0 , 0 , 0 , 0 ] ;
132+ match dims_err {
133+ Ok ( dim) => dims = dim. get ( ) . clone ( ) ,
134+ Err ( e) => panic ! ( "Error unwrapping dims in col(): {}" , e) ,
138135 }
139136
140- pub fn is_seq ( & self ) -> bool {
141- self . is_seq
137+ let input_type_err = input. get_type ( ) ;
138+ let mut input_type = Aftype :: F32 ;
139+ match input_type_err {
140+ Ok ( t) => input_type = t,
141+ Err ( e) => panic ! ( "Error unwrapping type in col(): {}" , e) ,
142142 }
143143
144- pub fn is_batch ( & self ) -> bool {
145- self . is_seq
144+ let mut indices = vec ! [ col_num] ;
145+ for i in 0 ..dims[ 0 ] -1 {
146+ let last_element = indices[ indices. len ( ) - 1 ] ;
147+ indices. push ( last_element + dims[ 0 ] ) ;
148+ }
149+
150+ let index_array = Array :: new ( Dim4 :: new ( & dims) , & indices, input_type) ;
151+ match index_array {
152+ Ok ( a) => {
153+ let index = Index :: new ( Some ( a) , None , false ) ;
154+ match index {
155+ Ok ( i) => index_gen ( input, Dim4 :: new ( & [ 1 , 1 , 1 , 1 ] ) , & [ i] ) ,
156+ Err ( e) => Err ( AfError :: from ( e) ) ,
157+ }
158+ } ,
159+ Err ( e) => Err ( AfError :: from ( e) ) ,
146160 }
147161}
148162
149- impl Drop for Index {
150- fn drop ( & mut self ) {
151- unsafe {
152- let ret_val = af_release_index ( self . handle as MutAfIndex ) ;
153- match ret_val {
154- 0 => ( ) ,
155- _ => panic ! ( "Failed to destruct Index: {}" , ret_val) ,
156- }
163+ pub fn lookup ( input : & Array , indices : & Array , seq_dim : i32 ) -> Result < Array , AfError > {
164+ unsafe {
165+ let mut temp: i64 = 0 ;
166+ let err_val = af_lookup ( & mut temp as MutAfArray
167+ , input. get ( ) as AfArray
168+ , indices. get ( ) as AfArray
169+ , seq_dim as c_uint ) ;
170+ match err_val {
171+ 0 => Ok ( Array :: from ( temp) ) ,
172+ _ => Err ( AfError :: from ( err_val) ) ,
173+ }
174+ }
175+ }
176+
177+
178+ pub fn assign_seq ( lhs : & Array , ndims : usize , seqs : & [ Seq ] , rhs : & Array ) -> Result < Array , AfError > {
179+ unsafe {
180+ let mut temp: i64 = 0 ;
181+ let err_val = af_assign_seq ( & mut temp as MutAfArray
182+ , lhs. get ( ) as AfArray
183+ , ndims as c_uint , seqs. as_ptr ( ) as * const IndexT
184+ , rhs. get ( ) as AfArray ) ;
185+ match err_val {
186+ 0 => Ok ( Array :: from ( temp) ) ,
187+ _ => Err ( AfError :: from ( err_val) ) ,
188+ }
189+ }
190+ }
191+
192+ pub fn index_gen ( input : & Array , ndims : Dim4 , indices : & [ Index ] ) -> Result < Array , AfError > {
193+ unsafe {
194+ let mut temp: i64 = 0 ;
195+ let err_val = af_index_gen ( & mut temp as MutAfArray
196+ , input. get ( ) as AfArray
197+ , ndims. get ( ) . as_ptr ( ) as DimT
198+ , indices. as_ptr ( ) as * const IndexT ) ;
199+ match err_val {
200+ 0 => Ok ( Array :: from ( temp) ) ,
201+ _ => Err ( AfError :: from ( err_val) ) ,
202+ }
203+ }
204+ }
205+
206+ pub fn assign_gen ( lhs : & Array , ndims : Dim4 , indices : & [ Index ] , rhs : & Array ) -> Result < Array , AfError > {
207+ unsafe {
208+ let mut temp: i64 = 0 ;
209+ let err_val = af_assign_gen ( & mut temp as MutAfArray
210+ , lhs. get ( ) as AfArray
211+ , ndims. get ( ) . as_ptr ( ) as DimT
212+ , indices. as_ptr ( ) as * const IndexT
213+ , rhs. get ( ) as AfArray ) ;
214+ match err_val {
215+ 0 => Ok ( Array :: from ( temp) ) ,
216+ _ => Err ( AfError :: from ( err_val) ) ,
157217 }
158218 }
159219}
0 commit comments