-
Notifications
You must be signed in to change notification settings - Fork 38
/
Copy pathquadprog.jl
97 lines (87 loc) · 4.25 KB
/
quadprog.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using Test
using LinearAlgebra
using MathProgBase
function quadprogtest(solver)
@testset "Testing quadprog with $solver" begin
sol = quadprog([0., 0., 0.],[2. 1. 0.; 1. 2. 1.; 0. 1. 2.],[1. 2. 3.; 1. 1. 0.],'>',[4., 1.],-Inf,Inf,solver)
@test sol.status == :Optimal
@test isapprox(sol.objval, 130/70, atol=1e-6)
@test isapprox(norm(sol.sol[1:3] - [0.5714285714285715,0.4285714285714285,0.8571428571428572]), 0.0, atol=1e-6)
@testset "QP1" begin
m = MathProgBase.LinearQuadraticModel(solver)
MathProgBase.loadproblem!(m, [1. 2. 3.; 1. 1. 0.],[-Inf,-Inf,-Inf],[Inf,Inf,Inf],[0.,0.,0.],[4., 1.],[Inf,Inf], :Min)
MathProgBase.setquadobj!(m,diagm(0 => [10.0,10.0,10.0]))
rows = [1, 2, 2, 2, 3, 3, 3]
cols = [1, 1, 1, 2, 2, 3, 3]
vals = Float64[2, 0.5, 0.5, 2, 1, 1, 1]
MathProgBase.setquadobj!(m,rows,cols,vals)
MathProgBase.optimize!(m)
stat = MathProgBase.status(m)
@test stat == :Optimal
@test isapprox(MathProgBase.getobjval(m), 130/70, atol=1e-6)
@test isapprox(norm(MathProgBase.getsolution(m) - [0.5714285714285715,0.4285714285714285,0.8571428571428572]), 0.0, atol=1e-6)
end
@testset "QP2" begin
m = MathProgBase.LinearQuadraticModel(solver)
MathProgBase.loadproblem!(m, [-1. 1.; 1. 1.], [0.,0.], [Inf,Inf], [1.,1.], [0.,0.], [Inf,Inf], :Max)
MathProgBase.addquadconstr!(m, [2], [1.], [1], [1], [1.], '<', 2)
MathProgBase.optimize!(m)
stat = MathProgBase.status(m)
@test stat == :Optimal
@test isapprox(MathProgBase.getobjval(m), 2.25, atol=1e-6)
@test isapprox(norm(MathProgBase.getsolution(m) - [0.5,1.75]), 0.0, atol=1e-3)
end
end
end
function qpdualtest(solver)
@testset "Testing QP duals with $solver" begin
# max x
# s.t. x^2 <= 2
@testset "QP1" begin
m = MathProgBase.LinearQuadraticModel(solver)
MathProgBase.loadproblem!(m, zeros(0,1), [-Inf], [Inf], [1.0], Float64[], Float64[], :Max)
MathProgBase.addquadconstr!(m, [], [], [1], [1], [1.0], '<', 2.0)
MathProgBase.optimize!(m)
stat = MathProgBase.status(m)
@test MathProgBase.numlinconstr(m) == 0
@test MathProgBase.numquadconstr(m) == 1
@test MathProgBase.numconstr(m) == 1
@test stat == :Optimal
@test isapprox(MathProgBase.getobjval(m), sqrt(2), atol=1e-6)
@test isapprox(MathProgBase.getsolution(m)[1], sqrt(2), atol=1e-6)
@test isapprox(MathProgBase.getquadconstrduals(m)[1], 0.5/sqrt(2), atol=1e-6)
end
# min -x
# s.t. x^2 <= 2
@testset "QP2" begin
m = MathProgBase.LinearQuadraticModel(solver)
MathProgBase.loadproblem!(m, zeros(0,1), [-Inf], [Inf], [-1.0], Float64[], Float64[], :Min)
MathProgBase.addquadconstr!(m, [], [], [1], [1], [1.0], '<', 2.0)
MathProgBase.optimize!(m)
stat = MathProgBase.status(m)
@test MathProgBase.numlinconstr(m) == 0
@test MathProgBase.numquadconstr(m) == 1
@test MathProgBase.numconstr(m) == 1
@test stat == :Optimal
@test isapprox(MathProgBase.getobjval(m), -sqrt(2), atol=1e-6)
@test isapprox(MathProgBase.getsolution(m)[1], sqrt(2), atol=1e-6)
@test isapprox(MathProgBase.getquadconstrduals(m)[1], -0.5/sqrt(2), atol=1e-6)
end
end
end
function socptest(solver)
@testset "Testing SOCP interface with $solver" begin
# min t
# s.t. x + y >= 1
# x^2 + y^2 <= t^2
# t >= 0
m = MathProgBase.LinearQuadraticModel(solver)
MathProgBase.loadproblem!(m, [ 1.0 1.0 0.0 ], [-Inf,-Inf,0.0], [Inf,Inf,Inf], [0.0,0.0,1.0], [1.0],[Inf], :Min)
MathProgBase.addquadconstr!(m, [], [], [1,2,3], [1,2,3], [1.0,1.0,-1.0],'<',0.0)
MathProgBase.optimize!(m)
stat = MathProgBase.status(m)
@test stat == :Optimal
@test isapprox(MathProgBase.getobjval(m), sqrt(1/2), atol=1e-6)
@test isapprox(norm(MathProgBase.getsolution(m) - [0.5,0.5,sqrt(1/2)]), 0.0, atol=1e-3)
end
end