@@ -28,25 +28,6 @@ pub trait LeastSquaresSvdDivideConquer_: Scalar {
28
28
) -> Result < LeastSquaresOutput < Self > > ;
29
29
}
30
30
31
- /// Eval iwork size
32
- ///
33
- /// - NLVL = INT( LOG_2( MIN( M, N ) / ( SMLSIZ + 1 ) ) ) + 1
34
- /// - LIWORK = 3 * MIN( M, N ) * NLVL + 11 * MIN( M, N )
35
- ///
36
- /// where SMLSIZ is returned by ILAENV and is equal to the maximum size of the subproblems
37
- /// at the bottom of the computation tree (usually about 25).
38
- ///
39
- /// We put SMLSIZ=0 to estimate NLVL as large as possible
40
- /// because its size will usually very small.
41
- fn iwork_size ( m : i32 , n : i32 ) -> usize {
42
- let mn = m. min ( n) as usize ;
43
- let nlvl = ( mn. to_f32 ( ) . unwrap ( ) . log2 ( ) + 1.0 )
44
- . max ( 0.0 )
45
- . to_usize ( )
46
- . unwrap ( ) ;
47
- ( 3 * mn * nlvl + 11 * mn) . max ( 1 )
48
- }
49
-
50
31
macro_rules! impl_least_squares_real {
51
32
( $scalar: ty, $gelsd: path) => {
52
33
impl LeastSquaresSvdDivideConquer_ for $scalar {
@@ -65,11 +46,10 @@ macro_rules! impl_least_squares_real {
65
46
let mut singular_values: Vec <Self :: Real > = vec![ Self :: Real :: zero( ) ; k as usize ] ;
66
47
let mut rank: i32 = 0 ;
67
48
68
- let mut iwork = vec![ 0 ; iwork_size( m, n) ] ;
69
-
70
49
// eval work size
71
50
let mut info = 0 ;
72
51
let mut work_size = [ Self :: zero( ) ] ;
52
+ let mut iwork_size = [ 0 ] ;
73
53
$gelsd(
74
54
m,
75
55
n,
@@ -83,14 +63,16 @@ macro_rules! impl_least_squares_real {
83
63
& mut rank,
84
64
& mut work_size,
85
65
-1 ,
86
- & mut iwork ,
66
+ & mut iwork_size ,
87
67
& mut info,
88
68
) ;
89
69
info. as_lapack_result( ) ?;
90
70
91
71
// calc
92
72
let lwork = work_size[ 0 ] . to_usize( ) . unwrap( ) ;
93
73
let mut work = vec![ Self :: zero( ) ; lwork] ;
74
+ let liwork = iwork_size[ 0 ] . to_usize( ) . unwrap( ) ;
75
+ let mut iwork = vec![ 0 ; liwork] ;
94
76
$gelsd(
95
77
m,
96
78
n,
@@ -135,11 +117,10 @@ macro_rules! impl_least_squares_real {
135
117
let mut singular_values: Vec <Self :: Real > = vec![ Self :: Real :: zero( ) ; k as usize ] ;
136
118
let mut rank: i32 = 0 ;
137
119
138
- let mut iwork = vec![ 0 ; iwork_size( m, n) ] ;
139
-
140
120
// eval work size
141
121
let mut info = 0 ;
142
122
let mut work_size = [ Self :: zero( ) ] ;
123
+ let mut iwork_size = [ 0 ] ;
143
124
$gelsd(
144
125
m,
145
126
n,
@@ -153,14 +134,16 @@ macro_rules! impl_least_squares_real {
153
134
& mut rank,
154
135
& mut work_size,
155
136
-1 ,
156
- & mut iwork ,
137
+ & mut iwork_size ,
157
138
& mut info,
158
139
) ;
159
140
info. as_lapack_result( ) ?;
160
141
161
142
// calc
162
143
let lwork = work_size[ 0 ] . to_usize( ) . unwrap( ) ;
163
144
let mut work = vec![ Self :: zero( ) ; lwork] ;
145
+ let liwork = iwork_size[ 0 ] . to_usize( ) . unwrap( ) ;
146
+ let mut iwork = vec![ 0 ; liwork] ;
164
147
$gelsd(
165
148
m,
166
149
n,
0 commit comments