func runRefTest(A *matrix.FloatMatrix, ntest, LB int) time.Duration { var mintime time.Duration N := A.Rows() ipiv := make([]int32, N, N) lopt := linalg.OptLower if testUpper { lopt = linalg.OptUpper } fnc := func() { ERRlapack = lapack.Sytrf(A, ipiv, lopt) } A0 := A.Copy() for n := 0; n < ntest; n++ { if n > 0 { // restore original A A0.CopyTo(A) } mperf.FlushCache() time0 := mperf.Timeit(fnc) if n == 0 || time0 < mintime { mintime = time0 } } return mintime }
// 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 }
func _TestBKpivot1n2(t *testing.T) { Ldata := [][]float64{ []float64{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, []float64{1.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0}, []float64{1.0, 2.0, 3.0, 0.0, 0.0, 0.0, 0.0}, []float64{1.0, 2.0, 3.0, 4.0, 0.0, 0.0, 0.0}, []float64{1.0, 5.0, 3.0, 4.0, 5.0, 0.0, 0.0}, []float64{1.0, 2.0, 3.0, 7.0, 5.0, 6.0, 0.0}, []float64{1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0}} Bdata := [][]float64{ []float64{10.0, 20.0}, []float64{10.0, 20.0}, []float64{10.0, 20.0}, []float64{10.0, 20.0}, []float64{10.0, 20.0}, []float64{10.0, 20.0}, []float64{10.0, 20.0}} A := matrix.FloatMatrixFromTable(Ldata, matrix.RowOrder) X := matrix.FloatMatrixFromTable(Bdata, matrix.RowOrder) N := A.Rows() B := matrix.FloatZeros(N, 2) MultSym(B, A, X, 1.0, 0.0, LOWER|LEFT) t.Logf("initial B:\n%v\n", B) //N := 8 //A := matrix.FloatUniformSymmetric(N) nb := 0 W := matrix.FloatWithValue(A.Rows(), 5, 0.0) ipiv := make([]int, N, N) L, _ := DecomposeBK(A.Copy(), W, ipiv, LOWER, nb) t.Logf("ipiv: %v\n", ipiv) t.Logf("L:\n%v\n", L) ipiv0 := make([]int, N, N) nb = 4 L0, _ := DecomposeBK(A.Copy(), W, ipiv0, LOWER, nb) t.Logf("ipiv0: %v\n", ipiv0) t.Logf("L0:\n%v\n", L0) B0 := B.Copy() SolveBK(B0, L0, ipiv0, LOWER) t.Logf("B0:\n%v\n", B0) ipiv2 := make([]int32, N, N) lapack.Sytrf(A, ipiv2, linalg.OptLower) t.Logf("ipiv2: %v\n", ipiv2) t.Logf("lapack A:\n%v\n", A) lapack.Sytrs(A, B, ipiv2, linalg.OptLower) t.Logf("lapack B:\n%v\n", B) t.Logf("B == B0: %v\n", B.AllClose(B0)) }
func _TestBK2U(t *testing.T) { Bdata := [][]float64{ []float64{10.0, 20.0}, []float64{10.0, 20.0}, []float64{10.0, 20.0}, []float64{10.0, 20.0}, []float64{10.0, 20.0}, []float64{10.0, 20.0}, []float64{10.0, 20.0}} N := 7 A0 := matrix.FloatNormal(N, N) A := matrix.FloatZeros(N, N) // A is symmetric, posivite definite Mult(A, A0, A0, 1.0, 1.0, TRANSB) X := matrix.FloatMatrixFromTable(Bdata, matrix.RowOrder) B := matrix.FloatZeros(N, 2) MultSym(B, A, X, 1.0, 0.0, LOWER|LEFT) t.Logf("initial B:\n%v\n", B) nb := 0 W := matrix.FloatWithValue(A.Rows(), 5, 1.0) A.SetAt(4, 1, A.GetAt(4, 1)+1.0) A.SetAt(1, 4, A.GetAt(4, 1)) ipiv := make([]int, N, N) L, _ := DecomposeBK(A.Copy(), W, ipiv, LOWER, nb) t.Logf("ipiv: %v\n", ipiv) t.Logf("L:\n%v\n", L) ipiv0 := make([]int, N, N) nb = 4 L0, _ := DecomposeBK(A.Copy(), W, ipiv0, LOWER, nb) t.Logf("ipiv: %v\n", ipiv0) t.Logf("L:\n%v\n", L0) B0 := B.Copy() SolveBK(B0, L0, ipiv0, LOWER) t.Logf("B0:\n%v\n", B0) ipiv2 := make([]int32, N, N) lapack.Sytrf(A, ipiv2, linalg.OptLower) t.Logf("ipiv2: %v\n", ipiv2) t.Logf("lapack A:\n%v\n", A) lapack.Sytrs(A, B, ipiv2, linalg.OptLower) t.Logf("lapack B:\n%v\n", B) t.Logf("B == B0: %v\n", B.AllClose(B0)) }
func _TestBKSolve(t *testing.T) { Ldata := [][]float64{ []float64{1.0, 2.0, 3.0, 4.0}, []float64{2.0, 2.0, 3.0, 4.0}, []float64{3.0, 3.0, 3.0, 4.0}, []float64{4.0, 4.0, 4.0, 4.0}} Xdata := [][]float64{ []float64{1.0, 2.0}, []float64{1.0, 2.0}, []float64{1.0, 2.0}, []float64{1.0, 2.0}} A := matrix.FloatMatrixFromTable(Ldata, matrix.RowOrder) X := matrix.FloatMatrixFromTable(Xdata, matrix.RowOrder) N := A.Rows() B := matrix.FloatZeros(N, 2) Mult(B, A, X, 1.0, 0.0, NOTRANS) S := matrix.FloatZeros(N, 2) MultSym(S, A, X, 1.0, 0.0, LOWER|LEFT) t.Logf("B:\n%v\n", B) t.Logf("S:\n%v\n", S) //N := 8 //A := matrix.FloatUniformSymmetric(N) nb := 0 W := matrix.FloatWithValue(A.Rows(), 5, 0.0) ipiv := make([]int, N, N) L, _ := DecomposeBK(A.Copy(), W, ipiv, LOWER, nb) t.Logf("ipiv: %v\n", ipiv) t.Logf("L:\n%v\n", L) B0 := B.Copy() SolveBK(B0, L, ipiv, LOWER) t.Logf("B0:\n%v\n", B0) ipiv2 := make([]int32, N, N) lapack.Sytrf(A, ipiv2, linalg.OptLower) t.Logf("ipiv2: %v\n", ipiv2) t.Logf("lapack A:\n%v\n", A) lapack.Sytrs(A, B, ipiv2, linalg.OptLower) t.Logf("lapack B:\n%v\n", B) }