@@ -16,6 +16,12 @@ pub enum UVTFlag {
16
16
None = b'N' ,
17
17
}
18
18
19
+ impl UVTFlag {
20
+ fn as_ptr ( & self ) -> * const i8 {
21
+ self as * const UVTFlag as * const i8
22
+ }
23
+ }
24
+
19
25
pub trait SVDDC_ : Scalar {
20
26
fn svddc ( l : MatrixLayout , jobz : UVTFlag , a : & mut [ Self ] ) -> Result < SVDOutput < Self > > ;
21
27
}
@@ -29,7 +35,7 @@ macro_rules! impl_svddc {
29
35
} ;
30
36
( @body, $scalar: ty, $gesdd: path, $( $rwork_ident: ident) ,* ) => {
31
37
impl SVDDC_ for $scalar {
32
- fn svddc( l: MatrixLayout , jobz: UVTFlag , mut a: & mut [ Self ] , ) -> Result <SVDOutput <Self >> {
38
+ fn svddc( l: MatrixLayout , jobz: UVTFlag , a: & mut [ Self ] , ) -> Result <SVDOutput <Self >> {
33
39
let m = l. lda( ) ;
34
40
let n = l. len( ) ;
35
41
let k = m. min( n) ;
@@ -58,7 +64,7 @@ macro_rules! impl_svddc {
58
64
UVTFlag :: None => 7 * mn,
59
65
_ => std:: cmp:: max( 5 * mn* mn + 5 * mn, 2 * mx* mn + 2 * mn* mn + mn) ,
60
66
} ;
61
- let mut $rwork_ident = unsafe { vec_uninit( lrwork) } ;
67
+ let mut $rwork_ident: Vec < Self :: Real > = unsafe { vec_uninit( lrwork) } ;
62
68
) *
63
69
64
70
// eval work size
@@ -67,44 +73,44 @@ macro_rules! impl_svddc {
67
73
let mut work_size = [ Self :: zero( ) ] ;
68
74
unsafe {
69
75
$gesdd(
70
- jobz as u8 ,
71
- m,
72
- n,
73
- & mut a ,
74
- m,
75
- & mut s,
76
- u. as_mut( ) . map( |x| x. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ,
77
- m,
78
- vt. as_mut( ) . map( |x| x. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ,
79
- vt_row,
80
- & mut work_size,
81
- - 1 ,
82
- $( & mut $rwork_ident, ) *
83
- & mut iwork,
76
+ jobz. as_ptr ( ) ,
77
+ & m,
78
+ & n,
79
+ AsPtr :: as_mut_ptr ( a ) ,
80
+ & m,
81
+ AsPtr :: as_mut_ptr ( & mut s) ,
82
+ AsPtr :: as_mut_ptr ( u. as_mut( ) . map( |x| x. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ) ,
83
+ & m,
84
+ AsPtr :: as_mut_ptr ( vt. as_mut( ) . map( |x| x. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ) ,
85
+ & vt_row,
86
+ AsPtr :: as_mut_ptr ( & mut work_size) ,
87
+ & ( - 1 ) ,
88
+ $( AsPtr :: as_mut_ptr ( & mut $rwork_ident) , ) *
89
+ iwork. as_mut_ptr ( ) ,
84
90
& mut info,
85
91
) ;
86
92
}
87
93
info. as_lapack_result( ) ?;
88
94
89
95
// do svd
90
96
let lwork = work_size[ 0 ] . to_usize( ) . unwrap( ) ;
91
- let mut work = unsafe { vec_uninit( lwork) } ;
97
+ let mut work: Vec < Self > = unsafe { vec_uninit( lwork) } ;
92
98
unsafe {
93
99
$gesdd(
94
- jobz as u8 ,
95
- m,
96
- n,
97
- & mut a ,
98
- m,
99
- & mut s,
100
- u. as_mut( ) . map( |x| x. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ,
101
- m,
102
- vt. as_mut( ) . map( |x| x. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ,
103
- vt_row,
104
- & mut work,
105
- lwork as i32 ,
106
- $( & mut $rwork_ident, ) *
107
- & mut iwork,
100
+ jobz. as_ptr ( ) ,
101
+ & m,
102
+ & n,
103
+ AsPtr :: as_mut_ptr ( a ) ,
104
+ & m,
105
+ AsPtr :: as_mut_ptr ( & mut s) ,
106
+ AsPtr :: as_mut_ptr ( u. as_mut( ) . map( |x| x. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ) ,
107
+ & m,
108
+ AsPtr :: as_mut_ptr ( vt. as_mut( ) . map( |x| x. as_mut_slice( ) ) . unwrap_or( & mut [ ] ) ) ,
109
+ & vt_row,
110
+ AsPtr :: as_mut_ptr ( & mut work) ,
111
+ & ( lwork as i32 ) ,
112
+ $( AsPtr :: as_mut_ptr ( & mut $rwork_ident) , ) *
113
+ iwork. as_mut_ptr ( ) ,
108
114
& mut info,
109
115
) ;
110
116
}
@@ -119,7 +125,7 @@ macro_rules! impl_svddc {
119
125
} ;
120
126
}
121
127
122
- impl_svddc ! ( @real, f32 , lapack :: sgesdd ) ;
123
- impl_svddc ! ( @real, f64 , lapack :: dgesdd ) ;
124
- impl_svddc ! ( @complex, c32, lapack :: cgesdd ) ;
125
- impl_svddc ! ( @complex, c64, lapack :: zgesdd ) ;
128
+ impl_svddc ! ( @real, f32 , lapack_sys :: sgesdd_ ) ;
129
+ impl_svddc ! ( @real, f64 , lapack_sys :: dgesdd_ ) ;
130
+ impl_svddc ! ( @complex, c32, lapack_sys :: cgesdd_ ) ;
131
+ impl_svddc ! ( @complex, c64, lapack_sys :: zgesdd_ ) ;
0 commit comments