Skip to content

Commit

Permalink
Merge 7f4a301 into 5df6bbb
Browse files Browse the repository at this point in the history
  • Loading branch information
blegat committed Dec 15, 2018
2 parents 5df6bbb + 7f4a301 commit b006b3b
Show file tree
Hide file tree
Showing 13 changed files with 52 additions and 55 deletions.
2 changes: 1 addition & 1 deletion 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
Expand Down
25 changes: 11 additions & 14 deletions docs/src/quickstart.md
Expand Up @@ -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)
Expand All @@ -120,31 +120,28 @@ 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
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
```

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 `Success` 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)
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:
Expand Down
2 changes: 1 addition & 1 deletion examples/cannery.jl
Expand Up @@ -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

PrintSolution(is_optimal, plants, markets, ship)
return is_optimal
Expand Down
4 changes: 2 additions & 2 deletions examples/diet.jl
Expand Up @@ -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

PrintSolution(is_optimal, foods, buy)

Expand All @@ -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

PrintSolution(is_optimal, foods, buy)
end
Expand Down
2 changes: 1 addition & 1 deletion examples/multi.jl
Expand Up @@ -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

PrintSolution(is_optimal, Trans, orig, dest, prod)
2 changes: 1 addition & 1 deletion examples/prod.jl
Expand Up @@ -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

PrintSolution(is_optimal, Crews, Hire, Layoff)
2 changes: 1 addition & 1 deletion examples/steelT3.jl
Expand Up @@ -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

PrintSolution(is_optimal, area, Make, Inv, Sell, prod, T)
2 changes: 1 addition & 1 deletion examples/sudoku.jl
Expand Up @@ -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

# Check solution
if is_optimal
Expand Down
2 changes: 1 addition & 1 deletion examples/transp.jl
Expand Up @@ -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

if is_optimal
@printf("Optimal!\n")
Expand Down
2 changes: 1 addition & 1 deletion examples/urbanplan.jl
Expand Up @@ -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

if ! is_optimal
error("The solver did not find an optimal solution.")
Expand Down
2 changes: 1 addition & 1 deletion test/constraint.jl
Expand Up @@ -339,7 +339,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)

Expand Down
24 changes: 12 additions & 12 deletions test/generate_and_solve.jl
Expand Up @@ -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)
Expand All @@ -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
Expand All @@ -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)
Expand All @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down

0 comments on commit b006b3b

Please sign in to comment.