func runTest(A *matrix.FloatMatrix, ntest, LB int) time.Duration { var W *matrix.FloatMatrix = nil var mintime time.Duration 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) } A0 := A.Copy() for n := 0; n < ntest; n++ { if n > 0 { // restore original A A0.CopyTo(A) tau.Scale(0.0) } mperf.FlushCache() time0 := mperf.Timeit(fnc) if n == 0 || time0 < mintime { mintime = time0 } if verbose { fmt.Printf("%.4f ms\n", time0.Seconds()*1000.0) } } return mintime }
// 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 }