Skip to content

Commit bef1083

Browse files
committed
Merge EighGeneralized_ to Lapack trait
1 parent c7a4586 commit bef1083

File tree

2 files changed

+21
-103
lines changed

2 files changed

+21
-103
lines changed

lax/src/eigh_generalized.rs

Lines changed: 0 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -214,105 +214,3 @@ macro_rules! impl_eigh_generalized_work_r {
214214
}
215215
impl_eigh_generalized_work_r!(f64, lapack_sys::dsygv_);
216216
impl_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_);

lax/src/lib.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,6 @@ pub trait Lapack:
131131
+ Solve_
132132
+ Solveh_
133133
+ Cholesky_
134-
+ EighGeneralized_
135134
+ Triangular_
136135
+ Tridiagonal_
137136
+ Rcond_
@@ -151,6 +150,15 @@ pub trait Lapack:
151150
uplo: UPLO,
152151
a: &mut [Self],
153152
) -> Result<Vec<Self::Real>>;
153+
154+
/// Compute right eigenvalue and eigenvectors for a symmetric or hermite matrix
155+
fn eigh_generalized(
156+
calc_eigenvec: bool,
157+
layout: MatrixLayout,
158+
uplo: UPLO,
159+
a: &mut [Self],
160+
b: &mut [Self],
161+
) -> Result<Vec<Self::Real>>;
154162
}
155163

156164
macro_rules! impl_lapack {
@@ -177,6 +185,18 @@ macro_rules! impl_lapack {
177185
let work = EighWork::<$s>::new(calc_eigenvec, layout)?;
178186
work.eval(uplo, a)
179187
}
188+
189+
fn eigh_generalized(
190+
calc_eigenvec: bool,
191+
layout: MatrixLayout,
192+
uplo: UPLO,
193+
a: &mut [Self],
194+
b: &mut [Self],
195+
) -> Result<Vec<Self::Real>> {
196+
use eigh_generalized::*;
197+
let work = EighGeneralizedWork::<$s>::new(calc_eigenvec, layout)?;
198+
work.eval(uplo, a, b)
199+
}
180200
}
181201
};
182202
}

0 commit comments

Comments
 (0)