// test: unblk.ReduceHess(A) == blk.ReduceHess(A) func TestReduceHess(t *testing.T) { N := 375 nb := 16 conf := gomas.NewConf() conf.LB = nb A := cmat.NewMatrix(N, N) tau := cmat.NewMatrix(N, 1) zeromean := cmat.NewFloatNormSource() A.SetFrom(zeromean) A0 := cmat.NewCopy(A) tau0 := cmat.NewCopy(tau) // blocked reduction W := lapackd.Workspace(lapackd.HessReduceWork(A, conf)) lapackd.HessReduce(A, tau, W, conf) // unblocked reduction conf.LB = 0 lapackd.HessReduce(A0, tau0, W, conf) ok := A.AllClose(A0) t.Logf("blk.ReduceHess(A) == unblk.ReduceHess(A): %v\n", ok) ok = tau0.AllClose(tau) t.Logf("blk HessQ.tau == unblk HessQ.tau: %v\n", ok) // ||A - A0||_1 blasd.Plus(A, A0, 1.0, -1.0, gomas.NONE) nrm := lapackd.NormP(A, lapackd.NORM_ONE) t.Logf("||H - H0||_1: %e\n", nrm) }
// test: A - Q*Hess(A)*Q.T == 0 func TestMultHess(t *testing.T) { N := 377 nb := 16 conf := gomas.NewConf() conf.LB = nb A := cmat.NewMatrix(N, N) tau := cmat.NewMatrix(N, 1) zeromean := cmat.NewFloatNormSource() A.SetFrom(zeromean) A0 := cmat.NewCopy(A) // reduction W := lapackd.Workspace(lapackd.HessReduceWork(A, conf)) lapackd.HessReduce(A, tau, W, conf) var Hlow cmat.FloatMatrix H := cmat.NewCopy(A) // set triangular part below first subdiagonal to zeros zeros := cmat.NewFloatConstSource(0.0) Hlow.SubMatrix(H, 1, 0, N-1, N-1) Hlow.SetFrom(zeros, cmat.LOWER|cmat.UNIT) H1 := cmat.NewCopy(H) // H := Q*H*Q.T conf.LB = nb lapackd.HessMult(H, A, tau, W, gomas.LEFT, conf) lapackd.HessMult(H, A, tau, W, gomas.RIGHT|gomas.TRANS, conf) // H := Q*H*Q.T conf.LB = 0 lapackd.HessMult(H1, A, tau, W, gomas.LEFT, conf) lapackd.HessMult(H1, A, tau, W, gomas.RIGHT|gomas.TRANS, conf) // compute ||Q*Hess(A)*Q.T - A||_1 blasd.Plus(H, A0, 1.0, -1.0, gomas.NONE) nrm := lapackd.NormP(H, lapackd.NORM_ONE) t.Logf(" blk.|| Q*Hess(A)*Q.T - A ||_1 : %e\n", nrm) blasd.Plus(H1, A0, 1.0, -1.0, gomas.NONE) nrm = lapackd.NormP(H1, lapackd.NORM_ONE) t.Logf("unblk.|| Q*Hess(A)*Q.T - A ||_1 : %e\n", nrm) }