123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613 |
- package lapack64
- import (
- "gonum.org/v1/gonum/blas"
- "gonum.org/v1/gonum/blas/blas64"
- "gonum.org/v1/gonum/lapack"
- "gonum.org/v1/gonum/lapack/gonum"
- )
- var lapack64 lapack.Float64 = gonum.Implementation{}
- func Use(l lapack.Float64) {
- lapack64 = l
- }
- func max(a, b int) int {
- if a > b {
- return a
- }
- return b
- }
- func Potrf(a blas64.Symmetric) (t blas64.Triangular, ok bool) {
- ok = lapack64.Dpotrf(a.Uplo, a.N, a.Data, max(1, a.Stride))
- t.Uplo = a.Uplo
- t.N = a.N
- t.Data = a.Data
- t.Stride = a.Stride
- t.Diag = blas.NonUnit
- return
- }
- func Potri(t blas64.Triangular) (a blas64.Symmetric, ok bool) {
- ok = lapack64.Dpotri(t.Uplo, t.N, t.Data, max(1, t.Stride))
- a.Uplo = t.Uplo
- a.N = t.N
- a.Data = t.Data
- a.Stride = t.Stride
- return
- }
- func Potrs(t blas64.Triangular, b blas64.General) {
- lapack64.Dpotrs(t.Uplo, t.N, b.Cols, t.Data, max(1, t.Stride), b.Data, max(1, b.Stride))
- }
- func Pbtrf(a blas64.SymmetricBand) (t blas64.TriangularBand, ok bool) {
- ok = lapack64.Dpbtrf(a.Uplo, a.N, a.K, a.Data, max(1, a.Stride))
- t.Uplo = a.Uplo
- t.Diag = blas.NonUnit
- t.N = a.N
- t.K = a.K
- t.Data = a.Data
- t.Stride = a.Stride
- return t, ok
- }
- func Pbtrs(t blas64.TriangularBand, b blas64.General) {
- lapack64.Dpbtrs(t.Uplo, t.N, t.K, b.Cols, t.Data, max(1, t.Stride), b.Data, max(1, b.Stride))
- }
- func Gecon(norm lapack.MatrixNorm, a blas64.General, anorm float64, work []float64, iwork []int) float64 {
- return lapack64.Dgecon(norm, a.Cols, a.Data, max(1, a.Stride), anorm, work, iwork)
- }
- func Gels(trans blas.Transpose, a blas64.General, b blas64.General, work []float64, lwork int) bool {
- return lapack64.Dgels(trans, a.Rows, a.Cols, b.Cols, a.Data, max(1, a.Stride), b.Data, max(1, b.Stride), work, lwork)
- }
- func Geqrf(a blas64.General, tau, work []float64, lwork int) {
- lapack64.Dgeqrf(a.Rows, a.Cols, a.Data, max(1, a.Stride), tau, work, lwork)
- }
- func Gelqf(a blas64.General, tau, work []float64, lwork int) {
- lapack64.Dgelqf(a.Rows, a.Cols, a.Data, max(1, a.Stride), tau, work, lwork)
- }
- func Gesvd(jobU, jobVT lapack.SVDJob, a, u, vt blas64.General, s, work []float64, lwork int) (ok bool) {
- return lapack64.Dgesvd(jobU, jobVT, a.Rows, a.Cols, a.Data, max(1, a.Stride), s, u.Data, max(1, u.Stride), vt.Data, max(1, vt.Stride), work, lwork)
- }
- func Getrf(a blas64.General, ipiv []int) bool {
- return lapack64.Dgetrf(a.Rows, a.Cols, a.Data, max(1, a.Stride), ipiv)
- }
- func Getri(a blas64.General, ipiv []int, work []float64, lwork int) (ok bool) {
- return lapack64.Dgetri(a.Cols, a.Data, max(1, a.Stride), ipiv, work, lwork)
- }
- func Getrs(trans blas.Transpose, a blas64.General, b blas64.General, ipiv []int) {
- lapack64.Dgetrs(trans, a.Cols, b.Cols, a.Data, max(1, a.Stride), ipiv, b.Data, max(1, b.Stride))
- }
- func Ggsvd3(jobU, jobV, jobQ lapack.GSVDJob, a, b blas64.General, alpha, beta []float64, u, v, q blas64.General, work []float64, lwork int, iwork []int) (k, l int, ok bool) {
- return lapack64.Dggsvd3(jobU, jobV, jobQ, a.Rows, a.Cols, b.Rows, a.Data, max(1, a.Stride), b.Data, max(1, b.Stride), alpha, beta, u.Data, max(1, u.Stride), v.Data, max(1, v.Stride), q.Data, max(1, q.Stride), work, lwork, iwork)
- }
- func Lange(norm lapack.MatrixNorm, a blas64.General, work []float64) float64 {
- return lapack64.Dlange(norm, a.Rows, a.Cols, a.Data, max(1, a.Stride), work)
- }
- func Lansy(norm lapack.MatrixNorm, a blas64.Symmetric, work []float64) float64 {
- return lapack64.Dlansy(norm, a.Uplo, a.N, a.Data, max(1, a.Stride), work)
- }
- func Lantr(norm lapack.MatrixNorm, a blas64.Triangular, work []float64) float64 {
- return lapack64.Dlantr(norm, a.Uplo, a.Diag, a.N, a.N, a.Data, max(1, a.Stride), work)
- }
- func Lapmt(forward bool, x blas64.General, k []int) {
- lapack64.Dlapmt(forward, x.Rows, x.Cols, x.Data, max(1, x.Stride), k)
- }
- func Ormlq(side blas.Side, trans blas.Transpose, a blas64.General, tau []float64, c blas64.General, work []float64, lwork int) {
- lapack64.Dormlq(side, trans, c.Rows, c.Cols, a.Rows, a.Data, max(1, a.Stride), tau, c.Data, max(1, c.Stride), work, lwork)
- }
- func Ormqr(side blas.Side, trans blas.Transpose, a blas64.General, tau []float64, c blas64.General, work []float64, lwork int) {
- lapack64.Dormqr(side, trans, c.Rows, c.Cols, a.Cols, a.Data, max(1, a.Stride), tau, c.Data, max(1, c.Stride), work, lwork)
- }
- func Pocon(a blas64.Symmetric, anorm float64, work []float64, iwork []int) float64 {
- return lapack64.Dpocon(a.Uplo, a.N, a.Data, max(1, a.Stride), anorm, work, iwork)
- }
- func Syev(jobz lapack.EVJob, a blas64.Symmetric, w, work []float64, lwork int) (ok bool) {
- return lapack64.Dsyev(jobz, a.Uplo, a.N, a.Data, max(1, a.Stride), w, work, lwork)
- }
- func Trcon(norm lapack.MatrixNorm, a blas64.Triangular, work []float64, iwork []int) float64 {
- return lapack64.Dtrcon(norm, a.Uplo, a.Diag, a.N, a.Data, max(1, a.Stride), work, iwork)
- }
- func Trtri(a blas64.Triangular) (ok bool) {
- return lapack64.Dtrtri(a.Uplo, a.Diag, a.N, a.Data, max(1, a.Stride))
- }
- func Trtrs(trans blas.Transpose, a blas64.Triangular, b blas64.General) (ok bool) {
- return lapack64.Dtrtrs(a.Uplo, trans, a.Diag, a.N, b.Cols, a.Data, max(1, a.Stride), b.Data, max(1, b.Stride))
- }
- func Geev(jobvl lapack.LeftEVJob, jobvr lapack.RightEVJob, a blas64.General, wr, wi []float64, vl, vr blas64.General, work []float64, lwork int) (first int) {
- n := a.Rows
- if a.Cols != n {
- panic("lapack64: matrix not square")
- }
- if jobvl == lapack.LeftEVCompute && (vl.Rows != n || vl.Cols != n) {
- panic("lapack64: bad size of VL")
- }
- if jobvr == lapack.RightEVCompute && (vr.Rows != n || vr.Cols != n) {
- panic("lapack64: bad size of VR")
- }
- return lapack64.Dgeev(jobvl, jobvr, n, a.Data, max(1, a.Stride), wr, wi, vl.Data, max(1, vl.Stride), vr.Data, max(1, vr.Stride), work, lwork)
- }
|