@@ -21,6 +21,10 @@ impl FlagSVD {
21
21
FlagSVD :: No
22
22
}
23
23
}
24
+
25
+ fn as_ptr ( & self ) -> * const i8 {
26
+ self as * const FlagSVD as * const i8
27
+ }
24
28
}
25
29
26
30
/// Result of SVD
@@ -49,7 +53,7 @@ macro_rules! impl_svd {
49
53
} ;
50
54
( @body, $scalar: ty, $gesvd: path, $( $rwork_ident: ident) ,* ) => {
51
55
impl SVD_ for $scalar {
52
- fn svd( l: MatrixLayout , calc_u: bool , calc_vt: bool , mut a: & mut [ Self ] , ) -> Result <SVDOutput <Self >> {
56
+ fn svd( l: MatrixLayout , calc_u: bool , calc_vt: bool , a: & mut [ Self ] , ) -> Result <SVDOutput <Self >> {
53
57
let ju = match l {
54
58
MatrixLayout :: F { .. } => FlagSVD :: from_bool( calc_u) ,
55
59
MatrixLayout :: C { .. } => FlagSVD :: from_bool( calc_vt) ,
@@ -75,52 +79,52 @@ macro_rules! impl_svd {
75
79
let mut s = unsafe { vec_uninit( k as usize ) } ;
76
80
77
81
$(
78
- let mut $rwork_ident = unsafe { vec_uninit( 5 * k as usize ) } ;
82
+ let mut $rwork_ident: Vec < Self :: Real > = unsafe { vec_uninit( 5 * k as usize ) } ;
79
83
) *
80
84
81
85
// eval work size
82
86
let mut info = 0 ;
83
87
let mut work_size = [ Self :: zero( ) ] ;
84
88
unsafe {
85
89
$gesvd(
86
- ju as u8 ,
87
- jvt as u8 ,
88
- m,
89
- n,
90
- & mut a ,
91
- m,
92
- & mut s,
93
- u. as_mut( ) . map( |x| x. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ,
94
- m,
95
- vt. as_mut( ) . map( |x| x. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ,
96
- n,
97
- & mut work_size,
98
- - 1 ,
99
- $( & mut $rwork_ident, ) *
90
+ ju. as_ptr ( ) ,
91
+ jvt. as_ptr ( ) ,
92
+ & m,
93
+ & n,
94
+ AsPtr :: as_mut_ptr ( a ) ,
95
+ & m,
96
+ AsPtr :: as_mut_ptr ( & mut s) ,
97
+ AsPtr :: as_mut_ptr ( u. as_mut( ) . map( |x| x. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ) ,
98
+ & m,
99
+ AsPtr :: as_mut_ptr ( vt. as_mut( ) . map( |x| x. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ) ,
100
+ & n,
101
+ AsPtr :: as_mut_ptr ( & mut work_size) ,
102
+ & ( - 1 ) ,
103
+ $( AsPtr :: as_mut_ptr ( & mut $rwork_ident) , ) *
100
104
& mut info,
101
105
) ;
102
106
}
103
107
info. as_lapack_result( ) ?;
104
108
105
109
// calc
106
110
let lwork = work_size[ 0 ] . to_usize( ) . unwrap( ) ;
107
- let mut work = unsafe { vec_uninit( lwork) } ;
111
+ let mut work: Vec < Self > = unsafe { vec_uninit( lwork) } ;
108
112
unsafe {
109
113
$gesvd(
110
- ju as u8 ,
111
- jvt as u8 ,
112
- m,
113
- n,
114
- & mut a ,
115
- m,
116
- & mut s,
117
- u. as_mut( ) . map( |x| x. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ,
118
- m,
119
- vt. as_mut( ) . map( |x| x. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ,
120
- n,
121
- & mut work,
122
- lwork as i32 ,
123
- $( & mut $rwork_ident, ) *
114
+ ju. as_ptr ( ) ,
115
+ jvt. as_ptr ( ) ,
116
+ & m,
117
+ & n,
118
+ AsPtr :: as_mut_ptr ( a ) ,
119
+ & m,
120
+ AsPtr :: as_mut_ptr ( & mut s) ,
121
+ AsPtr :: as_mut_ptr ( u. as_mut( ) . map( |x| x. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ) ,
122
+ & m,
123
+ AsPtr :: as_mut_ptr ( vt. as_mut( ) . map( |x| x. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ) ,
124
+ & n,
125
+ AsPtr :: as_mut_ptr ( & mut work) ,
126
+ & ( lwork as i32 ) ,
127
+ $( AsPtr :: as_mut_ptr ( & mut $rwork_ident) , ) *
124
128
& mut info,
125
129
) ;
126
130
}
@@ -134,7 +138,7 @@ macro_rules! impl_svd {
134
138
} ;
135
139
} // impl_svd!
136
140
137
- impl_svd ! ( @real, f64 , lapack :: dgesvd ) ;
138
- impl_svd ! ( @real, f32 , lapack :: sgesvd ) ;
139
- impl_svd ! ( @complex, c64, lapack :: zgesvd ) ;
140
- impl_svd ! ( @complex, c32, lapack :: cgesvd ) ;
141
+ impl_svd ! ( @real, f64 , lapack_sys :: dgesvd_ ) ;
142
+ impl_svd ! ( @real, f32 , lapack_sys :: sgesvd_ ) ;
143
+ impl_svd ! ( @complex, c64, lapack_sys :: zgesvd_ ) ;
144
+ impl_svd ! ( @complex, c32, lapack_sys :: cgesvd_ ) ;
0 commit comments