From 052b0b832e919df37cd9ffabff87d069a6273fe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Fri, 14 Dec 2018 10:38:15 +0100 Subject: [PATCH 1/5] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20MOI=20v0.6=20->=20v0.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- REQUIRE | 2 +- docs/src/quickstart.md | 8 ++++---- examples/cannery.jl | 2 +- examples/diet.jl | 4 ++-- examples/multi.jl | 2 +- examples/prod.jl | 2 +- examples/steelT3.jl | 2 +- examples/sudoku.jl | 2 +- examples/transp.jl | 2 +- examples/urbanplan.jl | 2 +- test/generate_and_solve.jl | 24 ++++++++++++------------ test/nlp_solver.jl | 36 ++++++++++++++++++------------------ 12 files changed, 44 insertions(+), 44 deletions(-) diff --git a/REQUIRE b/REQUIRE index b62a93944c4..7ab83d8feb6 100644 --- a/REQUIRE +++ b/REQUIRE @@ -1,5 +1,5 @@ julia 0.7 -MathOptInterface 0.6.3 0.7 +MathOptInterface 0.7 0.8 ForwardDiff 0.5 0.11 Calculus DataStructures diff --git a/docs/src/quickstart.md b/docs/src/quickstart.md index 35500114ba5..284625251c3 100644 --- a/docs/src/quickstart.md +++ b/docs/src/quickstart.md @@ -99,7 +99,7 @@ DocTestSetup = quote # Now we load in the solution. Using a caching optimizer removes the need to # load a solver such as GLPK for building the documentation. mock = JuMP.backend(model).optimizer.model - MOI.set(mock, MOI.TerminationStatus(), MOI.Success) + MOI.set(mock, MOI.TerminationStatus(), MOI.Optimal) MOI.set(mock, MOI.PrimalStatus(), MOI.FeasiblePoint) MOI.set(mock, MOI.DualStatus(), MOI.FeasiblePoint) MOI.set(mock, MOI.ResultCount(), 1) @@ -120,9 +120,9 @@ to a setting such as a time limit. We can ask the solver why it stopped using the `JuMP.termination_status` function: ```jldoctest quickstart_example julia> JuMP.termination_status(model) -Success::TerminationStatusCode = 1 +Optimal::TerminationStatusCode = 1 ``` -In this case, `GLPK` returned `Success`. This does *not* mean that it has found +In this case, `GLPK` returned `Optimal`. This does *not* mean that it has found the optimal solution. Instead, it indicates that GLPK has finished running and did not encounter any errors or user-provided termination limits. @@ -137,7 +137,7 @@ julia> JuMP.primal_status(model) FeasiblePoint::ResultStatusCode = 1 ``` This indicates that GLPK has found a `FeasiblePoint` to the primal problem. -Coupled with the `Success` from `JuMP.termination_status`, we can infer that GLPK +Coupled with the `Optimal` from `JuMP.termination_status`, we can infer that GLPK has indeed found the optimal solution. We can also query `JuMP.dual_status`: ```jldoctest quickstart_example julia> JuMP.dual_status(model) diff --git a/examples/cannery.jl b/examples/cannery.jl index c6dbb40c583..7cc46516db1 100644 --- a/examples/cannery.jl +++ b/examples/cannery.jl @@ -53,7 +53,7 @@ function solveCannery(plants, markets, capacity, demand, distance, freight) term_status = JuMP.termination_status(cannery) primal_status = JuMP.primal_status(cannery) - is_optimal = term_status == MOI.Success && primal_status == MOI.FeasiblePoint + is_optimal = term_status == MOI.Optimal && primal_status == MOI.FeasiblePoint PrintSolution(is_optimal, plants, markets, ship) return is_optimal diff --git a/examples/diet.jl b/examples/diet.jl index f4ee81c0706..5dfd496bb0a 100644 --- a/examples/diet.jl +++ b/examples/diet.jl @@ -74,7 +74,7 @@ function SolveDiet() JuMP.optimize!(m) term_status = JuMP.termination_status(m) primal_status = JuMP.primal_status(m) - is_optimal = term_status == MOI.Success && primal_status == MOI.FeasiblePoint + is_optimal = term_status == MOI.Optimal && primal_status == MOI.FeasiblePoint PrintSolution(is_optimal, foods, buy) @@ -85,7 +85,7 @@ function SolveDiet() JuMP.optimize!(m) term_status = JuMP.termination_status(m) primal_status = JuMP.primal_status(m) - is_optimal = term_status == MOI.Success && primal_status == MOI.FeasiblePoint + is_optimal = term_status == MOI.Optimal && primal_status == MOI.FeasiblePoint PrintSolution(is_optimal, foods, buy) end diff --git a/examples/multi.jl b/examples/multi.jl index ee15ffeb592..53188b10074 100644 --- a/examples/multi.jl +++ b/examples/multi.jl @@ -105,6 +105,6 @@ JuMP.optimize!(multi) term_status = JuMP.termination_status(multi) primal_status = JuMP.primal_status(multi) -is_optimal = term_status == MOI.Success && primal_status == MOI.FeasiblePoint +is_optimal = term_status == MOI.Optimal && primal_status == MOI.FeasiblePoint PrintSolution(is_optimal, Trans, orig, dest, prod) diff --git a/examples/prod.jl b/examples/prod.jl index 4d73818120e..a4fd1c8fb78 100644 --- a/examples/prod.jl +++ b/examples/prod.jl @@ -253,6 +253,6 @@ JuMP.optimize!(prod) term_status = JuMP.termination_status(prod) primal_status = JuMP.primal_status(prod) -is_optimal = status == MOI.Success && primal_status == MOI.FeasiblePoint +is_optimal = status == MOI.Optimal && primal_status == MOI.FeasiblePoint PrintSolution(is_optimal, Crews, Hire, Layoff) diff --git a/examples/steelT3.jl b/examples/steelT3.jl index 3002241cc95..4d64a900241 100644 --- a/examples/steelT3.jl +++ b/examples/steelT3.jl @@ -123,6 +123,6 @@ JuMP.optimize!(Prod) term_status = JuMP.termination_status(Prod) primal_status = JuMP.primal_status(Prod) -is_optimal = status == MOI.Success && primal_status == MOI.FeasiblePoint +is_optimal = status == MOI.Optimal && primal_status == MOI.FeasiblePoint PrintSolution(is_optimal, area, Make, Inv, Sell, prod, T) diff --git a/examples/sudoku.jl b/examples/sudoku.jl index 93646a4eba1..27ea4e54f65 100644 --- a/examples/sudoku.jl +++ b/examples/sudoku.jl @@ -65,7 +65,7 @@ function SolveModel(initgrid) term_status = JuMP.termination_status(m) primal_status = JuMP.primal_status(m) - is_optimal = term_status == MOI.Success && primal_status == MOI.FeasiblePoint + is_optimal = term_status == MOI.Optimal && primal_status == MOI.FeasiblePoint # Check solution if is_optimal diff --git a/examples/transp.jl b/examples/transp.jl index 00e48d71ac3..b4485611e60 100644 --- a/examples/transp.jl +++ b/examples/transp.jl @@ -48,7 +48,7 @@ JuMP.optimize!(m) term_status = JuMP.termination_status(m) primal_status = JuMP.primal_status(m) -is_optimal = term_status == MOI.Success && primal_status == MOI.FeasiblePoint +is_optimal = term_status == MOI.Optimal && primal_status == MOI.FeasiblePoint if is_optimal @printf("Optimal!\n") diff --git a/examples/urbanplan.jl b/examples/urbanplan.jl index ce3221ef7ca..c4403ca2629 100644 --- a/examples/urbanplan.jl +++ b/examples/urbanplan.jl @@ -70,7 +70,7 @@ function SolveUrban() term_status = JuMP.termination_status(m) primal_status = JuMP.primal_status(m) - is_optimal = term_status == MOI.Success && primal_status == MOI.FeasiblePoint + is_optimal = term_status == MOI.Optimal && primal_status == MOI.FeasiblePoint if ! is_optimal error("The solver did not find an optimal solution.") diff --git a/test/generate_and_solve.jl b/test/generate_and_solve.jl index af1896e02d6..23d42c703b5 100644 --- a/test/generate_and_solve.jl +++ b/test/generate_and_solve.jl @@ -44,7 +44,7 @@ eval_objective_value=false)) mockoptimizer = JuMP.backend(m).optimizer.model - MOI.set(mockoptimizer, MOI.TerminationStatus(), MOI.Success) + MOI.set(mockoptimizer, MOI.TerminationStatus(), MOI.Optimal) MOI.set(mockoptimizer, MOI.ObjectiveValue(), -1.0) MOI.set(mockoptimizer, MOI.ResultCount(), 1) MOI.set(mockoptimizer, MOI.PrimalStatus(), MOI.FeasiblePoint) @@ -58,7 +58,7 @@ #@test JuMP.isattached(m) @test JuMP.has_values(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.Optimal @test JuMP.primal_status(m) == MOI.FeasiblePoint @test JuMP.value(x) == 1.0 @@ -82,7 +82,7 @@ @objective(m, Min, -x) c = @constraint(m, x + y <= 1) - MOI.set(mockoptimizer, MOI.TerminationStatus(), MOI.Success) + MOI.set(mockoptimizer, MOI.TerminationStatus(), MOI.Optimal) MOI.set(mockoptimizer, MOI.ObjectiveValue(), -1.0) MOI.set(mockoptimizer, MOI.ResultCount(), 1) MOI.set(mockoptimizer, MOI.PrimalStatus(), MOI.FeasiblePoint) @@ -98,7 +98,7 @@ #@test JuMP.isattached(m) @test JuMP.has_values(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.Optimal @test JuMP.primal_status(m) == MOI.FeasiblePoint @test JuMP.value(x) == 1.0 @@ -143,7 +143,7 @@ MOIU.attachoptimizer!(m) mockoptimizer = JuMP.backend(m).optimizer.model - MOI.set(mockoptimizer, MOI.TerminationStatus(), MOI.Success) + MOI.set(mockoptimizer, MOI.TerminationStatus(), MOI.Optimal) MOI.set(mockoptimizer, MOI.ObjectiveValue(), 1.0) MOI.set(mockoptimizer, MOI.ResultCount(), 1) MOI.set(mockoptimizer, MOI.PrimalStatus(), MOI.FeasiblePoint) @@ -156,7 +156,7 @@ #@test JuMP.isattached(m) @test JuMP.has_values(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.Optimal @test JuMP.primal_status(m) == MOI.FeasiblePoint @test JuMP.value(x) == 1.0 @@ -193,7 +193,7 @@ eval_objective_value=false)) mockoptimizer = JuMP.backend(m).optimizer.model - MOI.set(mockoptimizer, MOI.TerminationStatus(), MOI.Success) + MOI.set(mockoptimizer, MOI.TerminationStatus(), MOI.Optimal) MOI.set(mockoptimizer, MOI.ObjectiveValue(), -1.0) MOI.set(mockoptimizer, MOI.ResultCount(), 1) MOI.set(mockoptimizer, MOI.PrimalStatus(), MOI.FeasiblePoint) @@ -207,7 +207,7 @@ #@test JuMP.isattached(m) @test JuMP.has_values(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.Optimal @test JuMP.primal_status(m) == MOI.FeasiblePoint @test JuMP.value(x) == 1.0 @@ -253,7 +253,7 @@ MOIU.resetoptimizer!(m, mockoptimizer) MOIU.attachoptimizer!(m) - MOI.set(mockoptimizer, MOI.TerminationStatus(), MOI.Success) + MOI.set(mockoptimizer, MOI.TerminationStatus(), MOI.Optimal) MOI.set(mockoptimizer, MOI.ResultCount(), 1) MOI.set(mockoptimizer, MOI.PrimalStatus(), MOI.FeasiblePoint) MOI.set(mockoptimizer, MOI.DualStatus(), MOI.FeasiblePoint) @@ -268,7 +268,7 @@ #@test JuMP.isattached(m) @test JuMP.has_values(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.Optimal @test JuMP.primal_status(m) == MOI.FeasiblePoint @test JuMP.value(x) == 1.0 @@ -314,7 +314,7 @@ MOIU.resetoptimizer!(m, mockoptimizer) MOIU.attachoptimizer!(m) - MOI.set(mockoptimizer, MOI.TerminationStatus(), MOI.Success) + MOI.set(mockoptimizer, MOI.TerminationStatus(), MOI.Optimal) MOI.set(mockoptimizer, MOI.ResultCount(), 1) MOI.set(mockoptimizer, MOI.PrimalStatus(), MOI.FeasiblePoint) MOI.set(mockoptimizer, MOI.DualStatus(), MOI.FeasiblePoint) @@ -330,7 +330,7 @@ JuMP.optimize!(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.Optimal @test JuMP.primal_status(m) == MOI.FeasiblePoint @test JuMP.has_values(m) diff --git a/test/nlp_solver.jl b/test/nlp_solver.jl index 8bc2acfcbab..8b880568fd8 100644 --- a/test/nlp_solver.jl +++ b/test/nlp_solver.jl @@ -47,7 +47,7 @@ const MOI = MathOptInterface JuMP.optimize!(m) @test JuMP.has_values(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.LocallySolved @test JuMP.primal_status(m) == MOI.FeasiblePoint @test JuMP.value.(x) ≈ [1.000000, 4.742999, 3.821150, 1.379408] atol=1e-3 @@ -78,7 +78,7 @@ const MOI = MathOptInterface JuMP.optimize!(m) @test JuMP.has_values(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.LocallySolved @test JuMP.primal_status(m) == MOI.FeasiblePoint @test JuMP.value.(x) ≈ [1.000000, 4.742999, 3.821150, 1.379408] atol=1e-3 @@ -126,7 +126,7 @@ const MOI = MathOptInterface JuMP.optimize!(m) @test JuMP.has_values(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.LocallySolved @test JuMP.primal_status(m) == MOI.FeasiblePoint @test JuMP.objective_value(m) ≈ 5326.851310161077 atol=1e-5 @@ -144,8 +144,8 @@ const MOI = MathOptInterface JuMP.optimize!(m) @test JuMP.has_values(m) - # Ipopt returns AlmostSuccess and NearlyFeasiblePoint on this instance. - # @test JuMP.termination_status(m) == MOI.Success + # Ipopt returns AlmostLocallySolved and NearlyFeasiblePoint on this instance. + # @test JuMP.termination_status(m) == MOI.LocallySolved # @test JuMP.primal_status(m) == MOI.FeasiblePoint @test JuMP.objective_value(m) ≈ -45.77846971 atol=1e-5 @@ -167,7 +167,7 @@ const MOI = MathOptInterface JuMP.optimize!(m) @test JuMP.has_values(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.LocallySolved @test JuMP.primal_status(m) == MOI.FeasiblePoint @test JuMP.objective_value(m) ≈ -47.76109026 atol=1e-5 @@ -188,7 +188,7 @@ const MOI = MathOptInterface JuMP.optimize!(m) @test JuMP.has_values(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.LocallySolved @test JuMP.primal_status(m) == MOI.FeasiblePoint @test JuMP.objective_value(m) ≈ -47.76109026 atol=1e-5 @@ -223,7 +223,7 @@ const MOI = MathOptInterface JuMP.optimize!(m) @test JuMP.has_values(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.LocallySolved @test JuMP.primal_status(m) == MOI.FeasiblePoint @test JuMP.objective_value(m) ≈ -1768.80696 atol=1e-3 @@ -269,7 +269,7 @@ const MOI = MathOptInterface JuMP.optimize!(m) @test JuMP.has_values(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.LocallySolved @test JuMP.primal_status(m) == MOI.FeasiblePoint # This test occasionally fails, for unknown reasons. @@ -337,7 +337,7 @@ const MOI = MathOptInterface JuMP.optimize!(m) @test JuMP.has_values(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.LocallySolved @test JuMP.primal_status(m) == MOI.FeasiblePoint @test JuMP.value.(x[1:4]) ≈ [8.0, 49.0, 3.0, 1.0] atol=1e-4 @@ -354,7 +354,7 @@ const MOI = MathOptInterface JuMP.optimize!(m) @test JuMP.has_values(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.LocallySolved @test JuMP.primal_status(m) == MOI.FeasiblePoint @test JuMP.objective_value(m) ≈ u atol=1e-6 @@ -362,7 +362,7 @@ const MOI = MathOptInterface JuMP.optimize!(m) @test JuMP.has_values(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.LocallySolved @test JuMP.primal_status(m) == MOI.FeasiblePoint @test JuMP.objective_value(m) ≈ l atol=1e-6 end @@ -377,7 +377,7 @@ const MOI = MathOptInterface JuMP.optimize!(m) @test JuMP.has_values(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.LocallySolved @test JuMP.primal_status(m) == MOI.FeasiblePoint @test JuMP.objective_value(m) ≈ u atol=1e-6 @@ -385,7 +385,7 @@ const MOI = MathOptInterface JuMP.optimize!(m) @test JuMP.has_values(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.LocallySolved @test JuMP.primal_status(m) == MOI.FeasiblePoint @test JuMP.objective_value(m) ≈ l atol=1e-6 end @@ -403,7 +403,7 @@ const MOI = MathOptInterface function test_result() @test JuMP.has_values(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.LocallySolved @test JuMP.primal_status(m) == MOI.FeasiblePoint @@ -455,7 +455,7 @@ const MOI = MathOptInterface JuMP.optimize!(m) @test JuMP.has_values(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.LocallySolved @test JuMP.primal_status(m) == MOI.FeasiblePoint @test JuMP.objective_value(m) ≈ -1-4/sqrt(3) atol=1e-6 @test JuMP.value(x) + JuMP.value(y) ≈ -1/3 atol=1e-3 @@ -470,7 +470,7 @@ const MOI = MathOptInterface JuMP.optimize!(m) @test JuMP.has_values(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.LocallySolved @test JuMP.primal_status(m) == MOI.FeasiblePoint @test JuMP.objective_value(m) ≈ -1-4/sqrt(3) atol=1e-6 @test JuMP.value(x) + JuMP.value(y) ≈ -1/3 atol=1e-3 @@ -484,7 +484,7 @@ const MOI = MathOptInterface JuMP.optimize!(m) @test JuMP.has_values(m) - @test JuMP.termination_status(m) == MOI.Success + @test JuMP.termination_status(m) == MOI.LocallySolved @test JuMP.primal_status(m) == MOI.FeasiblePoint @test JuMP.objective_value(m) ≈ sqrt(1/2) atol=1e-6 @test JuMP.value.(x) ≈ [sqrt(1/2), 0] atol=1e-6 From 87d8fe2a36bffafe66ea36667042479994c87f3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Fri, 14 Dec 2018 10:33:30 +0100 Subject: [PATCH 2/5] =?UTF-8?q?=F0=9F=93=9D=20Update=20interpretation=20of?= =?UTF-8?q?=20Optimal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/src/quickstart.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/src/quickstart.md b/docs/src/quickstart.md index 284625251c3..8a1b9a4e29b 100644 --- a/docs/src/quickstart.md +++ b/docs/src/quickstart.md @@ -122,9 +122,8 @@ the `JuMP.termination_status` function: julia> JuMP.termination_status(model) Optimal::TerminationStatusCode = 1 ``` -In this case, `GLPK` returned `Optimal`. This does *not* mean that it has found -the optimal solution. Instead, it indicates that GLPK has finished running and -did not encounter any errors or user-provided termination limits. +In this case, `GLPK` returned `Optimal`, this mean that it has found the optimal +solution. ```@meta DocTestSetup = nothing @@ -137,8 +136,9 @@ julia> JuMP.primal_status(model) FeasiblePoint::ResultStatusCode = 1 ``` This indicates that GLPK has found a `FeasiblePoint` to the primal problem. -Coupled with the `Optimal` from `JuMP.termination_status`, we can infer that GLPK -has indeed found the optimal solution. We can also query `JuMP.dual_status`: +Coupled with the `Optimal` from `JuMP.termination_status`, we can infer that +this feasible solution is actually optimal. We can also query +`JuMP.dual_status`: ```jldoctest quickstart_example julia> JuMP.dual_status(model) FeasiblePoint::ResultStatusCode = 1 From 6d444d06d2666c70292e0c1e3d110c42babc5e58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Fri, 14 Dec 2018 10:35:27 +0100 Subject: [PATCH 3/5] =?UTF-8?q?=F0=9F=91=8C=20Update=20is=5Foptimal=20in?= =?UTF-8?q?=20examples?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/cannery.jl | 2 +- examples/diet.jl | 4 ++-- examples/multi.jl | 2 +- examples/prod.jl | 2 +- examples/steelT3.jl | 2 +- examples/sudoku.jl | 2 +- examples/transp.jl | 2 +- examples/urbanplan.jl | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/cannery.jl b/examples/cannery.jl index 7cc46516db1..3091bdd1637 100644 --- a/examples/cannery.jl +++ b/examples/cannery.jl @@ -53,7 +53,7 @@ function solveCannery(plants, markets, capacity, demand, distance, freight) term_status = JuMP.termination_status(cannery) primal_status = JuMP.primal_status(cannery) - is_optimal = term_status == MOI.Optimal && primal_status == MOI.FeasiblePoint + is_optimal = term_status == MOI.Optimal PrintSolution(is_optimal, plants, markets, ship) return is_optimal diff --git a/examples/diet.jl b/examples/diet.jl index 5dfd496bb0a..e35af475442 100644 --- a/examples/diet.jl +++ b/examples/diet.jl @@ -74,7 +74,7 @@ function SolveDiet() JuMP.optimize!(m) term_status = JuMP.termination_status(m) primal_status = JuMP.primal_status(m) - is_optimal = term_status == MOI.Optimal && primal_status == MOI.FeasiblePoint + is_optimal = term_status == MOI.Optimal PrintSolution(is_optimal, foods, buy) @@ -85,7 +85,7 @@ function SolveDiet() JuMP.optimize!(m) term_status = JuMP.termination_status(m) primal_status = JuMP.primal_status(m) - is_optimal = term_status == MOI.Optimal && primal_status == MOI.FeasiblePoint + is_optimal = term_status == MOI.Optimal PrintSolution(is_optimal, foods, buy) end diff --git a/examples/multi.jl b/examples/multi.jl index 53188b10074..7de4fea9d03 100644 --- a/examples/multi.jl +++ b/examples/multi.jl @@ -105,6 +105,6 @@ JuMP.optimize!(multi) term_status = JuMP.termination_status(multi) primal_status = JuMP.primal_status(multi) -is_optimal = term_status == MOI.Optimal && primal_status == MOI.FeasiblePoint +is_optimal = term_status == MOI.Optimal PrintSolution(is_optimal, Trans, orig, dest, prod) diff --git a/examples/prod.jl b/examples/prod.jl index a4fd1c8fb78..31df1f44025 100644 --- a/examples/prod.jl +++ b/examples/prod.jl @@ -253,6 +253,6 @@ JuMP.optimize!(prod) term_status = JuMP.termination_status(prod) primal_status = JuMP.primal_status(prod) -is_optimal = status == MOI.Optimal && primal_status == MOI.FeasiblePoint +is_optimal = status == MOI.Optimal PrintSolution(is_optimal, Crews, Hire, Layoff) diff --git a/examples/steelT3.jl b/examples/steelT3.jl index 4d64a900241..eb61c418226 100644 --- a/examples/steelT3.jl +++ b/examples/steelT3.jl @@ -123,6 +123,6 @@ JuMP.optimize!(Prod) term_status = JuMP.termination_status(Prod) primal_status = JuMP.primal_status(Prod) -is_optimal = status == MOI.Optimal && primal_status == MOI.FeasiblePoint +is_optimal = status == MOI.Optimal PrintSolution(is_optimal, area, Make, Inv, Sell, prod, T) diff --git a/examples/sudoku.jl b/examples/sudoku.jl index 27ea4e54f65..99a4dea755e 100644 --- a/examples/sudoku.jl +++ b/examples/sudoku.jl @@ -65,7 +65,7 @@ function SolveModel(initgrid) term_status = JuMP.termination_status(m) primal_status = JuMP.primal_status(m) - is_optimal = term_status == MOI.Optimal && primal_status == MOI.FeasiblePoint + is_optimal = term_status == MOI.Optimal # Check solution if is_optimal diff --git a/examples/transp.jl b/examples/transp.jl index b4485611e60..13fb3888015 100644 --- a/examples/transp.jl +++ b/examples/transp.jl @@ -48,7 +48,7 @@ JuMP.optimize!(m) term_status = JuMP.termination_status(m) primal_status = JuMP.primal_status(m) -is_optimal = term_status == MOI.Optimal && primal_status == MOI.FeasiblePoint +is_optimal = term_status == MOI.Optimal if is_optimal @printf("Optimal!\n") diff --git a/examples/urbanplan.jl b/examples/urbanplan.jl index c4403ca2629..9058ba5733c 100644 --- a/examples/urbanplan.jl +++ b/examples/urbanplan.jl @@ -70,7 +70,7 @@ function SolveUrban() term_status = JuMP.termination_status(m) primal_status = JuMP.primal_status(m) - is_optimal = term_status == MOI.Optimal && primal_status == MOI.FeasiblePoint + is_optimal = term_status == MOI.Optimal if ! is_optimal error("The solver did not find an optimal solution.") From 32f39485d6ed1187f30e00b5404793c61fd27cf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Sat, 15 Dec 2018 06:27:19 +0100 Subject: [PATCH 4/5] Fix test --- test/constraint.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/constraint.jl b/test/constraint.jl index 087478d9723..bf872397d55 100644 --- a/test/constraint.jl +++ b/test/constraint.jl @@ -338,7 +338,7 @@ function test_shadow_price(model_string, constraint_dual, constraint_shadow) eval_objective_value=false, eval_variable_constraint_dual=false)) mock_optimizer = JuMP.backend(model).optimizer.model - MOI.set(mock_optimizer, MOI.TerminationStatus(), MOI.Success) + MOI.set(mock_optimizer, MOI.TerminationStatus(), MOI.Optimal) MOI.set(mock_optimizer, MOI.DualStatus(), MOI.FeasiblePoint) JuMP.optimize!(model) From 7f4a301e33987e3ca9fdc565be7769e0d948af91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Sat, 15 Dec 2018 06:34:46 +0100 Subject: [PATCH 5/5] =?UTF-8?q?=F0=9F=93=9D=20Update=20primal=5Fstatus/dua?= =?UTF-8?q?l=5Fstatus=20in=20quickstart?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/src/quickstart.md | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/docs/src/quickstart.md b/docs/src/quickstart.md index 8a1b9a4e29b..7c4986fdf88 100644 --- a/docs/src/quickstart.md +++ b/docs/src/quickstart.md @@ -129,22 +129,19 @@ solution. DocTestSetup = nothing ``` -To understand the reason for termination in more detail, we need to query -`JuMP.primalstatus`: +As the solver found an optimal solution, we expect the solution returned to be +a primal-dual pair of feasible solutions with zero duality gap. +We can verify the primal and dual status as follows to confirm this: ```jldoctest quickstart_example julia> JuMP.primal_status(model) FeasiblePoint::ResultStatusCode = 1 -``` -This indicates that GLPK has found a `FeasiblePoint` to the primal problem. -Coupled with the `Optimal` from `JuMP.termination_status`, we can infer that -this feasible solution is actually optimal. We can also query -`JuMP.dual_status`: -```jldoctest quickstart_example + julia> JuMP.dual_status(model) FeasiblePoint::ResultStatusCode = 1 ``` -Like the `primal_status`, GLPK indicates that it has found a `FeasiblePoint` to -the dual problem. +Note that the primal and dual status only inform that the primal and dual +solutions are feasible and it is only because we verified that the termination +status is `Optimal` that we can conclude that they form an optimal solution. Finally, we can query the result of the optimization. First, we can query the objective value: