Skip to content

Commit

Permalink
Allow top-down configuration of target statuses (#20)
Browse files Browse the repository at this point in the history
* allow to override target statuses with Dicts, globally
 - before, one could only override the termination_target and primal_target
   individually
 - now, each test case specifies whether the problem is FEASIBLE or INFEASIBLE,
   when calling check_status
 - a pair of default Dicts, mapping problem type to target status is now passed
   down from the helper functions to the test functions
  • Loading branch information
rschwarz authored and ccoffrin committed Aug 29, 2019
1 parent 364c105 commit f713f56
Show file tree
Hide file tree
Showing 87 changed files with 400 additions and 355 deletions.
67 changes: 56 additions & 11 deletions src/MINLPTests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,42 @@ const PRIMAL_TOL = 1e-6
# Absolue tolerance when checking the dual solution value.
const DUAL_TOL = 1e-6

###
### Default expected status codes for different types of problems and solvers.
###

# We only distinguish between feasible and infeasible problems now.
@enum ProblemTypeCode FEASIBLE_PROBLEM INFEASIBLE_PROBLEM

# Target status codes for local solvers:
const TERMINATION_TARGET_LOCAL = Dict(
FEASIBLE_PROBLEM => JuMP.MOI.LOCALLY_SOLVED,
INFEASIBLE_PROBLEM => JuMP.MOI.LOCALLY_INFEASIBLE,
)
const PRIMAL_TARGET_LOCAL = Dict(
FEASIBLE_PROBLEM => JuMP.MOI.FEASIBLE_POINT,
INFEASIBLE_PROBLEM => JuMP.MOI.INFEASIBLE_POINT,
)

# Target status codes for global solvers:
const TERMINATION_TARGET_GLOBAL = Dict(
FEASIBLE_PROBLEM => JuMP.MOI.OPTIMAL,
INFEASIBLE_PROBLEM => JuMP.MOI.INFEASIBLE,
)
const PRIMAL_TARGET_GLOBAL = Dict(
FEASIBLE_PROBLEM => JuMP.MOI.FEASIBLE_POINT,
INFEASIBLE_PROBLEM => JuMP.MOI.NO_SOLUTION,
)

###
### Helper functions for the tests.
###

function check_status(model, termination_target, primal_target)
@test JuMP.termination_status(model) == termination_target
@test JuMP.primal_status(model) == primal_target
function check_status(model, problem_type::ProblemTypeCode,
termination_target=TERMINATION_TARGET_LOCAL,
primal_target=PRIMAL_TARGET_LOCAL)
@test JuMP.termination_status(model) == termination_target[problem_type]
@test JuMP.primal_status(model) == primal_target[problem_type]
end

function check_objective(model, solution; tol = OPT_TOL)
Expand Down Expand Up @@ -71,12 +100,16 @@ end
"""
function test_directory(
directory, optimizer; exclude=String[], include=String[],
objective_tol = OPT_TOL, primal_tol = PRIMAL_TOL, dual_tol = DUAL_TOL)
objective_tol = OPT_TOL, primal_tol = PRIMAL_TOL, dual_tol = DUAL_TOL,
termination_target = TERMINATION_TARGET_LOCAL,
primal_target = PRIMAL_TARGET_LOCAL)

@testset "$(directory)" begin
@testset "$(model_name)" for model_name in list_of_models(directory, exclude, include)
function_name = string(replace(directory, "-" => "_"), "_", model_name)
model_function = getfield(MINLPTests, Symbol(function_name))
model_function(optimizer, objective_tol, primal_tol, dual_tol)
model_function(optimizer, objective_tol, primal_tol, dual_tol,
termination_target, primal_target)
end
end
end
Expand All @@ -102,26 +135,38 @@ end

function test_nlp(
optimizer; exclude = String[], objective_tol = OPT_TOL,
primal_tol = PRIMAL_TOL, dual_tol = DUAL_TOL)
primal_tol = PRIMAL_TOL, dual_tol = DUAL_TOL,
termination_target = TERMINATION_TARGET_LOCAL,
primal_target = PRIMAL_TARGET_LOCAL)
test_directory("nlp", optimizer;
exclude = exclude, objective_tol = objective_tol,
primal_tol = primal_tol, dual_tol = dual_tol)
primal_tol = primal_tol, dual_tol = dual_tol,
termination_target = termination_target,
primal_target = primal_target)
end

function test_nlp_cvx(
optimizer; exclude = String[], objective_tol = OPT_TOL,
primal_tol = PRIMAL_TOL, dual_tol = DUAL_TOL)
primal_tol = PRIMAL_TOL, dual_tol = DUAL_TOL,
termination_target = TERMINATION_TARGET_LOCAL,
primal_target = PRIMAL_TARGET_LOCAL)
test_directory("nlp-cvx", optimizer;
exclude = exclude, objective_tol = objective_tol,
primal_tol = primal_tol, dual_tol = dual_tol)
primal_tol = primal_tol, dual_tol = dual_tol,
termination_target = termination_target,
primal_target = primal_target)
end

function test_nlp_mi(
optimizer; exclude = String[], objective_tol = OPT_TOL,
primal_tol = PRIMAL_TOL, dual_tol = DUAL_TOL)
primal_tol = PRIMAL_TOL, dual_tol = DUAL_TOL,
termination_target = TERMINATION_TARGET_LOCAL,
primal_target = PRIMAL_TARGET_LOCAL)
test_directory("nlp-mi", optimizer;
exclude = exclude, objective_tol = objective_tol,
primal_tol = primal_tol, dual_tol = dual_tol)
primal_tol = primal_tol, dual_tol = dual_tol,
termination_target = termination_target,
primal_target = primal_target)
end

### Tests that haven't been updated.
Expand Down
8 changes: 4 additions & 4 deletions src/nlp-cvx/001_010.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
function nlp_cvx_001_010(optimizer, objective_tol, primal_tol, dual_tol;
termination_target = JuMP.MOI.LOCALLY_SOLVED,
primal_target = JuMP.MOI.FEASIBLE_POINT)
function nlp_cvx_001_010(optimizer, objective_tol, primal_tol, dual_tol,
termination_target = TERMINATION_TARGET_LOCAL,
primal_target = PRIMAL_TARGET_LOCAL)
# Test Goals:
# - linear objective
# - quadratic objective
Expand All @@ -23,7 +23,7 @@ function nlp_cvx_001_010(optimizer, objective_tol, primal_tol, dual_tol;

optimize!(m)

check_status(m, termination_target, primal_target)
check_status(m, FEASIBLE_PROBLEM, termination_target, primal_target)
check_objective(m, -2.0430107680954848, tol = objective_tol)
check_solution([x,y], [-2.0430107680954848, -0.4301075068564087], tol = primal_tol)

Expand Down
8 changes: 4 additions & 4 deletions src/nlp-cvx/001_011.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
function nlp_cvx_001_011(optimizer, objective_tol, primal_tol, dual_tol;
termination_target = JuMP.MOI.LOCALLY_SOLVED,
primal_target = JuMP.MOI.FEASIBLE_POINT)
function nlp_cvx_001_011(optimizer, objective_tol, primal_tol, dual_tol,
termination_target = TERMINATION_TARGET_LOCAL,
primal_target = PRIMAL_TARGET_LOCAL)
m = Model(optimizer)

@variable(m, x)
Expand All @@ -15,7 +15,7 @@ function nlp_cvx_001_011(optimizer, objective_tol, primal_tol, dual_tol;

optimize!(m)

check_status(m, termination_target, primal_target)
check_status(m, FEASIBLE_PROBLEM, termination_target, primal_target)
check_objective(m, 0.0, tol = objective_tol)
check_solution([x,y], [1.0, 2.0], tol = primal_tol)

Expand Down
8 changes: 4 additions & 4 deletions src/nlp-cvx/002_010.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
function nlp_cvx_002_010(optimizer, objective_tol, primal_tol, dual_tol;
termination_target = JuMP.MOI.LOCALLY_SOLVED,
primal_target = JuMP.MOI.FEASIBLE_POINT)
function nlp_cvx_002_010(optimizer, objective_tol, primal_tol, dual_tol,
termination_target = TERMINATION_TARGET_LOCAL,
primal_target = PRIMAL_TARGET_LOCAL)
# Test Goals:
# - linear objective
# - quadratic objective
Expand All @@ -24,7 +24,7 @@ function nlp_cvx_002_010(optimizer, objective_tol, primal_tol, dual_tol;

optimize!(m)

check_status(m, termination_target, primal_target)
check_status(m, FEASIBLE_PROBLEM, termination_target, primal_target)
check_objective(m, 3.9655172067026196, tol = objective_tol)
check_solution([x,y], [2.4137930845761546, 1.5517241221264648], tol = primal_tol)

Expand Down
8 changes: 4 additions & 4 deletions src/nlp-cvx/002_011.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
function nlp_cvx_002_011(optimizer, objective_tol, primal_tol, dual_tol;
termination_target = JuMP.MOI.LOCALLY_SOLVED,
primal_target = JuMP.MOI.FEASIBLE_POINT)
function nlp_cvx_002_011(optimizer, objective_tol, primal_tol, dual_tol,
termination_target = TERMINATION_TARGET_LOCAL,
primal_target = PRIMAL_TARGET_LOCAL)
m = Model(optimizer)

@variable(m, x)
Expand All @@ -16,7 +16,7 @@ function nlp_cvx_002_011(optimizer, objective_tol, primal_tol, dual_tol;

optimize!(m)

check_status(m, termination_target, primal_target)
check_status(m, FEASIBLE_PROBLEM, termination_target, primal_target)
check_objective(m, 0, tol = objective_tol)
check_solution([x,y], [3, 2], tol = primal_tol)

Expand Down
8 changes: 4 additions & 4 deletions src/nlp-cvx/101_010.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
function nlp_cvx_101_010(optimizer, objective_tol, primal_tol, dual_tol;
termination_target = JuMP.MOI.LOCALLY_SOLVED,
primal_target = JuMP.MOI.FEASIBLE_POINT)
function nlp_cvx_101_010(optimizer, objective_tol, primal_tol, dual_tol,
termination_target = TERMINATION_TARGET_LOCAL,
primal_target = PRIMAL_TARGET_LOCAL)
# Test Goals:
# - linear objective
# - single convex quadratic constraint
Expand All @@ -19,7 +19,7 @@ function nlp_cvx_101_010(optimizer, objective_tol, primal_tol, dual_tol;

optimize!(m)

check_status(m, termination_target, primal_target)
check_status(m, FEASIBLE_PROBLEM, termination_target, primal_target)
check_objective(m, -2/sqrt(2), tol = objective_tol)
check_solution([x,y], [1/sqrt(2), 1/sqrt(2)], tol = primal_tol)

Expand Down
8 changes: 4 additions & 4 deletions src/nlp-cvx/101_011.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
function nlp_cvx_101_011(optimizer, objective_tol, primal_tol, dual_tol;
termination_target = JuMP.MOI.LOCALLY_SOLVED,
primal_target = JuMP.MOI.FEASIBLE_POINT)
function nlp_cvx_101_011(optimizer, objective_tol, primal_tol, dual_tol,
termination_target = TERMINATION_TARGET_LOCAL,
primal_target = PRIMAL_TARGET_LOCAL)
m = Model(optimizer)

@variable(m, -2 <= x <= 2)
Expand All @@ -11,7 +11,7 @@ function nlp_cvx_101_011(optimizer, objective_tol, primal_tol, dual_tol;

optimize!(m)

check_status(m, termination_target, primal_target)
check_status(m, FEASIBLE_PROBLEM, termination_target, primal_target)
check_objective(m, -1, tol = objective_tol)
check_solution([x,y], [1, 0], tol = primal_tol)

Expand Down
8 changes: 4 additions & 4 deletions src/nlp-cvx/101_012.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
function nlp_cvx_101_012(optimizer, objective_tol, primal_tol, dual_tol;
termination_target = JuMP.MOI.LOCALLY_SOLVED,
primal_target = JuMP.MOI.FEASIBLE_POINT)
function nlp_cvx_101_012(optimizer, objective_tol, primal_tol, dual_tol,
termination_target = TERMINATION_TARGET_LOCAL,
primal_target = PRIMAL_TARGET_LOCAL)
m = Model(optimizer)

@variable(m, -2 <= x <= 2)
Expand All @@ -11,7 +11,7 @@ function nlp_cvx_101_012(optimizer, objective_tol, primal_tol, dual_tol;

optimize!(m)

check_status(m, termination_target, primal_target)
check_status(m, FEASIBLE_PROBLEM, termination_target, primal_target)
check_objective(m, 1, tol = objective_tol)
check_solution([x,y], [1, 0], tol = primal_tol)

Expand Down
8 changes: 4 additions & 4 deletions src/nlp-cvx/102_010.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
function nlp_cvx_102_010(optimizer, objective_tol, primal_tol, dual_tol;
termination_target = JuMP.MOI.LOCALLY_SOLVED,
primal_target = JuMP.MOI.FEASIBLE_POINT)
function nlp_cvx_102_010(optimizer, objective_tol, primal_tol, dual_tol,
termination_target = TERMINATION_TARGET_LOCAL,
primal_target = PRIMAL_TARGET_LOCAL)
# Test Goals:
# - linear and nonlinear constraints
# Variants
Expand All @@ -21,7 +21,7 @@ function nlp_cvx_102_010(optimizer, objective_tol, primal_tol, dual_tol;

optimize!(m)

check_status(m, termination_target, primal_target)
check_status(m, FEASIBLE_PROBLEM, termination_target, primal_target)
check_objective(m, -0.974165743715913, tol = objective_tol)
check_solution([x,y], [0.974165743715913, 0.2258342542139504], tol = primal_tol)

Expand Down
8 changes: 4 additions & 4 deletions src/nlp-cvx/102_011.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
function nlp_cvx_102_011(optimizer, objective_tol, primal_tol, dual_tol;
termination_target = JuMP.MOI.LOCALLY_SOLVED,
primal_target = JuMP.MOI.FEASIBLE_POINT)
function nlp_cvx_102_011(optimizer, objective_tol, primal_tol, dual_tol,
termination_target = TERMINATION_TARGET_LOCAL,
primal_target = PRIMAL_TARGET_LOCAL)
m = Model(optimizer)

@variable(m, x)
Expand All @@ -12,7 +12,7 @@ function nlp_cvx_102_011(optimizer, objective_tol, primal_tol, dual_tol;

optimize!(m)

check_status(m, termination_target, primal_target)
check_status(m, FEASIBLE_PROBLEM, termination_target, primal_target)
check_objective(m, 1.2, tol = objective_tol)
### Can't test solution point because there are multiple solutions.
end
8 changes: 4 additions & 4 deletions src/nlp-cvx/102_012.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
function nlp_cvx_102_012(optimizer, objective_tol, primal_tol, dual_tol;
termination_target = JuMP.MOI.LOCALLY_SOLVED,
primal_target = JuMP.MOI.FEASIBLE_POINT)
function nlp_cvx_102_012(optimizer, objective_tol, primal_tol, dual_tol,
termination_target = TERMINATION_TARGET_LOCAL,
primal_target = PRIMAL_TARGET_LOCAL)
m = Model(optimizer)

@variable(m, x)
Expand All @@ -12,7 +12,7 @@ function nlp_cvx_102_012(optimizer, objective_tol, primal_tol, dual_tol;

optimize!(m)

check_status(m, termination_target, primal_target)
check_status(m, FEASIBLE_PROBLEM, termination_target, primal_target)
check_objective(m, 2/sqrt(2), tol = objective_tol)
check_solution([x,y], [1/sqrt(2), 1/sqrt(2)], tol = primal_tol)

Expand Down
8 changes: 4 additions & 4 deletions src/nlp-cvx/102_013.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
function nlp_cvx_102_013(optimizer, objective_tol, primal_tol, dual_tol;
termination_target = JuMP.MOI.LOCALLY_SOLVED,
primal_target = JuMP.MOI.FEASIBLE_POINT)
function nlp_cvx_102_013(optimizer, objective_tol, primal_tol, dual_tol,
termination_target = TERMINATION_TARGET_LOCAL,
primal_target = PRIMAL_TARGET_LOCAL)
m = Model(optimizer)

@variable(m, x)
Expand All @@ -12,7 +12,7 @@ function nlp_cvx_102_013(optimizer, objective_tol, primal_tol, dual_tol;

optimize!(m)

check_status(m, termination_target, primal_target)
check_status(m, FEASIBLE_PROBLEM, termination_target, primal_target)
check_objective(m, 0.72, tol = objective_tol)
check_solution([x,y], [0.6, 0.6], tol = primal_tol)

Expand Down
8 changes: 4 additions & 4 deletions src/nlp-cvx/102_014.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
function nlp_cvx_102_014(optimizer, objective_tol, primal_tol, dual_tol;
termination_target = JuMP.MOI.LOCALLY_SOLVED,
primal_target = JuMP.MOI.FEASIBLE_POINT)
function nlp_cvx_102_014(optimizer, objective_tol, primal_tol, dual_tol,
termination_target = TERMINATION_TARGET_LOCAL,
primal_target = PRIMAL_TARGET_LOCAL)
m = Model(optimizer)

@variable(m, x)
Expand All @@ -12,7 +12,7 @@ function nlp_cvx_102_014(optimizer, objective_tol, primal_tol, dual_tol;

optimize!(m)

check_status(m, termination_target, primal_target)
check_status(m, FEASIBLE_PROBLEM, termination_target, primal_target)
check_objective(m, 0, tol = objective_tol)
check_solution([x,y], [0.65, 0.65], tol = primal_tol)

Expand Down
8 changes: 4 additions & 4 deletions src/nlp-cvx/103_010.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
function nlp_cvx_103_010(optimizer, objective_tol, primal_tol, dual_tol;
termination_target = JuMP.MOI.LOCALLY_SOLVED,
primal_target = JuMP.MOI.FEASIBLE_POINT)
function nlp_cvx_103_010(optimizer, objective_tol, primal_tol, dual_tol,
termination_target = TERMINATION_TARGET_LOCAL,
primal_target = PRIMAL_TARGET_LOCAL)
# Test Goals:
# - linear objective
# - intersection convex quadratic constraints
Expand All @@ -22,7 +22,7 @@ function nlp_cvx_103_010(optimizer, objective_tol, primal_tol, dual_tol;

optimize!(m)

check_status(m, termination_target, primal_target)
check_status(m, FEASIBLE_PROBLEM, termination_target, primal_target)
check_objective(m, 0, tol = objective_tol)
check_solution([x,y], [0, 0], tol = primal_tol)

Expand Down
8 changes: 4 additions & 4 deletions src/nlp-cvx/103_011.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
function nlp_cvx_103_011(optimizer, objective_tol, primal_tol, dual_tol;
termination_target = JuMP.MOI.LOCALLY_SOLVED,
primal_target = JuMP.MOI.FEASIBLE_POINT)
function nlp_cvx_103_011(optimizer, objective_tol, primal_tol, dual_tol,
termination_target = TERMINATION_TARGET_LOCAL,
primal_target = PRIMAL_TARGET_LOCAL)
m = Model(optimizer)

@variable(m, x)
Expand All @@ -12,7 +12,7 @@ function nlp_cvx_103_011(optimizer, objective_tol, primal_tol, dual_tol;

optimize!(m)

check_status(m, termination_target, primal_target)
check_status(m, FEASIBLE_PROBLEM, termination_target, primal_target)
check_objective(m, -1, tol = objective_tol)
check_solution([x,y], [0, 1], tol = primal_tol)

Expand Down
8 changes: 4 additions & 4 deletions src/nlp-cvx/103_012.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
function nlp_cvx_103_012(optimizer, objective_tol, primal_tol, dual_tol;
termination_target = JuMP.MOI.LOCALLY_SOLVED,
primal_target = JuMP.MOI.FEASIBLE_POINT)
function nlp_cvx_103_012(optimizer, objective_tol, primal_tol, dual_tol,
termination_target = TERMINATION_TARGET_LOCAL,
primal_target = PRIMAL_TARGET_LOCAL)
m = Model(optimizer)

@variable(m, x)
Expand All @@ -12,7 +12,7 @@ function nlp_cvx_103_012(optimizer, objective_tol, primal_tol, dual_tol;

optimize!(m)

check_status(m, termination_target, primal_target)
check_status(m, FEASIBLE_PROBLEM, termination_target, primal_target)
check_objective(m, -5/4, tol = objective_tol)
check_solution([x,y], [1/2, 3/4], tol = primal_tol)

Expand Down
Loading

0 comments on commit f713f56

Please sign in to comment.