func TestLinprog(t *testing.T) { m := 500 n := 1000 tol := 1e-8 A := mat.RandN(m, n) c := mat.RandVec(n) b := mat.NewVec(m) xt := mat.RandVec(n) b.Apply(A, xt) At := A.TrView() rd := mat.NewVec(n) rp := mat.NewVec(m) rs := mat.NewVec(n) prob := NewStandard(c, A, b) //Example for printing duality gap and infeasibilities result := Solve(prob, nil, NewDisplay(2)) rd.Sub(c, result.S) rd.AddMul(At, result.Y, -1) rp.Apply(A, result.X) rp.Sub(b, rp) rs.Mul(result.X, result.S) rs.Neg(rs) dev := (rd.Asum() + rp.Asum() + rs.Asum()) / float64(n) if dev > tol { t.Log(dev) t.Fail() } }
func BenchmarkLinprog(bench *testing.B) { bench.StopTimer() m := 50 n := 100 tol := 1e-3 rd := mat.NewVec(n) rp := mat.NewVec(m) rs := mat.NewVec(n) for i := 0; i < bench.N; i++ { A := mat.RandN(m, n) c := mat.RandVec(n) b := mat.NewVec(m) xt := mat.RandVec(n) b.Apply(A, xt) At := A.TrView() prob := NewStandard(c, A, b) bench.StartTimer() result := Solve(prob, nil) bench.StopTimer() rd.Sub(c, result.S) rd.AddMul(At, result.Y, -1) rp.Apply(A, result.X) rp.Sub(b, rp) rs.Mul(result.X, result.S) rs.Neg(rs) dev := (rd.Asum() + rp.Asum() + rs.Asum()) / float64(n) if dev > tol { bench.Log(dev) } } }
func TestQuadratic(t *testing.T) { mat.Register(cops) n := 10 xStar := mat.NewVec(n) xStar.AddSc(1) A := mat.RandN(n) At := A.TrView() AtA := mat.New(n) AtA.Mul(At, A) bTmp := mat.NewVec(n) bTmp.Apply(A, xStar) b := mat.NewVec(n) b.Apply(At, bTmp) b.Scal(-2) c := bTmp.Nrm2Sq() //Define input arguments obj := opt.NewQuadratic(AtA, b, c) p := NewParams() sol := NewSolution(mat.NewVec(n)) //Steepest descent with armijo stDesc := NewSteepestDescent() res1 := stDesc.Solve(obj, sol, p, NewDisplay(100)) t.Log(res1.ObjX, res1.FunEvals, res1.GradEvals, res1.Status) //Steepest descent with Quadratic stDesc.LineSearch = uni.DerivWrapper{uni.NewQuadratic()} res2 := stDesc.Solve(obj, sol, p, NewDisplay(100)) t.Log(res2.ObjX, res2.FunEvals, res2.GradEvals, res2.Status) //LBFGS with armijo lbfgs := NewLBFGS() res3 := lbfgs.Solve(obj, sol, p, NewDisplay(10)) t.Log(res3.ObjX, res3.FunEvals, res3.GradEvals, res3.Status) //constrained problems (constraints described as projection) projGrad := NewProjGrad() res4 := projGrad.Solve(obj, opt.RealPlus{}, sol, p, NewDisplay(100)) t.Log(res4.ObjX, res4.FunEvals, res4.GradEvals, res4.Status) if math.Abs(res1.ObjX) > 0.01 { t.Fail() } if math.Abs(res2.ObjX) > 0.01 { t.Fail() } if math.Abs(res3.ObjX) > 0.01 { t.Fail() } if math.Abs(res4.ObjX) > 0.01 { t.Fail() } }