예제 #1
0
파일: scal.go 프로젝트: hrautila/gomas
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
}
예제 #2
0
파일: axpy.go 프로젝트: hrautila/gomas
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
}
예제 #3
0
파일: updtrmv.go 프로젝트: hrautila/gomas
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
}
예제 #4
0
파일: asum.go 프로젝트: hrautila/gomas
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)
}
예제 #5
0
파일: cmops.go 프로젝트: sguzwf/algorithm
// 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))
}
예제 #6
0
파일: gemv.go 프로젝트: hrautila/gomas
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))
}
예제 #7
0
파일: iamax.go 프로젝트: hrautila/gomas
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)
}
예제 #8
0
파일: cmops.go 프로젝트: sguzwf/algorithm
// 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)
}
예제 #9
0
파일: cmops.go 프로젝트: sguzwf/algorithm
// 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)
}
예제 #10
0
파일: cmops.go 프로젝트: sguzwf/algorithm
// 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)
}
예제 #11
0
파일: removed.go 프로젝트: sguzwf/algorithm
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))

}
예제 #12
0
파일: cmops.go 프로젝트: sguzwf/algorithm
// 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))

}
예제 #13
0
파일: cmops.go 프로젝트: sguzwf/algorithm
// 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))
}
예제 #14
0
파일: cmops.go 프로젝트: sguzwf/algorithm
// 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))

}
예제 #15
0
파일: removed.go 프로젝트: sguzwf/algorithm
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))

}
예제 #16
0
파일: trmv.go 프로젝트: hrautila/gomas
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
}
예제 #17
0
파일: cmops.go 프로젝트: sguzwf/algorithm
// 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))
}
예제 #18
0
파일: swap.go 프로젝트: hrautila/gomas
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
}
예제 #19
0
파일: dot.go 프로젝트: hrautila/gomas
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)
}
예제 #20
0
파일: cmops.go 프로젝트: sguzwf/algorithm
// 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))
}
예제 #21
0
파일: cmops.go 프로젝트: sguzwf/algorithm
// 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)
}
예제 #22
0
파일: cmops.go 프로젝트: sguzwf/algorithm
// 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)
}
예제 #23
0
파일: cmops.go 프로젝트: sguzwf/algorithm
// 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))
}
예제 #24
0
파일: cmops.go 프로젝트: sguzwf/algorithm
// 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))
}
예제 #25
0
파일: cmops.go 프로젝트: sguzwf/algorithm
// 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))
}