From bf89589b552ddf2ed681911c7bbf25b8d1ba3c34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Sun, 17 Sep 2023 22:30:01 +0200 Subject: [PATCH 1/4] Add QCQP to polynomial optimization example --- docs/Project.toml | 3 ++ .../polynomial_optimization.jl | 30 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/docs/Project.toml b/docs/Project.toml index b10a7e207..c3f94d7a6 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -1,4 +1,5 @@ [deps] +Alpine = "07493b3f-dabb-5b16-a503-4139292d7dd4" BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" CSDP = "0a46da34-8e4b-519e-b418-48813639ff34" Clarabel = "61c947e1-3e6d-4ee4-985a-eec8c727bd6e" @@ -10,6 +11,7 @@ Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" Dualization = "191a621a-6537-11e9-281d-650236a99e60" DynamicPolynomials = "7c1d4256-1411-5781-91ec-d7bc3513ac07" GroupsCore = "d5909c97-4eac-4ecc-a3dc-fdd0858a4120" +HiGHS = "87dc4568-4c63-4d18-b0c0-bb2238e4078b" HomotopyContinuation = "f213a82b-91d6-5c5d-acf7-10f1c761b327" ImplicitPlots = "55ecb840-b828-11e9-1645-43f4a9f9ace7" Ipopt = "b6b21f68-93f8-5de0-b562-5493be1d77c9" @@ -22,6 +24,7 @@ MultivariateBases = "be282fd4-ad43-11e9-1d11-8bd9d7e43378" MultivariateMoments = "f4abf1af-0426-5881-a0da-e2f168889b5e" MultivariatePolynomials = "102ac46a-7ee4-5c85-9060-abc95bfdeaa3" MutableArithmetics = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" +Pavito = "cd433a01-47d1-575d-afb7-6db927ee8d8f" PermutationGroups = "8bc5a954-2dfc-11e9-10e6-cd969bffa420" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" PolyJuMP = "ddf597a6-d67e-5340-b84c-e37d84115374" diff --git a/docs/src/tutorials/Polynomial Optimization/polynomial_optimization.jl b/docs/src/tutorials/Polynomial Optimization/polynomial_optimization.jl index a4af265a8..d3ba9f2d1 100644 --- a/docs/src/tutorials/Polynomial Optimization/polynomial_optimization.jl +++ b/docs/src/tutorials/Polynomial Optimization/polynomial_optimization.jl @@ -93,6 +93,36 @@ solution_summary(gmodel) @test value(b) ≈ 0.5 rtol=1e-5 #src value(a), value(b) +# ## QCQP approach + +import Alpine, HiGHS, Pavito +ipopt = optimizer_with_attributes( + Ipopt.Optimizer, + MOI.Silent() => true, + #"sb" => "yes", + #"max_iter" => 9999, +) +highs = optimizer_with_attributes( + HiGHS.Optimizer, + "presolve" => "on", + "log_to_console" => false, +) +pavito = optimizer_with_attributes( + Pavito.Optimizer, + MOI.Silent() => true, + "mip_solver" => highs, + "cont_solver" => ipopt, + "mip_solver_drives" => false, +) +alpine = optimizer_with_attributes( + Alpine.Optimizer, + "nlp_solver" => ipopt, + "mip_solver" => pavito, +) +set_optimizer(model, () -> PolyJuMP.QCQP.Optimizer(alpine)) +@NLobjective(model, Min, a^3 - a^2 + 2a*b - b^2 + b^3) +optimize!(model) + # ## Sum-of-Squares approach # We will now see how to find the optimal solution using Sum of Squares Programming. From d2f4ee4328f8f5841fc4cb36a34be488542c1d98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Tue, 19 Sep 2023 10:29:38 +0200 Subject: [PATCH 2/4] Fixes --- .github/workflows/ci.yml | 5 +++++ .../polynomial_optimization.jl | 17 ++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b7da3d4db..c90fc3dd0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -40,6 +40,11 @@ jobs: ${{ runner.os }}-test-${{ env.cache-name }}- ${{ runner.os }}-test- ${{ runner.os }}- + - name: PolyJuMP + shell: julia --project=@. {0} + run: | + using Pkg + Pkg.add(PackageSpec(url="https://github.com/jump-dev/PolyJuMP.jl.git", rev="bl/qcqp")) - uses: julia-actions/julia-buildpkg@v1 - uses: julia-actions/julia-runtest@v1 with: diff --git a/docs/src/tutorials/Polynomial Optimization/polynomial_optimization.jl b/docs/src/tutorials/Polynomial Optimization/polynomial_optimization.jl index d3ba9f2d1..d1b540a9f 100644 --- a/docs/src/tutorials/Polynomial Optimization/polynomial_optimization.jl +++ b/docs/src/tutorials/Polynomial Optimization/polynomial_optimization.jl @@ -32,10 +32,10 @@ p(x=>1, y=>0), p(x=>1//2, y=>1//2), p(x=>0, y=>1) import Ipopt model = Model(Ipopt.Optimizer) -@variable(model, a >= 0) -@variable(model, b >= 0) +@variable(model, 0 <= a) +@variable(model, 0 <= b) @constraint(model, a + b >= 1) -@NLobjective(model, Min, a^3 - a^2 + 2a*b - b^2 + b^3) +@objective(model, Min, a^3 - a^2 + 2a*b - b^2 + b^3) optimize!(model) # As we can see below, the termination status is `LOCALLY_SOLVED` and not of `OPTIMAL` @@ -95,7 +95,7 @@ value(a), value(b) # ## QCQP approach -import Alpine, HiGHS, Pavito +import Alpine, HiGHS, Ipopt, Pavito ipopt = optimizer_with_attributes( Ipopt.Optimizer, MOI.Silent() => true, @@ -120,9 +120,16 @@ alpine = optimizer_with_attributes( "mip_solver" => pavito, ) set_optimizer(model, () -> PolyJuMP.QCQP.Optimizer(alpine)) -@NLobjective(model, Min, a^3 - a^2 + 2a*b - b^2 + b^3) optimize!(model) +# We can see the summary here: + +solution_summary(m) + +# It found the optimal solution + +value(a), value(b) + # ## Sum-of-Squares approach # We will now see how to find the optimal solution using Sum of Squares Programming. From 5c11f0d0c4eb14c98ad53fb7304d423fd0f65943 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Sun, 24 Sep 2023 21:04:28 +0200 Subject: [PATCH 3/4] Fix --- .../polynomial_optimization.jl | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/docs/src/tutorials/Polynomial Optimization/polynomial_optimization.jl b/docs/src/tutorials/Polynomial Optimization/polynomial_optimization.jl index d1b540a9f..c2f946910 100644 --- a/docs/src/tutorials/Polynomial Optimization/polynomial_optimization.jl +++ b/docs/src/tutorials/Polynomial Optimization/polynomial_optimization.jl @@ -32,8 +32,8 @@ p(x=>1, y=>0), p(x=>1//2, y=>1//2), p(x=>0, y=>1) import Ipopt model = Model(Ipopt.Optimizer) -@variable(model, 0 <= a) -@variable(model, 0 <= b) +@variable(model, a >= 0) +@variable(model, b >= 0) @constraint(model, a + b >= 1) @objective(model, Min, a^3 - a^2 + 2a*b - b^2 + b^3) optimize!(model) @@ -99,8 +99,6 @@ import Alpine, HiGHS, Ipopt, Pavito ipopt = optimizer_with_attributes( Ipopt.Optimizer, MOI.Silent() => true, - #"sb" => "yes", - #"max_iter" => 9999, ) highs = optimizer_with_attributes( HiGHS.Optimizer, @@ -119,16 +117,12 @@ alpine = optimizer_with_attributes( "nlp_solver" => ipopt, "mip_solver" => pavito, ) -set_optimizer(model, () -> PolyJuMP.QCQP.Optimizer(alpine)) +set_optimizer(model, () -> PolyJuMP.QCQP.Optimizer(MOI.instantiate(alpine))) optimize!(model) -# We can see the summary here: +# We can see that it found the optimal solution -solution_summary(m) - -# It found the optimal solution - -value(a), value(b) +termination_status(model), value(a), value(b) # ## Sum-of-Squares approach From 9b01262c4be32ab18fe74b1aca059a4c7a4fd238 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Wed, 6 Dec 2023 08:18:11 +0100 Subject: [PATCH 4/4] Use released PolyJuMP --- .github/workflows/ci.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c90fc3dd0..b7da3d4db 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -40,11 +40,6 @@ jobs: ${{ runner.os }}-test-${{ env.cache-name }}- ${{ runner.os }}-test- ${{ runner.os }}- - - name: PolyJuMP - shell: julia --project=@. {0} - run: | - using Pkg - Pkg.add(PackageSpec(url="https://github.com/jump-dev/PolyJuMP.jl.git", rev="bl/qcqp")) - uses: julia-actions/julia-buildpkg@v1 - uses: julia-actions/julia-runtest@v1 with: