// single invocation for matops and lapack functions func runCheck(A *matrix.FloatMatrix, LB int) (bool, time.Duration, time.Duration) { var flags matops.Flags N := A.Rows() ipiv := make([]int, N, N) ipiv0 := make([]int32, N, N) flags = matops.LOWER lopt := linalg.OptLower if testUpper { flags = matops.UPPER lopt = linalg.OptUpper } W := matrix.FloatZeros(A.Rows(), LB+2) fnc := func() { _, ERRmatops = matops.DecomposeBK(A, W, ipiv, flags, LB) } if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A start:\n%v\n", A) } A0 := A.Copy() mperf.FlushCache() time0 := mperf.Timeit(fnc) if verbose && N < 10 { fmt.Fprintf(os.Stderr, "ipiv:%v\n", ipiv) fmt.Fprintf(os.Stderr, "A end:\n%v\n", A) } fn2 := func() { ERRlapack = lapack.Sytrf(A0, ipiv0, lopt) } if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A0 start:\n%v\n", A0) } mperf.FlushCache() time2 := mperf.Timeit(fn2) if verbose && N < 10 { fmt.Fprintf(os.Stderr, "ipiv0:%v\n", ipiv0) fmt.Fprintf(os.Stderr, "A0 end:\n%v\n", A0) } // now A == A0 && ipiv == ipiv0 ok := A.AllClose(A0) okip := checkIPIV(ipiv, ipiv0) if !ok || !okip { // save result to globals Rlapack = A0 Rmatops = A IPIVlapack = ipiv0 IPIVmatops = ipiv } return ok && okip, time0, time2 }
// single invocation for matops and lapack functions func runCheck(A *matrix.FloatMatrix, LB int) (bool, time.Duration, time.Duration) { M := A.Rows() N := A.Cols() nN := N if M < N { nN = M } ipiv := make([]int, nN, nN) ipiv0 := make([]int32, nN, nN) fnc := func() { _, ERRmatops = matops.DecomposeLU(A, ipiv, LB) } if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A start:\n%v\n", A) } A0 := A.Copy() mperf.FlushCache() time0 := mperf.Timeit(fnc) if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A end:\n%v\n", A) fmt.Fprintf(os.Stderr, "ipiv:%v\n", ipiv) } fn2 := func() { ERRlapack = lapack.Getrf(A0, ipiv0) } if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A0 start:\n%v\n", A0) } mperf.FlushCache() time2 := mperf.Timeit(fn2) if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A0 end:\n%v\n", A0) fmt.Fprintf(os.Stderr, "ipiv0:%v\n", ipiv0) } // now A == A0 && ipiv == ipiv0 ok := A.AllClose(A0) okip := checkIPIV(ipiv, ipiv0) _ = okip if !ok || !okip { // save result to globals Rlapack = A0 Rmatops = A IPIVlapack = ipiv0 IPIVmatops = ipiv } return ok && okip, time0, time2 }
func trmmTest(t *testing.T, A *matrix.FloatMatrix, flags Flags, nb int) bool { var B0 *matrix.FloatMatrix N := A.Cols() S := 0 E := A.Cols() side := linalg.OptLeft if flags&RIGHT != 0 { B0 = matrix.FloatWithValue(2, A.Rows(), 2.0) side = linalg.OptRight E = B0.Rows() } else { B0 = matrix.FloatWithValue(A.Rows(), 2, 2.0) E = B0.Cols() } B1 := B0.Copy() trans := linalg.OptNoTrans if flags&TRANSA != 0 { trans = linalg.OptTransA } diag := linalg.OptNonUnit if flags&UNIT != 0 { diag = linalg.OptUnit } uplo := linalg.OptUpper if flags&LOWER != 0 { uplo = linalg.OptLower } blas.TrmmFloat(A, B0, 1.0, uplo, diag, trans, side) if A.Rows() < 8 { //t.Logf("..A\n%v\n", A) t.Logf(" BLAS B0:\n%v\n", B0) } Ar := A.FloatArray() Br := B1.FloatArray() if nb != 0 { DTrmmBlk(Br, Ar, 1.0, flags, B1.LeadingIndex(), A.LeadingIndex(), N, S, E, nb) } else { DTrmmUnblk(Br, Ar, 1.0, flags, B1.LeadingIndex(), A.LeadingIndex(), N, S, E, 0) } result := B0.AllClose(B1) t.Logf(" B0 == B1: %v\n", result) if A.Rows() < 8 { t.Logf(" DTrmm B1:\n%v\n", B1) } return result }
// single invocation for matops and lapack functions func runCheck(A *matrix.FloatMatrix, LB int) (bool, time.Duration, time.Duration) { var W *matrix.FloatMatrix = nil N := A.Cols() tau := matrix.FloatZeros(N, 1) if LB > 0 { W = matrix.FloatZeros(A.Rows(), LB) } fnc := func() { _, ERRmatops = matops.DecomposeQR(A, tau, W, LB) } if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A start:\n%v\n", A) } A0 := A.Copy() tau0 := tau.Copy() mperf.FlushCache() time0 := mperf.Timeit(fnc) if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A end:\n%v\n", A) tau.SetSize(1, N, 1) fmt.Fprintf(os.Stderr, "tau: %v\n", tau) } fn2 := func() { ERRlapack = lapack.Geqrf(A0, tau0) } mperf.FlushCache() time2 := mperf.Timeit(fn2) if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A0 end:\n%v\n", A0) tau0.SetSize(1, N, 1) // row vector fmt.Fprintf(os.Stderr, "tau0: %v\n", tau0) } // now A == A0 && tau == tau0 ok := A.AllClose(A0) oktau := tau.AllClose(tau0) if !ok || !oktau { // save result to globals Rlapack = A0 Rmatops = A TAUlapack = tau0 TAUmatops = tau } return ok && oktau, time0, time2 }
// single invocation for matops and lapack functions func runCheck(A *matrix.FloatMatrix, LB int) (bool, time.Duration, time.Duration) { var flags matops.Flags N := A.Rows() flags = matops.LOWER lopt := linalg.OptLower if testUpper { flags = matops.UPPER lopt = linalg.OptUpper } fnc := func() { _, ERRmatops = matops.DecomposeCHOL(A, flags, LB) } if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A start:\n%v\n", A) } A0 := A.Copy() mperf.FlushCache() time0 := mperf.Timeit(fnc) if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A end:\n%v\n", A) } fn2 := func() { ERRlapack = lapack.Potrf(A0, lopt) } if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A0 start:\n%v\n", A0) } mperf.FlushCache() time2 := mperf.Timeit(fn2) if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A0 end:\n%v\n", A0) } // now A == A0 && ipiv == ipiv0 ok := A.AllClose(A0) if !ok { // save result to globals Rlapack = A0 Rmatops = A } return ok, time0, time2 }
func TestQRT(t *testing.T) { M := 6 N := 5 var Tau matrix.FloatMatrix A := matrix.FloatUniform(M, N) T := matrix.FloatZeros(A.Cols(), A.Cols()) T0 := T.Copy() X, _ := DecomposeQRT(A.Copy(), T, nil, 0) Tau.DiagOf(T) Tau0 := matrix.FloatZeros(M, 1) A0 := A.Copy() lapack.Geqrf(A0, Tau0) ok := X.AllClose(A0) okt := Tau.AllClose(Tau0) t.Logf("lapack QR == DecomposeQR: %v\n", ok && okt) if !ok || !okt { t.Logf("A0: %d, %d, %d\n", A0.Rows(), A0.Cols(), A0.LeadingIndex()) t.Logf("A\n%v\n", A) t.Logf("X\n%v\n", X) t.Logf("Tau\n%v\n", &Tau) t.Logf("lapack X\n%v\n", A0) t.Logf("lapack Tau\n%v\n", Tau0) } // build block reflectors //unblkQRBlockReflector(X, Tau, T) V := TriLU(A0.Copy()) lapack.LarftFloat(V, Tau0, T0) ok = T0.AllClose(T) t.Logf("lapack.dlarft == QRBlockReflector: %v\n", ok) if !ok { t.Logf("T:\n%v\n", T) t.Logf("lapack T0:\n%v\n", T0) } }