mirror of
https://github.com/gonum/gonum.git
synced 2025-10-23 15:13:31 +08:00
initial goblas commit
This commit is contained in:
9
goblas/blasops.go
Normal file
9
goblas/blasops.go
Normal file
@@ -0,0 +1,9 @@
|
||||
package goblas
|
||||
|
||||
import "github.com/gonum/blas"
|
||||
|
||||
type Blas struct{}
|
||||
|
||||
var (
|
||||
_ blas.Float64 = Blas{}
|
||||
)
|
7
goblas/dasum.go
Normal file
7
goblas/dasum.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package goblas
|
||||
|
||||
import "github.com/ziutek/blas"
|
||||
|
||||
func (Blas) Dasum(N int, X []float64, incX int) float64 {
|
||||
return blas.Dasum(N, X, incX)
|
||||
}
|
7
goblas/daxpy.go
Normal file
7
goblas/daxpy.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package goblas
|
||||
|
||||
import "github.com/ziutek/blas"
|
||||
|
||||
func (Blas) Daxpy(N int, alpha float64, X []float64, incX int, Y []float64, incY int) {
|
||||
blas.Daxpy(N, alpha, X, incX, Y, incY)
|
||||
}
|
7
goblas/dcopy.go
Normal file
7
goblas/dcopy.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package goblas
|
||||
|
||||
import "github.com/ziutek/blas"
|
||||
|
||||
func (Blas) Dcopy(N int, X []float64, incX int, Y []float64, incY int) {
|
||||
blas.Dcopy(N, X, incX, Y, incY)
|
||||
}
|
7
goblas/ddot.go
Normal file
7
goblas/ddot.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package goblas
|
||||
|
||||
import "github.com/ziutek/blas"
|
||||
|
||||
func (Blas) Ddot(N int, X []float64, incX int, Y []float64, incY int) float64 {
|
||||
return blas.Ddot(N, X, incX, Y, incY)
|
||||
}
|
45
goblas/dgemm.go
Normal file
45
goblas/dgemm.go
Normal file
@@ -0,0 +1,45 @@
|
||||
package goblas
|
||||
|
||||
import "github.com/gonum/blas"
|
||||
import level1 "github.com/ziutek/blas"
|
||||
|
||||
func (Blas) Dgemm(o blas.Order, tA, tB blas.Transpose, m int, n int, k int,
|
||||
alpha float64, a []float64, lda int, b []float64, ldb int,
|
||||
beta float64, c []float64, ldc int) {
|
||||
|
||||
var inner, outer, veclen int
|
||||
if o == blas.ColMajor {
|
||||
outer = n
|
||||
veclen = m
|
||||
} else {
|
||||
veclen = n
|
||||
outer = m
|
||||
a, b = b, a
|
||||
ldb, lda = lda, ldb
|
||||
tA, tB = tB, tA
|
||||
}
|
||||
inner = k
|
||||
|
||||
for j := 0; j < outer; j++ {
|
||||
cj := c[j*ldc:]
|
||||
if beta != 1 {
|
||||
level1.Dscal(veclen, beta, cj, 1)
|
||||
}
|
||||
|
||||
for l := 0; l < inner; l++ {
|
||||
al := a[l*lda:]
|
||||
if tA == blas.Trans {
|
||||
al = a[l:]
|
||||
}
|
||||
blj := b[j*ldb+l]
|
||||
if tB == blas.Trans {
|
||||
blj = b[l*ldb+j]
|
||||
}
|
||||
if tA == blas.NoTrans {
|
||||
level1.Daxpy(veclen, blj*alpha, al, 1, cj, 1)
|
||||
} else {
|
||||
level1.Daxpy(veclen, blj*alpha, al, lda, cj, 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
22
goblas/dgemv.go
Normal file
22
goblas/dgemv.go
Normal file
@@ -0,0 +1,22 @@
|
||||
package goblas
|
||||
|
||||
import "github.com/gonum/blas"
|
||||
import level1 "github.com/ziutek/blas"
|
||||
|
||||
// Performs: y = alpha * A * x + beta * y or y = alpha * A^T * x + beta * y
|
||||
func (Blas) Dgemv(o blas.Order, tA blas.Transpose, m, n int, alpha float64, a []float64,
|
||||
lda int, x []float64, incX int, beta float64, y []float64, incY int) {
|
||||
|
||||
Blas{}.Dscal(m, beta, y, incY)
|
||||
if (o == blas.ColMajor && tA == blas.NoTrans) ||
|
||||
(o == blas.RowMajor && tA == blas.Trans) {
|
||||
for c := 0; c < n; c++ {
|
||||
level1.Daxpy(m, alpha*x[incX*c], a[c*lda:], 1, y, incY)
|
||||
}
|
||||
} else {
|
||||
for r := 0; r < m; r++ {
|
||||
y[r*incY] += alpha * level1.Ddot(n, a[r*lda:], 1, x, incX)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
7
goblas/dnrm2.go
Normal file
7
goblas/dnrm2.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package goblas
|
||||
|
||||
import "github.com/ziutek/blas"
|
||||
|
||||
func (Blas) Dnrm2(N int, X []float64, incX int) float64 {
|
||||
return blas.Dnrm2(N, X, incX)
|
||||
}
|
2
goblas/doc.go
Normal file
2
goblas/doc.go
Normal file
@@ -0,0 +1,2 @@
|
||||
// Go implementation of BLAS (Basic Linear Algebra Subprograms)
|
||||
package goblas
|
7
goblas/drot.go
Normal file
7
goblas/drot.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package goblas
|
||||
|
||||
import "github.com/ziutek/blas"
|
||||
|
||||
func (Blas) Drot(N int, X []float64, incX int, Y []float64, incY int, c, s float64) {
|
||||
blas.Drot(N, X, incX, Y, incY, c, s)
|
||||
}
|
7
goblas/drotg.go
Normal file
7
goblas/drotg.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package goblas
|
||||
|
||||
import "github.com/ziutek/blas"
|
||||
|
||||
func (Blas) Drotg(a, b float64) (c, s, r, z float64) {
|
||||
return blas.Drotg(a, b)
|
||||
}
|
103
goblas/drotmg.go
Normal file
103
goblas/drotmg.go
Normal file
@@ -0,0 +1,103 @@
|
||||
package goblas
|
||||
|
||||
import "math"
|
||||
|
||||
import "github.com/gonum/blas"
|
||||
|
||||
// Compute a modified Givens transformation
|
||||
func (Blas) Drotmg(d1, d2, x1, y1 float64) (p *blas.DrotmParams, rd1, rd2, rx1 float64) {
|
||||
var p1, p2, q1, q2, u float64
|
||||
|
||||
gam := 4096.0
|
||||
gamsq := 16777216.0
|
||||
rgamsq := 5.9604645e-8
|
||||
|
||||
rd1 = d1
|
||||
rd2 = d2
|
||||
rx1 = x1
|
||||
|
||||
if d1 < 0 {
|
||||
p.Flag = -1
|
||||
} else {
|
||||
p2 = rd2 * y1
|
||||
if p2 == 0 {
|
||||
p.Flag = -2
|
||||
return
|
||||
}
|
||||
p1 = rd1 * x1
|
||||
q2 = p2 * y1
|
||||
q1 = p1 * x1
|
||||
if math.Abs(q1) > math.Abs(q2) {
|
||||
p.H[1] = -y1 / x1
|
||||
p.H[2] = p2 / p1
|
||||
u = 1 - p.H[2]*p.H[1]
|
||||
if u > 0 {
|
||||
p.Flag = 0
|
||||
rd1 /= u
|
||||
rd2 /= u
|
||||
rx1 /= u
|
||||
}
|
||||
} else {
|
||||
if q2 < 0 {
|
||||
p.Flag = -1
|
||||
rd1 = 0
|
||||
rd2 = 0
|
||||
rx1 = 0
|
||||
} else {
|
||||
p.Flag = 1
|
||||
p.H[0] = p1 / p2
|
||||
p.H[3] = x1 / y1
|
||||
u = 1 + p.H[0] + p.H[3]
|
||||
rd1, rd2 = rd2/u, rd1/u
|
||||
rx1 = y1 / u
|
||||
}
|
||||
}
|
||||
if rd1 != 0 {
|
||||
for rd1 <= rgamsq || rd1 >= gamsq {
|
||||
if p.Flag == 0 {
|
||||
p.H[0] = 1
|
||||
p.H[3] = 1
|
||||
p.Flag = -1
|
||||
} else {
|
||||
p.H[1] = -1
|
||||
p.H[2] = 1
|
||||
p.Flag = -1
|
||||
}
|
||||
if rd1 <= rgamsq {
|
||||
rd1 *= gam * gam
|
||||
rx1 /= gam
|
||||
p.H[0] /= gam
|
||||
p.H[2] /= gam
|
||||
} else {
|
||||
rd1 /= gam * gam
|
||||
rx1 *= gam
|
||||
p.H[0] *= gam
|
||||
p.H[2] *= gam
|
||||
}
|
||||
}
|
||||
}
|
||||
if rd2 != 0 {
|
||||
for math.Abs(rd2) <= rgamsq || math.Abs(rd2) >= gamsq {
|
||||
if p.Flag == 0 {
|
||||
p.H[0] = 1
|
||||
p.H[3] = 1
|
||||
p.Flag = -1
|
||||
} else {
|
||||
p.H[1] = -1
|
||||
p.H[2] = 1
|
||||
p.Flag = -1
|
||||
}
|
||||
if math.Abs(rd2) <= rgamsq {
|
||||
rd2 *= gam * gam
|
||||
p.H[1] /= gam
|
||||
p.H[3] /= gam
|
||||
} else {
|
||||
rd2 /= gam * gam
|
||||
p.H[1] *= gam
|
||||
p.H[3] *= gam
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
7
goblas/dscal.go
Normal file
7
goblas/dscal.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package goblas
|
||||
|
||||
import "github.com/ziutek/blas"
|
||||
|
||||
func (Blas) Dscal(N int, alpha float64, X []float64, incX int) {
|
||||
blas.Dscal(N, alpha, X, incX)
|
||||
}
|
7
goblas/dswap.go
Normal file
7
goblas/dswap.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package goblas
|
||||
|
||||
import "github.com/ziutek/blas"
|
||||
|
||||
func (Blas) Dswap(N int, X []float64, incX int, Y []float64, incY int) {
|
||||
blas.Dswap(N, X, incX, Y, incY)
|
||||
}
|
7
goblas/idamax.go
Normal file
7
goblas/idamax.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package goblas
|
||||
|
||||
import "github.com/ziutek/blas"
|
||||
|
||||
func (Blas) Idamax(N int, X []float64, incX int) int {
|
||||
return blas.Idamax(N, X, incX)
|
||||
}
|
49
goblas/stubs.go
Normal file
49
goblas/stubs.go
Normal file
@@ -0,0 +1,49 @@
|
||||
package goblas
|
||||
|
||||
import "github.com/gonum/blas"
|
||||
|
||||
func (Blas) Drotm(n int, x []float64, incX int, y []float64, incY int, p *blas.DrotmParams) {
|
||||
}
|
||||
|
||||
func (Blas) Dgbmv(o blas.Order, tA blas.Transpose, m, n, kL, kU int, alpha float64, a []float64, lda int, x []float64, incX int, beta float64, y []float64, incY int) {
|
||||
}
|
||||
func (Blas) Dtrmv(o blas.Order, ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, a []float64, lda int, x []float64, incX int) {
|
||||
}
|
||||
func (Blas) Dtbmv(o blas.Order, ul blas.Uplo, tA blas.Transpose, d blas.Diag, n, k int, a []float64, lda int, x []float64, incX int) {
|
||||
}
|
||||
func (Blas) Dtpmv(o blas.Order, ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, ap []float64, x []float64, incX int) {
|
||||
}
|
||||
func (Blas) Dtrsv(o blas.Order, ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, a []float64, lda int, x []float64, incX int) {
|
||||
}
|
||||
func (Blas) Dtbsv(o blas.Order, ul blas.Uplo, tA blas.Transpose, d blas.Diag, n, k int, a []float64, lda int, x []float64, incX int) {
|
||||
}
|
||||
func (Blas) Dtpsv(o blas.Order, ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, ap []float64, x []float64, incX int) {
|
||||
}
|
||||
func (Blas) Dsymv(o blas.Order, ul blas.Uplo, n int, alpha float64, a []float64, lda int, x []float64, incX int, beta float64, y []float64, incY int) {
|
||||
}
|
||||
func (Blas) Dsbmv(o blas.Order, ul blas.Uplo, n, k int, alpha float64, a []float64, lda int, x []float64, incX int, beta float64, y []float64, incY int) {
|
||||
}
|
||||
func (Blas) Dspmv(o blas.Order, ul blas.Uplo, n int, alpha float64, ap []float64, x []float64, incX int, beta float64, y []float64, incY int) {
|
||||
}
|
||||
func (Blas) Dger(o blas.Order, m, n int, alpha float64, x []float64, incX int, y []float64, incY int, a []float64, lda int) {
|
||||
}
|
||||
func (Blas) Dsyr(o blas.Order, ul blas.Uplo, n int, alpha float64, x []float64, incX int, a []float64, lda int) {
|
||||
}
|
||||
func (Blas) Dspr(o blas.Order, ul blas.Uplo, n int, alpha float64, x []float64, incX int, ap []float64) {
|
||||
}
|
||||
func (Blas) Dsyr2(o blas.Order, ul blas.Uplo, n int, alpha float64, x []float64, incX int, y []float64, incY int, a []float64, lda int) {
|
||||
}
|
||||
func (Blas) Dspr2(o blas.Order, ul blas.Uplo, n int, alpha float64, x []float64, incX int, y []float64, incY int, a []float64) {
|
||||
}
|
||||
|
||||
// Level 3 routines.
|
||||
func (Blas) Dsymm(o blas.Order, s blas.Side, ul blas.Uplo, m, n int, alpha float64, a []float64, lda int, b []float64, ldb int, beta float64, c []float64, ldc int) {
|
||||
}
|
||||
func (Blas) Dsyrk(o blas.Order, ul blas.Uplo, t blas.Transpose, n, k int, alpha float64, a []float64, lda int, beta float64, c []float64, ldc int) {
|
||||
}
|
||||
func (Blas) Dsyr2k(o blas.Order, ul blas.Uplo, t blas.Transpose, n, k int, alpha float64, a []float64, lda int, b []float64, ldb int, beta float64, c []float64, ldc int) {
|
||||
}
|
||||
func (Blas) Dtrmm(o blas.Order, s blas.Side, ul blas.Uplo, tA blas.Transpose, d blas.Diag, m, n int, alpha float64, a []float64, lda int, b []float64, ldb int) {
|
||||
}
|
||||
func (Blas) Dtrsm(o blas.Order, s blas.Side, ul blas.Uplo, tA blas.Transpose, d blas.Diag, m, n int, alpha float64, a []float64, lda int, b []float64, ldb int) {
|
||||
}
|
Reference in New Issue
Block a user