func updtrmv(A, X, Y *cmat.FloatMatrix, alpha float64, bits, N, M int) error { var Am C.mdata_t var Xm, Ym C.mvec_t xr, _ := X.Size() yr, _ := Y.Size() Am.md = (*C.double)(unsafe.Pointer(&A.Data()[0])) Am.step = C.int(A.Stride()) Xm.md = (*C.double)(unsafe.Pointer(&X.Data()[0])) Ym.md = (*C.double)(unsafe.Pointer(&Y.Data()[0])) Ym.inc = C.int(1) Xm.inc = C.int(1) // if row vectors, change increment if xr == 1 { Xm.inc = C.int(X.Stride()) } if yr == 1 { Ym.inc = C.int(Y.Stride()) } C.__d_update_trmv_unb( (*C.mdata_t)(unsafe.Pointer(&Am)), (*C.mvec_t)(unsafe.Pointer(&Xm)), (*C.mvec_t)(unsafe.Pointer(&Ym)), C.double(alpha), C.int(bits), C.int(N), C.int(M)) return nil }
func gemv(Y, A, X *cmat.FloatMatrix, alpha, beta float64, bits, S, L, R, E int) { var Am C.mdata_t var Xm, Ym C.mvec_t xr, _ := X.Size() yr, _ := Y.Size() Am.md = (*C.double)(unsafe.Pointer(&A.Data()[0])) Am.step = C.int(A.Stride()) Xm.md = (*C.double)(unsafe.Pointer(&X.Data()[0])) Ym.md = (*C.double)(unsafe.Pointer(&Y.Data()[0])) Ym.inc = C.int(1) Xm.inc = C.int(1) // if row vectors, change increment if xr == 1 { Xm.inc = C.int(X.Stride()) } if yr == 1 { Ym.inc = C.int(Y.Stride()) } C.__d_gemv_unb( (*C.mvec_t)(unsafe.Pointer(&Ym)), (*C.mdata_t)(unsafe.Pointer(&Am)), (*C.mvec_t)(unsafe.Pointer(&Xm)), C.double(alpha), /*C.double(beta),*/ C.int(bits), C.int(S), C.int(L), C.int(R), C.int(E)) }
func axpby(Y, X *cmat.FloatMatrix, alpha, beta float64, N int) { var x, y C.mvec_t xr, _ := X.Size() x.md = (*C.double)(unsafe.Pointer(&X.Data()[0])) x.inc = C.int(1) if xr == 1 { x.inc = C.int(X.Stride()) } yr, _ := Y.Size() y.md = (*C.double)(unsafe.Pointer(&Y.Data()[0])) y.inc = C.int(1) if yr == 1 { y.inc = C.int(Y.Stride()) } if beta == 1.0 { C.__d_vec_axpy( (*C.mvec_t)(unsafe.Pointer(&y)), (*C.mvec_t)(unsafe.Pointer(&x)), C.double(alpha), C.int(N)) } else { C.__d_vec_axpby( (*C.mvec_t)(unsafe.Pointer(&y)), (*C.mvec_t)(unsafe.Pointer(&x)), C.double(alpha), C.double(beta), C.int(N)) } return }
func vinvscal(X *cmat.FloatMatrix, alpha float64, N int) { var x C.mvec_t xr, _ := X.Size() x.md = (*C.double)(unsafe.Pointer(&X.Data()[0])) x.inc = C.int(1) if xr == 1 { x.inc = C.int(X.Stride()) } C.__d_vec_invscal( (*C.mvec_t)(unsafe.Pointer(&x)), C.double(alpha), C.int(N)) return }
func iamax(X *cmat.FloatMatrix, N int) int { var x C.mvec_t var ix C.int xr, _ := X.Size() x.md = (*C.double)(unsafe.Pointer(&X.Data()[0])) x.inc = C.int(1) if xr == 1 { x.inc = C.int(X.Stride()) } ix = C.__d_vec_iamax( (*C.mvec_t)(unsafe.Pointer(&x)), C.int(N)) return int(ix) }
func sum(X *cmat.FloatMatrix, N int) float64 { var x C.mvec_t var dc C.double xr, _ := X.Size() x.md = (*C.double)(unsafe.Pointer(&X.Data()[0])) x.inc = C.int(1) if xr == 1 { x.inc = C.int(X.Stride()) } dc = C.__d_vec_sum_recursive( (*C.mvec_t)(unsafe.Pointer(&x)), C.int(N)) return float64(dc) }
// copying: X := Y func DCopy(X, Y []float64, incX, incY, N int) { var Xv C.mvec_t var Yv C.mvec_t if X == nil || Y == nil || N <= 0 { return } Xv.md = (*C.double)(unsafe.Pointer(&X[0])) Xv.inc = C.int(incX) Yv.md = (*C.double)(unsafe.Pointer(&Y[0])) Yv.inc = C.int(incY) C.dvec_copy( (*C.mvec_t)(unsafe.Pointer(&Xv)), (*C.mvec_t)(unsafe.Pointer(&Yv)), C.int(N)) }
func trmv(X, A *cmat.FloatMatrix, alpha float64, bits, N int) error { var Am C.mdata_t var Xm C.mvec_t xr, _ := X.Size() Am.md = (*C.double)(unsafe.Pointer(&A.Data()[0])) Am.step = C.int(A.Stride()) Xm.md = (*C.double)(unsafe.Pointer(&X.Data()[0])) Xm.inc = C.int(1) // if row vectors, change increment if xr == 1 { Xm.inc = C.int(X.Stride()) } C.__d_trmv_unb( (*C.mvec_t)(unsafe.Pointer(&Xm)), (*C.mdata_t)(unsafe.Pointer(&Am)), C.double(alpha), C.int(bits), C.int(N)) return nil }
func vswap(X, Y *cmat.FloatMatrix, N int) { var x, y C.mvec_t xr, _ := X.Size() x.md = (*C.double)(unsafe.Pointer(&X.Data()[0])) x.inc = C.int(1) if xr == 1 { x.inc = C.int(X.Stride()) } yr, _ := Y.Size() y.md = (*C.double)(unsafe.Pointer(&Y.Data()[0])) y.inc = C.int(1) if yr == 1 { y.inc = C.int(Y.Stride()) } C.__d_vec_swap( (*C.mvec_t)(unsafe.Pointer(&x)), (*C.mvec_t)(unsafe.Pointer(&y)), C.int(N)) return }
// return: sum (abs(X[i]-Y[i]))^2 func DiffNorm2(X, Y []float64, incX, incY, N int) float64 { var nrm C.double var Xv C.mvec_t var Yv C.mvec_t if X == nil || Y == nil || N <= 0 { return 0.0 } Xv.md = (*C.double)(unsafe.Pointer(&X[0])) Xv.inc = C.int(incX) Yv.md = (*C.double)(unsafe.Pointer(&Y[0])) Yv.inc = C.int(incY) nrm = C.dvec_diff_nrm2( (*C.mvec_t)(unsafe.Pointer(&Xv)), (*C.mvec_t)(unsafe.Pointer(&Yv)), C.int(N)) return float64(nrm) }
func dot(X, Y *cmat.FloatMatrix, N int) float64 { var x, y C.mvec_t var dc C.double xr, _ := X.Size() x.md = (*C.double)(unsafe.Pointer(&X.Data()[0])) x.inc = C.int(1) if xr == 1 { x.inc = C.int(X.Stride()) } yr, _ := Y.Size() y.md = (*C.double)(unsafe.Pointer(&Y.Data()[0])) y.inc = C.int(1) if yr == 1 { y.inc = C.int(Y.Stride()) } dc = C.__d_vec_dot_recursive( (*C.mvec_t)(unsafe.Pointer(&x)), (*C.mvec_t)(unsafe.Pointer(&y)), C.int(N)) return float64(dc) }
// return: alpha * X * Y func DDot(X, Y []float64, alpha float64, incX, incY, N int) float64 { var dot C.double var Xv C.mvec_t var Yv C.mvec_t if X == nil || Y == nil || N <= 0 { return 0.0 } Xv.md = (*C.double)(unsafe.Pointer(&X[0])) Xv.inc = C.int(incX) Yv.md = (*C.double)(unsafe.Pointer(&Y[0])) Yv.inc = C.int(incY) dot = C.dvec_dot( (*C.mvec_t)(unsafe.Pointer(&Xv)), (*C.mvec_t)(unsafe.Pointer(&Yv)), C.double(alpha), C.int(N)) return float64(dot) }
// generic triangular matrix rank update; A = A + alpha*X*Y.T func DTrmUpdMV(A, X, Y []float64, alpha float64, flags Flags, ldA, incX, incY, S, L, NB int) { var Xv C.mvec_t var Yv C.mvec_t var Am C.mdata_t if A == nil || X == nil || Y == nil { return } Xv.md = (*C.double)(unsafe.Pointer(&X[0])) Xv.inc = C.int(incX) Yv.md = (*C.double)(unsafe.Pointer(&Y[0])) Yv.inc = C.int(incY) Am.md = (*C.double)(unsafe.Pointer(&A[0])) Am.step = C.int(ldA) C.dmvec_trmv_upd( (*C.mdata_t)(unsafe.Pointer(&Am)), (*C.mvec_t)(unsafe.Pointer(&Xv)), (*C.mvec_t)(unsafe.Pointer(&Yv)), C.double(alpha), C.int(flags), C.int(S), C.int(L), C.int(NB)) }
// blas GEMV; blocked version // Y = alpha*A*X + beta*Y; Y is M*1, X is N*1 and A is M*N func DMultMV(Y, A, X []float64, alpha, beta float64, flags Flags, incY, ldA, incX, S, L, R, E, H, MB int) { var Yv C.mvec_t var Xv C.mvec_t var Am C.mdata_t if Y == nil || A == nil || X == nil { return } Yv.md = (*C.double)(unsafe.Pointer(&Y[0])) Yv.inc = C.int(incY) Xv.md = (*C.double)(unsafe.Pointer(&X[0])) Xv.inc = C.int(incX) Am.md = (*C.double)(unsafe.Pointer(&A[0])) Am.step = C.int(ldA) C.dmult_gemv_blocked( (*C.mvec_t)(unsafe.Pointer(&Yv)), (*C.mdata_t)(unsafe.Pointer(&Am)), (*C.mvec_t)(unsafe.Pointer(&Xv)), C.double(alpha), C.double(beta), C.int(flags), C.int(S), C.int(L), C.int(R), C.int(E), C.int(H), C.int(MB)) }
// Z[0] = beta*Z[0] + alpha * X * Y func DDotSum(Z, X, Y []float64, alpha, beta float64, incZ, incX, incY, N int) { var Zv C.mvec_t var Xv C.mvec_t var Yv C.mvec_t if Z == nil || X == nil || Y == nil || N <= 0 { return } Xv.md = (*C.double)(unsafe.Pointer(&X[0])) Xv.inc = C.int(incX) Zv.md = (*C.double)(unsafe.Pointer(&Z[0])) Zv.inc = C.int(incZ) Yv.md = (*C.double)(unsafe.Pointer(&Y[0])) Yv.inc = C.int(incY) C.dvec_dots( (*C.mvec_t)(unsafe.Pointer(&Zv)), (*C.mvec_t)(unsafe.Pointer(&Xv)), (*C.mvec_t)(unsafe.Pointer(&Yv)), C.double(alpha), C.double(beta), C.int(N)) }
// scaling: X = alpha*X func DScal(X []float64, alpha float64, incX, N int) { var Xv C.mvec_t if X == nil || N <= 0 { return } Xv.md = (*C.double)(unsafe.Pointer(&X[0])) Xv.inc = C.int(incX) C.dvec_scal( (*C.mvec_t)(unsafe.Pointer(&Xv)), C.double(alpha), C.int(N)) }
// blas GER; blocked version // A = A + alpha * x * y.T; A is M*N, x is M*1, Y is N*1, 0 < R < E <= M, 0 < S < L <= N func DRankMV(A, X, Y []float64, alpha float64, ldA, incX, incY, S, L, R, E, NB, MB int) { var Yv C.mvec_t var Xv C.mvec_t var Am C.mdata_t if A == nil || X == nil || Y == nil { return } Yv.md = (*C.double)(unsafe.Pointer(&Y[0])) Yv.inc = C.int(incY) Xv.md = (*C.double)(unsafe.Pointer(&X[0])) Xv.inc = C.int(incX) Am.md = (*C.double)(unsafe.Pointer(&A[0])) Am.step = C.int(ldA) C.dmvec_rank( (*C.mdata_t)(unsafe.Pointer(&Am)), (*C.mvec_t)(unsafe.Pointer(&Xv)), (*C.mvec_t)(unsafe.Pointer(&Yv)), C.double(alpha), C.int(S), C.int(L), C.int(R), C.int(E), C.int(NB), C.int(MB)) }
// return: index of max absolute value func DIAMax(X []float64, incX, N int) int { var ix C.int var Xv C.mvec_t if X == nil || N <= 0 { return -1 } Xv.md = (*C.double)(unsafe.Pointer(&X[0])) Xv.inc = C.int(incX) ix = C.dvec_iamax( (*C.mvec_t)(unsafe.Pointer(&Xv)), C.int(N)) return int(ix) }
// return: sum (abs(X[i]))^2; Euclidaen norm func DNorm2(X []float64, incX, N int) float64 { var nrm C.double var Xv C.mvec_t if X == nil || N <= 0 { return 0.0 } Xv.md = (*C.double)(unsafe.Pointer(&X[0])) Xv.inc = C.int(incX) nrm = C.dvec_nrm2( (*C.mvec_t)(unsafe.Pointer(&Xv)), C.int(N)) return float64(nrm) }
// return: sum (abs(X[i])) func DAsum(X []float64, incX, N int) float64 { var asum C.double var Xv C.mvec_t if X == nil || N <= 0 { return 0.0 } Xv.md = (*C.double)(unsafe.Pointer(&X[0])) Xv.inc = C.int(incX) asum = C.dvec_asum( (*C.mvec_t)(unsafe.Pointer(&Xv)), C.int(N)) return float64(asum) }
// blas TRMV; unblocked func DTrimvUnblkMV(X, A []float64, flags Flags, incX, ldA, N int) { var Xv C.mvec_t var Am C.mdata_t if A == nil || X == nil { return } Xv.md = (*C.double)(unsafe.Pointer(&X[0])) Xv.inc = C.int(incX) Am.md = (*C.double)(unsafe.Pointer(&A[0])) Am.step = C.int(ldA) C.dmvec_trid_unb( (*C.mvec_t)(unsafe.Pointer(&Xv)), (*C.mdata_t)(unsafe.Pointer(&Am)), C.int(flags), C.int(N)) }
// blas SYR; blocked version func DSymmRankMV(A, X []float64, alpha float64, flags Flags, ldA, incX, S, L, NB int) { var Xv C.mvec_t var Am C.mdata_t if A == nil || X == nil { return } Xv.md = (*C.double)(unsafe.Pointer(&X[0])) Xv.inc = C.int(incX) Am.md = (*C.double)(unsafe.Pointer(&A[0])) Am.step = C.int(ldA) C.dmvec_symv_rank( (*C.mdata_t)(unsafe.Pointer(&Am)), (*C.mvec_t)(unsafe.Pointer(&Xv)), C.double(alpha), C.int(flags), C.int(S), C.int(L), C.int(NB)) }
func DSolveLowerBlocked(X, A []float64, unit bool, incX, ldA, N, NB int) { var Xv C.mvec_t var Am C.mdata_t Xv.md = (*C.double)(unsafe.Pointer(&X[0])) Xv.inc = C.int(incX) Am.md = (*C.double)(unsafe.Pointer(&A[0])) Am.step = C.int(ldA) var flags Flags = LOWER if unit { flags |= UNIT } C.dmvec_solve_blocked( (*C.mvec_t)(unsafe.Pointer(&Xv)), (*C.mdata_t)(unsafe.Pointer(&Am)), C.int(flags), C.int(N), C.int(NB)) }
func DTrimvLowerTransA(X, A []float64, unit bool, incX, ldA, N, NB int) { var Xv C.mvec_t var Am C.mdata_t Xv.md = (*C.double)(unsafe.Pointer(&X[0])) Xv.inc = C.int(incX) Am.md = (*C.double)(unsafe.Pointer(&A[0])) Am.step = C.int(ldA) var flags Flags = LOWER | TRANSA if unit { flags |= UNIT } C.dmvec_trid_unb( (*C.mvec_t)(unsafe.Pointer(&Xv)), (*C.mdata_t)(unsafe.Pointer(&Am)), C.int(flags), C.int(N)) }
// blas TSMV; blocked version func DSolveBlkMV(X, A []float64, flags Flags, incX, ldA, N, NB int) { var Xv C.mvec_t var Am C.mdata_t if A == nil || X == nil { return } Xv.md = (*C.double)(unsafe.Pointer(&X[0])) Xv.inc = C.int(incX) Am.md = (*C.double)(unsafe.Pointer(&A[0])) Am.step = C.int(ldA) C.dmvec_solve_blocked( (*C.mvec_t)(unsafe.Pointer(&Xv)), (*C.mdata_t)(unsafe.Pointer(&Am)), C.int(flags), C.int(N), C.int(NB)) }