@@ -20,7 +20,7 @@ macro_rules! impl_eig_complex {
20
20
fn eig(
21
21
calc_v: bool ,
22
22
l: MatrixLayout ,
23
- mut a: & mut [ Self ] ,
23
+ a: & mut [ Self ] ,
24
24
) -> Result <( Vec <Self :: Complex >, Vec <Self :: Complex >) > {
25
25
let ( n, _) = l. size( ) ;
26
26
// LAPACK assumes a column-major input. A row-major input can
@@ -35,74 +35,69 @@ macro_rules! impl_eig_complex {
35
35
// eigenvalues are the eigenvalues computed with `A`.
36
36
let ( jobvl, jobvr) = if calc_v {
37
37
match l {
38
- MatrixLayout :: C { .. } => ( b'V' , b'N' ) ,
39
- MatrixLayout :: F { .. } => ( b'N' , b'V' ) ,
38
+ MatrixLayout :: C { .. } => ( EigenVectorFlag :: Calc , EigenVectorFlag :: Not ) ,
39
+ MatrixLayout :: F { .. } => ( EigenVectorFlag :: Not , EigenVectorFlag :: Calc ) ,
40
40
}
41
41
} else {
42
- ( b'N' , b'N' )
42
+ ( EigenVectorFlag :: Not , EigenVectorFlag :: Not )
43
43
} ;
44
44
let mut eigs = unsafe { vec_uninit( n as usize ) } ;
45
- let mut rwork = unsafe { vec_uninit( 2 * n as usize ) } ;
45
+ let mut rwork: Vec < Self :: Real > = unsafe { vec_uninit( 2 * n as usize ) } ;
46
46
47
- let mut vl = if jobvl == b'V' {
48
- Some ( unsafe { vec_uninit( ( n * n) as usize ) } )
49
- } else {
50
- None
51
- } ;
52
- let mut vr = if jobvr == b'V' {
53
- Some ( unsafe { vec_uninit( ( n * n) as usize ) } )
54
- } else {
55
- None
56
- } ;
47
+ let mut vl: Option <Vec <Self >> =
48
+ jobvl. then( || unsafe { vec_uninit( ( n * n) as usize ) } ) ;
49
+ let mut vr: Option <Vec <Self >> =
50
+ jobvr. then( || unsafe { vec_uninit( ( n * n) as usize ) } ) ;
57
51
58
52
// calc work size
59
53
let mut info = 0 ;
60
54
let mut work_size = [ Self :: zero( ) ] ;
61
55
unsafe {
62
56
$ev(
63
- jobvl,
64
- jobvr,
65
- n,
66
- & mut a ,
67
- n,
68
- & mut eigs,
69
- & mut vl. as_mut( ) . map( |v| v. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ,
70
- n,
71
- & mut vr. as_mut( ) . map( |v| v. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ,
72
- n,
73
- & mut work_size,
74
- - 1 ,
75
- & mut rwork,
57
+ jobvl. as_ptr ( ) ,
58
+ jobvr. as_ptr ( ) ,
59
+ & n,
60
+ AsPtr :: as_mut_ptr ( a ) ,
61
+ & n,
62
+ AsPtr :: as_mut_ptr ( & mut eigs) ,
63
+ AsPtr :: as_mut_ptr ( vl. as_mut( ) . map( |v| v. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ) ,
64
+ & n,
65
+ AsPtr :: as_mut_ptr ( vr. as_mut( ) . map( |v| v. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ) ,
66
+ & n,
67
+ AsPtr :: as_mut_ptr ( & mut work_size) ,
68
+ & ( - 1 ) ,
69
+ AsPtr :: as_mut_ptr ( & mut rwork) ,
76
70
& mut info,
77
71
)
78
72
} ;
79
73
info. as_lapack_result( ) ?;
80
74
81
75
// actal ev
82
76
let lwork = work_size[ 0 ] . to_usize( ) . unwrap( ) ;
83
- let mut work = unsafe { vec_uninit( lwork) } ;
77
+ let mut work: Vec <Self > = unsafe { vec_uninit( lwork) } ;
78
+ let lwork = lwork as i32 ;
84
79
unsafe {
85
80
$ev(
86
- jobvl,
87
- jobvr,
88
- n,
89
- & mut a ,
90
- n,
91
- & mut eigs,
92
- & mut vl. as_mut( ) . map( |v| v. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ,
93
- n,
94
- & mut vr. as_mut( ) . map( |v| v. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ,
95
- n,
96
- & mut work,
97
- lwork as i32 ,
98
- & mut rwork,
81
+ jobvl. as_ptr ( ) ,
82
+ jobvr. as_ptr ( ) ,
83
+ & n,
84
+ AsPtr :: as_mut_ptr ( a ) ,
85
+ & n,
86
+ AsPtr :: as_mut_ptr ( & mut eigs) ,
87
+ AsPtr :: as_mut_ptr ( vl. as_mut( ) . map( |v| v. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ) ,
88
+ & n,
89
+ AsPtr :: as_mut_ptr ( vr. as_mut( ) . map( |v| v. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ) ,
90
+ & n,
91
+ AsPtr :: as_mut_ptr ( & mut work) ,
92
+ & lwork,
93
+ AsPtr :: as_mut_ptr ( & mut rwork) ,
99
94
& mut info,
100
95
)
101
96
} ;
102
97
info. as_lapack_result( ) ?;
103
98
104
99
// Hermite conjugate
105
- if jobvl == b'V' {
100
+ if jobvl. is_calc ( ) {
106
101
for c in vl. as_mut( ) . unwrap( ) . iter_mut( ) {
107
102
c. im = -c. im
108
103
}
@@ -114,16 +109,16 @@ macro_rules! impl_eig_complex {
114
109
} ;
115
110
}
116
111
117
- impl_eig_complex ! ( c64, lapack :: zgeev ) ;
118
- impl_eig_complex ! ( c32, lapack :: cgeev ) ;
112
+ impl_eig_complex ! ( c64, lapack_sys :: zgeev_ ) ;
113
+ impl_eig_complex ! ( c32, lapack_sys :: cgeev_ ) ;
119
114
120
115
macro_rules! impl_eig_real {
121
116
( $scalar: ty, $ev: path) => {
122
117
impl Eig_ for $scalar {
123
118
fn eig(
124
119
calc_v: bool ,
125
120
l: MatrixLayout ,
126
- mut a: & mut [ Self ] ,
121
+ a: & mut [ Self ] ,
127
122
) -> Result <( Vec <Self :: Complex >, Vec <Self :: Complex >) > {
128
123
let ( n, _) = l. size( ) ;
129
124
// LAPACK assumes a column-major input. A row-major input can
@@ -144,67 +139,62 @@ macro_rules! impl_eig_real {
144
139
// `sgeev`/`dgeev`.
145
140
let ( jobvl, jobvr) = if calc_v {
146
141
match l {
147
- MatrixLayout :: C { .. } => ( b'V' , b'N' ) ,
148
- MatrixLayout :: F { .. } => ( b'N' , b'V' ) ,
142
+ MatrixLayout :: C { .. } => ( EigenVectorFlag :: Calc , EigenVectorFlag :: Not ) ,
143
+ MatrixLayout :: F { .. } => ( EigenVectorFlag :: Not , EigenVectorFlag :: Calc ) ,
149
144
}
150
145
} else {
151
- ( b'N' , b'N' )
146
+ ( EigenVectorFlag :: Not , EigenVectorFlag :: Not )
152
147
} ;
153
- let mut eig_re = unsafe { vec_uninit( n as usize ) } ;
154
- let mut eig_im = unsafe { vec_uninit( n as usize ) } ;
148
+ let mut eig_re: Vec < Self > = unsafe { vec_uninit( n as usize ) } ;
149
+ let mut eig_im: Vec < Self > = unsafe { vec_uninit( n as usize ) } ;
155
150
156
- let mut vl = if jobvl == b'V' {
157
- Some ( unsafe { vec_uninit( ( n * n) as usize ) } )
158
- } else {
159
- None
160
- } ;
161
- let mut vr = if jobvr == b'V' {
162
- Some ( unsafe { vec_uninit( ( n * n) as usize ) } )
163
- } else {
164
- None
165
- } ;
151
+ let mut vl: Option <Vec <Self >> =
152
+ jobvl. then( || unsafe { vec_uninit( ( n * n) as usize ) } ) ;
153
+ let mut vr: Option <Vec <Self >> =
154
+ jobvr. then( || unsafe { vec_uninit( ( n * n) as usize ) } ) ;
166
155
167
156
// calc work size
168
157
let mut info = 0 ;
169
- let mut work_size = [ 0.0 ] ;
158
+ let mut work_size: [ Self ; 1 ] = [ 0.0 ] ;
170
159
unsafe {
171
160
$ev(
172
- jobvl,
173
- jobvr,
174
- n,
175
- & mut a ,
176
- n,
177
- & mut eig_re,
178
- & mut eig_im,
179
- vl. as_mut( ) . map( |v| v. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ,
180
- n,
181
- vr. as_mut( ) . map( |v| v. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ,
182
- n,
183
- & mut work_size,
184
- - 1 ,
161
+ jobvl. as_ptr ( ) ,
162
+ jobvr. as_ptr ( ) ,
163
+ & n,
164
+ AsPtr :: as_mut_ptr ( a ) ,
165
+ & n,
166
+ AsPtr :: as_mut_ptr ( & mut eig_re) ,
167
+ AsPtr :: as_mut_ptr ( & mut eig_im) ,
168
+ AsPtr :: as_mut_ptr ( vl. as_mut( ) . map( |v| v. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ) ,
169
+ & n,
170
+ AsPtr :: as_mut_ptr ( vr. as_mut( ) . map( |v| v. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ) ,
171
+ & n,
172
+ AsPtr :: as_mut_ptr ( & mut work_size) ,
173
+ & ( - 1 ) ,
185
174
& mut info,
186
175
)
187
176
} ;
188
177
info. as_lapack_result( ) ?;
189
178
190
179
// actual ev
191
180
let lwork = work_size[ 0 ] . to_usize( ) . unwrap( ) ;
192
- let mut work = unsafe { vec_uninit( lwork) } ;
181
+ let mut work: Vec <Self > = unsafe { vec_uninit( lwork) } ;
182
+ let lwork = lwork as i32 ;
193
183
unsafe {
194
184
$ev(
195
- jobvl,
196
- jobvr,
197
- n,
198
- & mut a ,
199
- n,
200
- & mut eig_re,
201
- & mut eig_im,
202
- vl. as_mut( ) . map( |v| v. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ,
203
- n,
204
- vr. as_mut( ) . map( |v| v. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ,
205
- n,
206
- & mut work,
207
- lwork as i32 ,
185
+ jobvl. as_ptr ( ) ,
186
+ jobvr. as_ptr ( ) ,
187
+ & n,
188
+ AsPtr :: as_mut_ptr ( a ) ,
189
+ & n,
190
+ AsPtr :: as_mut_ptr ( & mut eig_re) ,
191
+ AsPtr :: as_mut_ptr ( & mut eig_im) ,
192
+ AsPtr :: as_mut_ptr ( vl. as_mut( ) . map( |v| v. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ) ,
193
+ & n,
194
+ AsPtr :: as_mut_ptr ( vr. as_mut( ) . map( |v| v. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ) ,
195
+ & n,
196
+ AsPtr :: as_mut_ptr ( & mut work) ,
197
+ & lwork,
208
198
& mut info,
209
199
)
210
200
} ;
@@ -254,7 +244,7 @@ macro_rules! impl_eig_real {
254
244
for row in 0 ..n {
255
245
let re = v[ row + col * n] ;
256
246
let mut im = v[ row + ( col + 1 ) * n] ;
257
- if jobvl == b'V' {
247
+ if jobvl. is_calc ( ) {
258
248
im = -im;
259
249
}
260
250
eigvecs[ row + col * n] = Self :: complex( re, im) ;
@@ -270,5 +260,5 @@ macro_rules! impl_eig_real {
270
260
} ;
271
261
}
272
262
273
- impl_eig_real ! ( f64 , lapack :: dgeev ) ;
274
- impl_eig_real ! ( f32 , lapack :: sgeev ) ;
263
+ impl_eig_real ! ( f64 , lapack_sys :: dgeev_ ) ;
264
+ impl_eig_real ! ( f32 , lapack_sys :: sgeev_ ) ;
0 commit comments