@@ -21,33 +21,16 @@ pub trait Eigh_: Scalar {
2121 uplo : UPLO ,
2222 a : & mut [ Self ] ,
2323 ) -> Result < Vec < Self :: Real > > ;
24-
25- /// Compute generalized right eigenvalue and eigenvectors $Ax = \lambda B x$
26- ///
27- /// LAPACK correspondance
28- /// ----------------------
29- ///
30- /// | f32 | f64 | c32 | c64 |
31- /// |:------|:------|:------|:------|
32- /// | ssygv | dsygv | chegv | zhegv |
33- ///
34- fn eigh_generalized (
35- calc_eigenvec : bool ,
36- layout : MatrixLayout ,
37- uplo : UPLO ,
38- a : & mut [ Self ] ,
39- b : & mut [ Self ] ,
40- ) -> Result < Vec < Self :: Real > > ;
4124}
4225
4326macro_rules! impl_eigh {
44- ( @real, $scalar: ty, $ev: path, $evg : path ) => {
45- impl_eigh!( @body, $scalar, $ev, $evg , ) ;
27+ ( @real, $scalar: ty, $ev: path) => {
28+ impl_eigh!( @body, $scalar, $ev, ) ;
4629 } ;
47- ( @complex, $scalar: ty, $ev: path, $evg : path ) => {
48- impl_eigh!( @body, $scalar, $ev, $evg , rwork) ;
30+ ( @complex, $scalar: ty, $ev: path) => {
31+ impl_eigh!( @body, $scalar, $ev, rwork) ;
4932 } ;
50- ( @body, $scalar: ty, $ev: path, $evg : path , $ ( $rwork_ident: ident) ,* ) => {
33+ ( @body, $scalar: ty, $ev: path, $( $rwork_ident: ident) ,* ) => {
5134 impl Eigh_ for $scalar {
5235 fn eigh(
5336 calc_v: bool ,
@@ -106,75 +89,11 @@ macro_rules! impl_eigh {
10689 let eigs = unsafe { eigs. assume_init( ) } ;
10790 Ok ( eigs)
10891 }
109-
110- fn eigh_generalized(
111- calc_v: bool ,
112- layout: MatrixLayout ,
113- uplo: UPLO ,
114- a: & mut [ Self ] ,
115- b: & mut [ Self ] ,
116- ) -> Result <Vec <Self :: Real >> {
117- assert_eq!( layout. len( ) , layout. lda( ) ) ;
118- let n = layout. len( ) ;
119- let jobz = if calc_v { JobEv :: All } else { JobEv :: None } ;
120- let mut eigs: Vec <MaybeUninit <Self :: Real >> = vec_uninit( n as usize ) ;
121-
122- $(
123- let mut $rwork_ident: Vec <MaybeUninit <Self :: Real >> = vec_uninit( 3 * n as usize - 2 ) ;
124- ) *
125-
126- // calc work size
127- let mut info = 0 ;
128- let mut work_size = [ Self :: zero( ) ] ;
129- unsafe {
130- $evg(
131- & 1 , // ITYPE A*x = (lambda)*B*x
132- jobz. as_ptr( ) ,
133- uplo. as_ptr( ) ,
134- & n,
135- AsPtr :: as_mut_ptr( a) ,
136- & n,
137- AsPtr :: as_mut_ptr( b) ,
138- & n,
139- AsPtr :: as_mut_ptr( & mut eigs) ,
140- AsPtr :: as_mut_ptr( & mut work_size) ,
141- & ( -1 ) ,
142- $( AsPtr :: as_mut_ptr( & mut $rwork_ident) , ) *
143- & mut info,
144- ) ;
145- }
146- info. as_lapack_result( ) ?;
147-
148- // actual evg
149- let lwork = work_size[ 0 ] . to_usize( ) . unwrap( ) ;
150- let mut work: Vec <MaybeUninit <Self >> = vec_uninit( lwork) ;
151- let lwork = lwork as i32 ;
152- unsafe {
153- $evg(
154- & 1 , // ITYPE A*x = (lambda)*B*x
155- jobz. as_ptr( ) ,
156- uplo. as_ptr( ) ,
157- & n,
158- AsPtr :: as_mut_ptr( a) ,
159- & n,
160- AsPtr :: as_mut_ptr( b) ,
161- & n,
162- AsPtr :: as_mut_ptr( & mut eigs) ,
163- AsPtr :: as_mut_ptr( & mut work) ,
164- & lwork,
165- $( AsPtr :: as_mut_ptr( & mut $rwork_ident) , ) *
166- & mut info,
167- ) ;
168- }
169- info. as_lapack_result( ) ?;
170- let eigs = unsafe { eigs. assume_init( ) } ;
171- Ok ( eigs)
172- }
17392 }
17493 } ;
17594} // impl_eigh!
17695
177- impl_eigh ! ( @real, f64 , lapack_sys:: dsyev_, lapack_sys :: dsygv_ ) ;
178- impl_eigh ! ( @real, f32 , lapack_sys:: ssyev_, lapack_sys :: ssygv_ ) ;
179- impl_eigh ! ( @complex, c64, lapack_sys:: zheev_, lapack_sys :: zhegv_ ) ;
180- impl_eigh ! ( @complex, c32, lapack_sys:: cheev_, lapack_sys :: chegv_ ) ;
96+ impl_eigh ! ( @real, f64 , lapack_sys:: dsyev_) ;
97+ impl_eigh ! ( @real, f32 , lapack_sys:: ssyev_) ;
98+ impl_eigh ! ( @complex, c64, lapack_sys:: zheev_) ;
99+ impl_eigh ! ( @complex, c32, lapack_sys:: cheev_) ;
0 commit comments