@@ -3,36 +3,25 @@ use crate::{error::*, layout::MatrixLayout};
3
3
use cauchy:: * ;
4
4
use num_traits:: { ToPrimitive , Zero } ;
5
5
6
- /// Types of generalized eigenvalue problem
7
- #[ allow( dead_code) ] // FIXME create interface to use ABxlx and BAxlx
8
- #[ repr( i32 ) ]
9
- pub enum ITYPE {
10
- /// Solve $ A x = \lambda B x $
11
- AxlBx = 1 ,
12
- /// Solve $ A B x = \lambda x $
13
- ABxlx = 2 ,
14
- /// Solve $ B A x = \lambda x $
15
- BAxlx = 3 ,
16
- }
17
-
18
6
/// Generalized eigenvalue problem for Symmetric/Hermite matrices
19
- pub trait EighGeneralized : Sized {
20
- type Elem : Scalar ;
21
-
7
+ pub ( crate ) trait EighGeneralized : Scalar {
22
8
/// Allocate working memory
23
- fn eigh_generalized_work ( calc_eigenvec : bool , layout : MatrixLayout , uplo : UPLO )
24
- -> Result < Self > ;
9
+ fn eigh_generalized_work (
10
+ calc_eigenvec : bool ,
11
+ layout : MatrixLayout ,
12
+ uplo : UPLO ,
13
+ ) -> Result < EighGeneralizedWork < Self > > ;
25
14
26
15
/// Solve generalized eigenvalue problem
27
- fn eigh_generalized_calc (
28
- & mut self ,
29
- a : & mut [ Self :: Elem ] ,
30
- b : & mut [ Self :: Elem ] ,
31
- ) -> Result < & [ < Self :: Elem as Scalar > :: Real ] > ;
16
+ fn eigh_generalized_calc < ' work > (
17
+ work : & ' work mut EighGeneralizedWork < Self > ,
18
+ a : & mut [ Self ] ,
19
+ b : & mut [ Self ] ,
20
+ ) -> Result < & ' work [ Self :: Real ] > ;
32
21
}
33
22
34
23
/// Working memory for symmetric/Hermitian generalized eigenvalue problem.
35
- /// See [EighGeneralized trait](trait.EighGeneralized .html)
24
+ /// See [LapackStrict trait](trait.LapackStrict .html)
36
25
pub struct EighGeneralizedWork < T : Scalar > {
37
26
jobz : u8 ,
38
27
uplo : UPLO ,
@@ -46,21 +35,19 @@ pub struct EighGeneralizedWork<T: Scalar> {
46
35
47
36
macro_rules! impl_eigh_work_real {
48
37
( $scalar: ty, $ev: path) => {
49
- impl EighGeneralized for EighGeneralizedWork <$scalar> {
50
- type Elem = $scalar;
51
-
38
+ impl EighGeneralized for $scalar {
52
39
fn eigh_generalized_work(
53
40
calc_v: bool ,
54
41
layout: MatrixLayout ,
55
42
uplo: UPLO ,
56
- ) -> Result <Self > {
43
+ ) -> Result <EighGeneralizedWork < Self > > {
57
44
assert_eq!( layout. len( ) , layout. lda( ) ) ;
58
45
let n = layout. len( ) ;
59
46
let jobz = if calc_v { b'V' } else { b'N' } ;
60
47
let mut eigs = unsafe { vec_uninit( n as usize ) } ;
61
48
62
49
let mut info = 0 ;
63
- let mut work_size = [ Self :: Elem :: zero( ) ] ;
50
+ let mut work_size = [ Self :: zero( ) ] ;
64
51
unsafe {
65
52
$ev(
66
53
& [ ITYPE :: AxlBx as i32 ] ,
@@ -90,32 +77,32 @@ macro_rules! impl_eigh_work_real {
90
77
} )
91
78
}
92
79
93
- fn eigh_generalized_calc(
94
- & mut self ,
95
- a: & mut [ Self :: Elem ] ,
96
- b: & mut [ Self :: Elem ] ,
97
- ) -> Result <& [ < Self :: Elem as Scalar > :: Real ] > {
98
- assert_eq!( a. len( ) , ( self . n * self . n) as usize ) ;
80
+ fn eigh_generalized_calc< ' work> (
81
+ work : & ' work mut EighGeneralizedWork < Self > ,
82
+ a: & mut [ Self ] ,
83
+ b: & mut [ Self ] ,
84
+ ) -> Result <& ' work [ Self :: Real ] > {
85
+ assert_eq!( a. len( ) , ( work . n * work . n) as usize ) ;
99
86
let mut info = 0 ;
100
- let lwork = self . work. len( ) as i32 ;
87
+ let lwork = work . work. len( ) as i32 ;
101
88
unsafe {
102
89
$ev(
103
90
& [ ITYPE :: AxlBx as i32 ] ,
104
- self . jobz,
105
- self . uplo as u8 ,
106
- self . n,
91
+ work . jobz,
92
+ work . uplo as u8 ,
93
+ work . n,
107
94
a,
108
- self . n,
95
+ work . n,
109
96
b,
110
- self . n,
111
- & mut self . eigs,
112
- & mut self . work,
97
+ work . n,
98
+ & mut work . eigs,
99
+ & mut work . work,
113
100
lwork,
114
101
& mut info,
115
102
) ;
116
103
}
117
104
info. as_lapack_result( ) ?;
118
- Ok ( & self . eigs)
105
+ Ok ( & work . eigs)
119
106
}
120
107
}
121
108
} ;
@@ -126,14 +113,12 @@ impl_eigh_work_real!(f64, lapack::dsygv);
126
113
127
114
macro_rules! impl_eigh_work_complex {
128
115
( $scalar: ty, $ev: path) => {
129
- impl EighGeneralized for EighGeneralizedWork <$scalar> {
130
- type Elem = $scalar;
131
-
116
+ impl EighGeneralized for $scalar {
132
117
fn eigh_generalized_work(
133
118
calc_v: bool ,
134
119
layout: MatrixLayout ,
135
120
uplo: UPLO ,
136
- ) -> Result <Self > {
121
+ ) -> Result <EighGeneralizedWork < Self > > {
137
122
assert_eq!( layout. len( ) , layout. lda( ) ) ;
138
123
let n = layout. len( ) ;
139
124
let jobz = if calc_v { b'V' } else { b'N' } ;
@@ -142,7 +127,7 @@ macro_rules! impl_eigh_work_complex {
142
127
let mut eigs = unsafe { vec_uninit( n as usize ) } ;
143
128
144
129
let mut info = 0 ;
145
- let mut work_size = [ Self :: Elem :: zero( ) ] ;
130
+ let mut work_size = [ Self :: zero( ) ] ;
146
131
let mut rwork = unsafe { vec_uninit( 3 * n as usize - 2 ) } ;
147
132
unsafe {
148
133
$ev(
@@ -174,33 +159,33 @@ macro_rules! impl_eigh_work_complex {
174
159
} )
175
160
}
176
161
177
- fn eigh_generalized_calc(
178
- & mut self ,
179
- a: & mut [ Self :: Elem ] ,
180
- b: & mut [ Self :: Elem ] ,
181
- ) -> Result <& [ < Self :: Elem as Scalar > :: Real ] > {
182
- assert_eq!( a. len( ) , ( self . n * self . n) as usize ) ;
162
+ fn eigh_generalized_calc< ' work> (
163
+ work : & ' work mut EighGeneralizedWork < Self > ,
164
+ a: & mut [ Self ] ,
165
+ b: & mut [ Self ] ,
166
+ ) -> Result <& ' work [ Self :: Real ] > {
167
+ assert_eq!( a. len( ) , ( work . n * work . n) as usize ) ;
183
168
let mut info = 0 ;
184
- let lwork = self . work. len( ) as i32 ;
169
+ let lwork = work . work. len( ) as i32 ;
185
170
unsafe {
186
171
$ev(
187
172
& [ ITYPE :: AxlBx as i32 ] ,
188
- self . jobz,
189
- self . uplo as u8 ,
190
- self . n,
173
+ work . jobz,
174
+ work . uplo as u8 ,
175
+ work . n,
191
176
a,
192
- self . n,
177
+ work . n,
193
178
b,
194
- self . n,
195
- & mut self . eigs,
196
- & mut self . work,
179
+ work . n,
180
+ & mut work . eigs,
181
+ & mut work . work,
197
182
lwork,
198
- self . rwork. as_mut( ) . unwrap( ) ,
183
+ work . rwork. as_mut( ) . unwrap( ) ,
199
184
& mut info,
200
185
) ;
201
186
}
202
187
info. as_lapack_result( ) ?;
203
- Ok ( & self . eigs)
188
+ Ok ( & work . eigs)
204
189
}
205
190
}
206
191
} ;
0 commit comments