@@ -214,105 +214,3 @@ macro_rules! impl_eigh_generalized_work_r {
214214}
215215impl_eigh_generalized_work_r ! ( f64 , lapack_sys:: dsygv_) ;
216216impl_eigh_generalized_work_r ! ( f32 , lapack_sys:: ssygv_) ;
217-
218- #[ cfg_attr( doc, katexit:: katexit) ]
219- /// Eigenvalue problem for symmetric/hermite matrix
220- pub trait EighGeneralized_ : Scalar {
221- /// Compute generalized right eigenvalue and eigenvectors $Ax = \lambda B x$
222- ///
223- /// LAPACK correspondance
224- /// ----------------------
225- ///
226- /// | f32 | f64 | c32 | c64 |
227- /// |:------|:------|:------|:------|
228- /// | ssygv | dsygv | chegv | zhegv |
229- ///
230- fn eigh_generalized (
231- calc_eigenvec : bool ,
232- layout : MatrixLayout ,
233- uplo : UPLO ,
234- a : & mut [ Self ] ,
235- b : & mut [ Self ] ,
236- ) -> Result < Vec < Self :: Real > > ;
237- }
238-
239- macro_rules! impl_eigh {
240- ( @real, $scalar: ty, $evg: path) => {
241- impl_eigh!( @body, $scalar, $evg, ) ;
242- } ;
243- ( @complex, $scalar: ty, $evg: path) => {
244- impl_eigh!( @body, $scalar, $evg, rwork) ;
245- } ;
246- ( @body, $scalar: ty, $evg: path, $( $rwork_ident: ident) ,* ) => {
247- impl EighGeneralized_ for $scalar {
248- fn eigh_generalized(
249- calc_v: bool ,
250- layout: MatrixLayout ,
251- uplo: UPLO ,
252- a: & mut [ Self ] ,
253- b: & mut [ Self ] ,
254- ) -> Result <Vec <Self :: Real >> {
255- assert_eq!( layout. len( ) , layout. lda( ) ) ;
256- let n = layout. len( ) ;
257- let jobz = if calc_v { JobEv :: All } else { JobEv :: None } ;
258- let mut eigs: Vec <MaybeUninit <Self :: Real >> = vec_uninit( n as usize ) ;
259-
260- $(
261- let mut $rwork_ident: Vec <MaybeUninit <Self :: Real >> = vec_uninit( 3 * n as usize - 2 ) ;
262- ) *
263-
264- // calc work size
265- let mut info = 0 ;
266- let mut work_size = [ Self :: zero( ) ] ;
267- unsafe {
268- $evg(
269- & 1 , // ITYPE A*x = (lambda)*B*x
270- jobz. as_ptr( ) ,
271- uplo. as_ptr( ) ,
272- & n,
273- AsPtr :: as_mut_ptr( a) ,
274- & n,
275- AsPtr :: as_mut_ptr( b) ,
276- & n,
277- AsPtr :: as_mut_ptr( & mut eigs) ,
278- AsPtr :: as_mut_ptr( & mut work_size) ,
279- & ( -1 ) ,
280- $( AsPtr :: as_mut_ptr( & mut $rwork_ident) , ) *
281- & mut info,
282- ) ;
283- }
284- info. as_lapack_result( ) ?;
285-
286- // actual evg
287- let lwork = work_size[ 0 ] . to_usize( ) . unwrap( ) ;
288- let mut work: Vec <MaybeUninit <Self >> = vec_uninit( lwork) ;
289- let lwork = lwork as i32 ;
290- unsafe {
291- $evg(
292- & 1 , // ITYPE A*x = (lambda)*B*x
293- jobz. as_ptr( ) ,
294- uplo. as_ptr( ) ,
295- & n,
296- AsPtr :: as_mut_ptr( a) ,
297- & n,
298- AsPtr :: as_mut_ptr( b) ,
299- & n,
300- AsPtr :: as_mut_ptr( & mut eigs) ,
301- AsPtr :: as_mut_ptr( & mut work) ,
302- & lwork,
303- $( AsPtr :: as_mut_ptr( & mut $rwork_ident) , ) *
304- & mut info,
305- ) ;
306- }
307- info. as_lapack_result( ) ?;
308- let eigs = unsafe { eigs. assume_init( ) } ;
309- Ok ( eigs)
310- }
311- }
312- } ;
313- } // impl_eigh!
314-
315- impl_eigh ! ( @real, f64 , lapack_sys:: dsygv_) ;
316- impl_eigh ! ( @real, f32 , lapack_sys:: ssygv_) ;
317- impl_eigh ! ( @complex, c64, lapack_sys:: zhegv_) ;
318- impl_eigh ! ( @complex, c32, lapack_sys:: chegv_) ;
0 commit comments