Skip to content

Commit 768ea9c

Browse files
authored
Merge pull request #29 from JuliaOpt/fix8
Fix #8
2 parents efcd6bd + 8e17864 commit 768ea9c

File tree

5 files changed

+42
-19
lines changed

5 files changed

+42
-19
lines changed

REQUIRE

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
julia 0.6
2-
MultivariatePolynomials 0.1.0
2+
MultivariatePolynomials 0.1.1
3+
SemialgebraicSets 0.0.2
34
MultivariateMoments
45
JuMP
56
PolyJuMP 0.1.0

src/constraint.jl

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,8 @@ function addpolyconstraint!(m::JuMP.Model, p, s::ZeroPoly, domain::FullSpace)
1919
JuMP.addVectorizedConstraint(m, constraints)
2020
end
2121

22-
function addpolyconstraint!(m::JuMP.Model, p, s::ZeroPoly, domain::AlgebraicSet)
23-
if !isempty(domain.p)
24-
warn("Equality on algebraic set has not been implemented yet, ignoring the domain")
25-
end
26-
addpolyconstraint!(m, p, FullSpace())
22+
function addpolyconstraint!(m::JuMP.Model, p, s::ZeroPoly, domain::AbstractAlgebraicSet)
23+
addpolyconstraint!(m, rem(p, ideal(domain)), s, FullSpace())
2724
end
2825

2926
function addpolyconstraint!(m::JuMP.Model, p, s::ZeroPoly, domain::BasicSemialgebraicSet)
@@ -42,22 +39,15 @@ function addpolyconstraint!(m::JuMP.Model, P::Matrix{PT}, ::PSDCone, domain::Abs
4239
addpolyconstraint!(m, p, NonNegPoly(), domain)
4340
end
4441

45-
function addpolyconstraint!(m::JuMP.Model, p, ::Union{NonNegPoly, SOSCone}, domain::FullSpace)
46-
# FIXME If p is a MatPolynomial, p.x will not be correct
47-
Z = getmonomialsforcertificate(monomials(p))
48-
slack = createpoly(m, Poly{true}(Z), :Cont)
49-
q = p - slack
42+
function addpolyconstraint!(m::JuMP.Model, p, ::NonNegPolySubCones, domain::AbstractAlgebraicSet)
43+
r = rem(p, ideal(domain))
44+
X = getmonomialsforcertificate(monomials(r))
45+
slack = createpoly(m, Poly{true}(X), :Cont)
46+
q = r - slack
5047
lincons = addpolyconstraint!(m, q, ZeroPoly(), domain)
5148
SOSConstraint(slack, lincons, monomials(q))
5249
end
5350

54-
function addpolyconstraint!(m::JuMP.Model, p, s::NonNegPolySubCones, domain::AlgebraicSet)
55-
if !isempty(equalities(domain))
56-
warn("Equality on algebraic set has not been implemented yet, ignoring the domain")
57-
end
58-
addpolyconstraint!(m, p, s, FullSpace())
59-
end
60-
6151
function addpolyconstraint!(m::JuMP.Model, p, set::NonNegPolySubCones, domain::BasicSemialgebraicSet)
6252
mindeg, maxdeg = extdegree(p)
6353
for q in domain.p

test/BPT12e399.jl

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Adapted from:
2+
# Example 3.99 of
3+
# Blekherman, G.; Parrilo, P. & Thomas, R.
4+
# Semidefinite Optimization and Convex Algebraic Geometry
5+
# Society for Industrial and Applied Mathematics, 2012
6+
7+
@testset "[BPT12] Example 3.99 with $solver" for solver in sdp_solvers
8+
@polyvar x y
9+
10+
m = SOSModel(solver = solver)
11+
12+
@variable m α
13+
14+
@constraint(m, x^2 + α*y <= 10, domain = @set x^2 + y^2 == 1)
15+
16+
@objective m Max α
17+
18+
status = solve(m)
19+
20+
@test status == :Optimal
21+
22+
@test getvalue(α) 6 atol=1e-6
23+
24+
@objective m Min α
25+
26+
status = solve(m)
27+
28+
@test status == :Optimal
29+
30+
@test getvalue(α) -6 atol=1e-6
31+
end

test/domain.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
include("sosdemo7.jl")
22
include("sosdemo8.jl")
3+
include("BPT12e399.jl")

test/solvers.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ function try_import(name::Symbol)
1010
end
1111

1212
mos = try_import(:Mosek)
13-
csd = false && try_import(:CSDP)
13+
csd = try_import(:CSDP)
1414
scs = try_import(:SCS)
1515

1616
isscs(solver) = contains(string(typeof(solver)),"SCSSolver")

0 commit comments

Comments
 (0)