From 8caa926ff4632c2e2edef4091c979e056c41aefc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Mon, 18 Sep 2017 22:56:40 +0200 Subject: [PATCH 1/5] Fix #8 --- .travis.yml | 2 ++ appveyor.yml | 1 + src/constraint.jl | 20 +++++--------------- test/domain.jl | 1 + 4 files changed, 9 insertions(+), 15 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4c1153ca5..06274f5e6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,6 +16,8 @@ before_install: if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install liblapack-dev libblas-dev; # For CSDP fi +before_script: + - julia -e 'Pkg.add("SemialgebraicSets"); Pkg.checkout("SemialgebraicSets")' after_success: # push coverage results to Coveralls - julia -e 'cd(Pkg.dir("SumOfSquares")); Pkg.add("Coverage"); using Coverage; Coveralls.submit(Coveralls.process_folder())' diff --git a/appveyor.yml b/appveyor.yml index a84b04a28..703ce5f03 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -27,6 +27,7 @@ build_script: # Need to convert from shallow to complete for Pkg.clone to work - IF EXIST .git\shallow (git fetch --unshallow) - C:\projects\julia\bin\julia -e "versioninfo(); + Pkg.add(\"SemialgebraicSets\"); Pkg.checkout(\"SemialgebraicSets\"); Pkg.clone(pwd(), \"SumOfSquares\"); Pkg.build(\"SumOfSquares\")" test_script: diff --git a/src/constraint.jl b/src/constraint.jl index 09b4e9b1c..5f2326518 100644 --- a/src/constraint.jl +++ b/src/constraint.jl @@ -20,10 +20,7 @@ function addpolyconstraint!(m::JuMP.Model, p, s::ZeroPoly, domain::FullSpace) end function addpolyconstraint!(m::JuMP.Model, p, s::ZeroPoly, domain::AlgebraicSet) - if !isempty(domain.p) - warn("Equality on algebraic set has not been implemented yet, ignoring the domain") - end - addpolyconstraint!(m, p, FullSpace()) + addpolyconstraint!(m, rem(p, ideal(domain)), s, FullSpace()) end 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 addpolyconstraint!(m, p, NonNegPoly(), domain) end -function addpolyconstraint!(m::JuMP.Model, p, ::Union{NonNegPoly, SOSCone}, domain::FullSpace) - # FIXME If p is a MatPolynomial, p.x will not be correct - Z = getmonomialsforcertificate(monomials(p)) +function addpolyconstraint!(m::JuMP.Model, p, ::NonNegPolySubCones, domain::AbstractAlgebraicSet) + r = rem(p, ideal(domain)) + Z = getmonomialsforcertificate(monomials(r)) slack = createpoly(m, Poly{true}(Z), :Cont) - q = p - slack + q = r - slack lincons = addpolyconstraint!(m, q, ZeroPoly(), domain) SOSConstraint(slack, lincons, monomials(q)) end -function addpolyconstraint!(m::JuMP.Model, p, s::NonNegPolySubCones, domain::AlgebraicSet) - if !isempty(equalities(domain)) - warn("Equality on algebraic set has not been implemented yet, ignoring the domain") - end - addpolyconstraint!(m, p, s, FullSpace()) -end - function addpolyconstraint!(m::JuMP.Model, p, set::NonNegPolySubCones, domain::BasicSemialgebraicSet) mindeg, maxdeg = extdegree(p) for q in domain.p diff --git a/test/domain.jl b/test/domain.jl index 4e17e511b..33c686956 100644 --- a/test/domain.jl +++ b/test/domain.jl @@ -1,2 +1,3 @@ include("sosdemo7.jl") include("sosdemo8.jl") +include("BPT12e399.jl") From 30d8c051b15fa7303d4e57eeaca3682a957c1da1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Tue, 19 Sep 2017 10:47:28 +0200 Subject: [PATCH 2/5] Fix CI --- .travis.yml | 1 + appveyor.yml | 1 + src/constraint.jl | 6 +++--- test/BPT12e399.jl | 31 +++++++++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 test/BPT12e399.jl diff --git a/.travis.yml b/.travis.yml index 06274f5e6..f3abbdb8b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,6 +18,7 @@ before_install: fi before_script: - julia -e 'Pkg.add("SemialgebraicSets"); Pkg.checkout("SemialgebraicSets")' + - julia -e 'Pkg.checkout(\"MultivariatePolynomials\")' after_success: # push coverage results to Coveralls - julia -e 'cd(Pkg.dir("SumOfSquares")); Pkg.add("Coverage"); using Coverage; Coveralls.submit(Coveralls.process_folder())' diff --git a/appveyor.yml b/appveyor.yml index 703ce5f03..2ab781c33 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -28,6 +28,7 @@ build_script: - IF EXIST .git\shallow (git fetch --unshallow) - C:\projects\julia\bin\julia -e "versioninfo(); Pkg.add(\"SemialgebraicSets\"); Pkg.checkout(\"SemialgebraicSets\"); + Pkg.checkout(\"MultivariatePolynomials\"); Pkg.clone(pwd(), \"SumOfSquares\"); Pkg.build(\"SumOfSquares\")" test_script: diff --git a/src/constraint.jl b/src/constraint.jl index 5f2326518..5c91340c9 100644 --- a/src/constraint.jl +++ b/src/constraint.jl @@ -19,7 +19,7 @@ function addpolyconstraint!(m::JuMP.Model, p, s::ZeroPoly, domain::FullSpace) JuMP.addVectorizedConstraint(m, constraints) end -function addpolyconstraint!(m::JuMP.Model, p, s::ZeroPoly, domain::AlgebraicSet) +function addpolyconstraint!(m::JuMP.Model, p, s::ZeroPoly, domain::AbstractAlgebraicSet) addpolyconstraint!(m, rem(p, ideal(domain)), s, FullSpace()) end @@ -41,8 +41,8 @@ end function addpolyconstraint!(m::JuMP.Model, p, ::NonNegPolySubCones, domain::AbstractAlgebraicSet) r = rem(p, ideal(domain)) - Z = getmonomialsforcertificate(monomials(r)) - slack = createpoly(m, Poly{true}(Z), :Cont) + X = getmonomialsforcertificate(monomials(r)) + slack = createpoly(m, Poly{true}(X), :Cont) q = r - slack lincons = addpolyconstraint!(m, q, ZeroPoly(), domain) SOSConstraint(slack, lincons, monomials(q)) diff --git a/test/BPT12e399.jl b/test/BPT12e399.jl new file mode 100644 index 000000000..654832417 --- /dev/null +++ b/test/BPT12e399.jl @@ -0,0 +1,31 @@ +# Adapted from: +# Example 3.99 of +# Blekherman, G.; Parrilo, P. & Thomas, R. +# Semidefinite Optimization and Convex Algebraic Geometry +# Society for Industrial and Applied Mathematics, 2012 + +@testset "[BPT12] Example 3.99 with $solver" for solver in sdp_solvers + @polyvar x y + + m = SOSModel(solver = solver) + + @variable m α + + @constraint(m, x^2 + α*y <= 10, domain = @set x^2 + y^2 == 1) + + @objective m Max α + + status = solve(m) + + @test status == :Optimal + + @test getvalue(α) ≈ 6 atol=1e-6 + + @objective m Min α + + status = solve(m) + + @test status == :Optimal + + @test getvalue(α) ≈ -6 atol=1e-6 +end From 6a840f8f78e540bba5575875fc4f080d0e4e1fb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Tue, 19 Sep 2017 14:19:00 +0200 Subject: [PATCH 3/5] Fix CI --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f3abbdb8b..2a22ab738 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,7 @@ before_install: fi before_script: - julia -e 'Pkg.add("SemialgebraicSets"); Pkg.checkout("SemialgebraicSets")' - - julia -e 'Pkg.checkout(\"MultivariatePolynomials\")' + - julia -e 'Pkg.checkout("MultivariatePolynomials")' after_success: # push coverage results to Coveralls - julia -e 'cd(Pkg.dir("SumOfSquares")); Pkg.add("Coverage"); using Coverage; Coveralls.submit(Coveralls.process_folder())' From 020dc6ceea7dd24578d58fb6160f3e2fab2c9a95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Tue, 19 Sep 2017 14:20:04 +0200 Subject: [PATCH 4/5] Readd CSDP --- test/solvers.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/solvers.jl b/test/solvers.jl index 9cd0fced0..abdf36c93 100644 --- a/test/solvers.jl +++ b/test/solvers.jl @@ -10,7 +10,7 @@ function try_import(name::Symbol) end mos = try_import(:Mosek) -csd = false && try_import(:CSDP) +csd = try_import(:CSDP) scs = try_import(:SCS) isscs(solver) = contains(string(typeof(solver)),"SCSSolver") From 8e17864f966a0d742f2a6e6579b2455cf35b566f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Tue, 19 Sep 2017 17:51:19 +0200 Subject: [PATCH 5/5] Update REQUIRE --- .travis.yml | 3 --- REQUIRE | 3 ++- appveyor.yml | 2 -- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2a22ab738..4c1153ca5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,9 +16,6 @@ before_install: if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install liblapack-dev libblas-dev; # For CSDP fi -before_script: - - julia -e 'Pkg.add("SemialgebraicSets"); Pkg.checkout("SemialgebraicSets")' - - julia -e 'Pkg.checkout("MultivariatePolynomials")' after_success: # push coverage results to Coveralls - julia -e 'cd(Pkg.dir("SumOfSquares")); Pkg.add("Coverage"); using Coverage; Coveralls.submit(Coveralls.process_folder())' diff --git a/REQUIRE b/REQUIRE index f7567f16d..4cc5ed828 100644 --- a/REQUIRE +++ b/REQUIRE @@ -1,5 +1,6 @@ julia 0.6 -MultivariatePolynomials 0.1.0 +MultivariatePolynomials 0.1.1 +SemialgebraicSets 0.0.2 MultivariateMoments JuMP PolyJuMP 0.1.0 diff --git a/appveyor.yml b/appveyor.yml index 2ab781c33..a84b04a28 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -27,8 +27,6 @@ build_script: # Need to convert from shallow to complete for Pkg.clone to work - IF EXIST .git\shallow (git fetch --unshallow) - C:\projects\julia\bin\julia -e "versioninfo(); - Pkg.add(\"SemialgebraicSets\"); Pkg.checkout(\"SemialgebraicSets\"); - Pkg.checkout(\"MultivariatePolynomials\"); Pkg.clone(pwd(), \"SumOfSquares\"); Pkg.build(\"SumOfSquares\")" test_script: