Skip to content

Commit d155a1b

Browse files
committed
Add dgeev_ implementation
1 parent 9d2f8a4 commit d155a1b

File tree

1 file changed

+32
-2
lines changed

1 file changed

+32
-2
lines changed

Sources/Matft/library/lapack.swift

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -758,8 +758,26 @@ private func clapack_dgetri_(
758758
_ info: UnsafeMutablePointer<CLong>
759759
) -> Void
760760

761+
@_silgen_name("dgeev_")
762+
private func clapack_dgeev_(
763+
_ jobvl: UnsafeMutablePointer<CChar>,
764+
_ jobvr: UnsafeMutablePointer<CChar>,
765+
_ n: UnsafeMutablePointer<CLong>,
766+
_ a: UnsafeMutablePointer<Double>,
767+
_ lda: UnsafeMutablePointer<CLong>,
768+
_ wr: UnsafeMutablePointer<Double>,
769+
_ wi: UnsafeMutablePointer<Double>,
770+
_ vl: UnsafeMutablePointer<Double>,
771+
_ ldvl: UnsafeMutablePointer<CLong>,
772+
_ vr: UnsafeMutablePointer<Double>,
773+
_ ldvr: UnsafeMutablePointer<CLong>,
774+
_ work: UnsafeMutablePointer<Double>,
775+
_ lwork: UnsafeMutablePointer<CLong>,
776+
_ info: UnsafeMutablePointer<CLong>
777+
) -> Void
778+
761779
// MARK: - CLAPACK Wrapper Functions for WASI
762-
// Only dgetrf_ and dgetri_ are available in the CLAPACK eigen-support branch
780+
// dgetrf_, dgetri_, and dgeev_ are available in the CLAPACK eigen-support branch
763781

764782
@inline(__always)
765783
internal func sgesv_(_ n: UnsafeMutablePointer<__CLPK_integer>, _ nrhs: UnsafeMutablePointer<__CLPK_integer>, _ a: UnsafeMutablePointer<Float>, _ lda: UnsafeMutablePointer<__CLPK_integer>, _ ipiv: UnsafeMutablePointer<__CLPK_integer>, _ b: UnsafeMutablePointer<Float>, _ ldb: UnsafeMutablePointer<__CLPK_integer>, _ info: UnsafeMutablePointer<__CLPK_integer>) -> Int32 {
@@ -825,7 +843,19 @@ internal func sgeev_(_ jobvl: UnsafeMutablePointer<Int8>, _ jobvr: UnsafeMutable
825843

826844
@inline(__always)
827845
internal func dgeev_(_ jobvl: UnsafeMutablePointer<Int8>, _ jobvr: UnsafeMutablePointer<Int8>, _ n: UnsafeMutablePointer<__CLPK_integer>, _ a: UnsafeMutablePointer<Double>, _ lda: UnsafeMutablePointer<__CLPK_integer>, _ wr: UnsafeMutablePointer<Double>, _ wi: UnsafeMutablePointer<Double>, _ vl: UnsafeMutablePointer<Double>, _ ldvl: UnsafeMutablePointer<__CLPK_integer>, _ vr: UnsafeMutablePointer<Double>, _ ldvr: UnsafeMutablePointer<__CLPK_integer>, _ work: UnsafeMutablePointer<Double>, _ lwork: UnsafeMutablePointer<__CLPK_integer>, _ info: UnsafeMutablePointer<__CLPK_integer>) -> Int32 {
828-
fatalError("LAPACK dgeev_ is not available on WASI (double-precision eigenvalue decomposition not supported)")
846+
// Convert Int32 parameters to CLong for CLAPACK
847+
var nLong = CLong(n.pointee)
848+
var ldaLong = CLong(lda.pointee)
849+
var ldvlLong = CLong(ldvl.pointee)
850+
var ldvrLong = CLong(ldvr.pointee)
851+
var lworkLong = CLong(lwork.pointee)
852+
var infoLong: CLong = 0
853+
854+
// Use correctly-typed function to avoid ABI mismatch (CLAPACK returns void, not int)
855+
clapack_dgeev_(jobvl, jobvr, &nLong, a, &ldaLong, wr, wi, vl, &ldvlLong, vr, &ldvrLong, work, &lworkLong, &infoLong)
856+
857+
info.pointee = __CLPK_integer(infoLong)
858+
return Int32(infoLong)
829859
}
830860

831861
@inline(__always)

0 commit comments

Comments
 (0)