Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Breaking changes for MOI 0.10.0
Browse files Browse the repository at this point in the history
odow committed May 18, 2021
1 parent 4d20d41 commit f82dce5
Showing 5 changed files with 71 additions and 46 deletions.
6 changes: 3 additions & 3 deletions bench/runbench.jl
Original file line number Diff line number Diff line change
@@ -36,7 +36,7 @@ function generate_moi_problem(model, At, b, c;
else
for row in 1:rows
MOI.add_constraint(model, MOI.VectorAffineFunction(
[MOI.VectorAffineTerm(1,
[MOI.VectorAffineTerm(1,
MOI.ScalarAffineTerm(A_vals[i], x[A_cols[i]])
) for i in nzrange(At, row)], [-b[row]]),
MOI.Nonpositives(1))
@@ -112,7 +112,7 @@ function time_build_and_solve(to_build, to_solve, At, b, c, scalar = true)
end
@time @timeit "opt" MOI.optimize!(to_solve)
MOI.get(to_solve, MOI.ObjectiveValue())
val = MOI.get(to_solve, MOI.SolveTime())
val = MOI.get(to_solve, MOI.SolveTimeSec())
println(val)
end

@@ -145,4 +145,4 @@ function solve_clp(seed, data; time_limit_sec=Inf)

end

solve_clp(10, RandomLP(10000, 20000, 0.01); time_limit_sec=5)
solve_clp(10, RandomLP(10000, 20000, 0.01); time_limit_sec=5)
5 changes: 5 additions & 0 deletions src/Clp.jl
Original file line number Diff line number Diff line change
@@ -52,4 +52,9 @@ for sym in names(@__MODULE__, all = true)
end
end

if VERSION > v"1.4.2"
include("precompile.jl")
_precompile_()
end

end
37 changes: 18 additions & 19 deletions src/MOI_wrapper/MOI_wrapper.jl
Original file line number Diff line number Diff line change
@@ -25,7 +25,7 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
Create a new Optimizer object.
Set optimizer attributes using `MOI.RawParameter` or
Set optimizer attributes using `MOI.RawOptimizerAttribute` or
`JuMP.set_optimizer_atttribute`. For a list of supported parameter names,
see `Clp.SUPPORTED_PARAMETERS`.
@@ -41,14 +41,14 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
if length(kwargs) > 0
@warn("""Passing optimizer attributes as keyword arguments to
Clp.Optimizer is deprecated. Use
MOI.set(model, MOI.RawParameter("key"), value)
MOI.set(model, MOI.RawOptimizerAttribute("key"), value)
or
JuMP.set_optimizer_attribute(model, "key", value)
instead.
""")
end
for (key, value) in kwargs
MOI.set(model, MOI.RawParameter(String(key)), value)
MOI.set(model, MOI.RawOptimizerAttribute(String(key)), value)
end
finalizer(model) do m
Clp_deleteModel(m)
@@ -75,7 +75,7 @@ end
function MOI.empty!(model::Optimizer)
# Copy parameters from old model into new model
old_options = Dict(
key => MOI.get(model, MOI.RawParameter(key)) for
key => MOI.get(model, MOI.RawOptimizerAttribute(key)) for
key in model.options_set
)
empty!(model.options_set)
@@ -84,7 +84,7 @@ function MOI.empty!(model::Optimizer)
model.optimize_called = false
model.solve_time = 0.0
for (key, value) in old_options
MOI.set(model, MOI.RawParameter(key), value)
MOI.set(model, MOI.RawOptimizerAttribute(key), value)
end
# Work-around for maximumSeconds
Clp_setMaximumSeconds(model, model.maximumSeconds)
@@ -111,11 +111,11 @@ const SUPPORTED_PARAMETERS = (
"InfeasibleReturn",
)

function MOI.supports(::Optimizer, param::MOI.RawParameter)
function MOI.supports(::Optimizer, param::MOI.RawOptimizerAttribute)
return param.name in SUPPORTED_PARAMETERS
end

function MOI.set(model::Optimizer, param::MOI.RawParameter, value)
function MOI.set(model::Optimizer, param::MOI.RawOptimizerAttribute, value)
name = String(param.name)
push!(model.options_set, name)
if name == "PrimalTolerance"
@@ -148,7 +148,7 @@ function MOI.set(model::Optimizer, param::MOI.RawParameter, value)
return
end

function MOI.get(model::Optimizer, param::MOI.RawParameter)
function MOI.get(model::Optimizer, param::MOI.RawOptimizerAttribute)
name = String(param.name)
if name == "PrimalTolerance"
return Clp_primalTolerance(model)
@@ -260,25 +260,24 @@ function _extract_bound_data(src, mapping, lb, ub, ::Type{S}) where {S}
MOI.get(src, MOI.ListOfConstraintIndices{MOI.SingleVariable,S}())
f = MOI.get(src, MOI.ConstraintFunction(), con_index)
s = MOI.get(src, MOI.ConstraintSet(), con_index)
column = mapping.varmap[f.variable].value
column = mapping[f.variable].value
_add_bounds(lb, ub, column, s)
mapping.conmap[con_index] =
MOI.ConstraintIndex{MOI.SingleVariable,S}(column)
mapping[con_index] = MOI.ConstraintIndex{MOI.SingleVariable,S}(column)
end
end

function _copy_to_columns(dest::Optimizer, src, mapping)
x_src = MOI.get(src, MOI.ListOfVariableIndices())
N = Cint(length(x_src))
for i in 1:N
mapping.varmap[x_src[i]] = MOI.VariableIndex(i)
mapping[x_src[i]] = MOI.VariableIndex(i)
end

fobj =
MOI.get(src, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}())
c = fill(0.0, N)
for term in fobj.terms
i = mapping.varmap[term.variable_index].value
i = mapping[term.variable].value
c[i] += term.coefficient
end
# Clp seems to negates the objective offset
@@ -321,18 +320,18 @@ function _extract_row_data(src, mapping, lb, ub, I, J, V, ::Type{S}) where {S}
f = fs[i]#MOI.get(src, MOI.ConstraintFunction(), c_index)
for term in f.terms
push!(I, row)
push!(J, Cint(mapping.varmap[term.variable_index].value))
push!(J, Cint(mapping[term.variable].value))
push!(V, term.coefficient)
end
mapping.conmap[c_index] =
mapping[c_index] =
MOI.ConstraintIndex{MOI.ScalarAffineFunction{Float64},S}(row)
row += 1
end
return
end

function test_data(src, dest)
for (F, S) in MOI.get(src, MOI.ListOfConstraints())
for (F, S) in MOI.get(src, MOI.ListOfConstraintTypesPresent())
if !MOI.supports_constraint(dest, F, S)
throw(
MOI.UnsupportedConstraint{F,S}(
@@ -409,7 +408,7 @@ function MOI.optimize!(model::Optimizer)
return
end

function MOI.get(model::Optimizer, ::MOI.SolveTime)
function MOI.get(model::Optimizer, ::MOI.SolveTimeSec)
return model.solve_time
end

@@ -475,7 +474,7 @@ function MOI.get(model::Optimizer, ::MOI.ResultCount)
end

function MOI.get(model::Optimizer, attr::MOI.PrimalStatus)
if attr.N != 1
if attr.result_index != 1
return MOI.NO_SOLUTION
elseif Clp_isProvenDualInfeasible(model) != 0
return MOI.INFEASIBILITY_CERTIFICATE
@@ -487,7 +486,7 @@ function MOI.get(model::Optimizer, attr::MOI.PrimalStatus)
end

function MOI.get(model::Optimizer, attr::MOI.DualStatus)
if attr.N != 1
if attr.result_index != 1
return MOI.NO_SOLUTION
elseif Clp_isProvenPrimalInfeasible(model) != 0
return MOI.INFEASIBILITY_CERTIFICATE
27 changes: 27 additions & 0 deletions src/precompile.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
function _fake_precompile()
cache = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
clp = MOI.instantiate(Clp.Optimizer, with_bridge_type = Float64)
MOI.copy_to(clp, cache; copy_names = false)
return clp
end

function _precompile_()
ccall(:jl_generating_output, Cint, ()) == 1 || return nothing
T = Float64
scalar_sets = (
MOI.LessThan{T},
MOI.GreaterThan{T},
MOI.EqualTo{T},
MOI.Interval{T},
)
scalar_functions = (MOI.SingleVariable, MOI.ScalarAffineFunction{T})
MOI.precompile_model(
MOI.Bridges.LazyBridgeOptimizer{MOI.Utilities.CachingOptimizer{
Optimizer,
MOI.Utilities.UniversalFallback{MOI.Utilities.Model{Float64}},
}},
[(F, S) for F in scalar_functions, S in scalar_sets],
)
@assert Base.precompile(_fake_precompile, ())
return
end
42 changes: 18 additions & 24 deletions test/MOI_wrapper.jl
Original file line number Diff line number Diff line change
@@ -89,41 +89,35 @@ function test_Nonexistant_unbounded_ray()
@test status == MOI.DUAL_INFEASIBLE
end

function test_RawParameter()
function test_RawOptimizerAttribute()
model = Clp.Optimizer()
MOI.set(model, MOI.RawParameter("LogLevel"), 1)
@test MOI.get(model, MOI.RawParameter("LogLevel")) == 1
@test MOI.get(model, MOI.RawParameter(:LogLevel)) == 1
MOI.set(model, MOI.RawParameter(:LogLevel), 2)
@test MOI.get(model, MOI.RawParameter("LogLevel")) == 2
@test MOI.get(model, MOI.RawParameter(:LogLevel)) == 2
MOI.set(model, MOI.RawOptimizerAttribute("LogLevel"), 1)
@test MOI.get(model, MOI.RawOptimizerAttribute("LogLevel")) == 1
MOI.set(model, MOI.RawOptimizerAttribute("LogLevel"), 2)
@test MOI.get(model, MOI.RawOptimizerAttribute("LogLevel")) == 2

MOI.set(model, MOI.RawParameter("SolveType"), 1)
@test MOI.get(model, MOI.RawParameter("SolveType")) == 1
@test MOI.get(model, MOI.RawParameter(:SolveType)) == 1
MOI.set(model, MOI.RawParameter("SolveType"), 4)
@test MOI.get(model, MOI.RawParameter("SolveType")) == 4
@test MOI.get(model, MOI.RawParameter(:SolveType)) == 4
MOI.set(model, MOI.RawOptimizerAttribute("SolveType"), 1)
@test MOI.get(model, MOI.RawOptimizerAttribute("SolveType")) == 1
MOI.set(model, MOI.RawOptimizerAttribute("SolveType"), 4)
@test MOI.get(model, MOI.RawOptimizerAttribute("SolveType")) == 4

MOI.set(model, MOI.RawParameter("PresolveType"), 1)
@test MOI.get(model, MOI.RawParameter("PresolveType")) == 1
@test MOI.get(model, MOI.RawParameter(:PresolveType)) == 1
MOI.set(model, MOI.RawParameter("PresolveType"), 0)
@test MOI.get(model, MOI.RawParameter("PresolveType")) == 0
@test MOI.get(model, MOI.RawParameter(:PresolveType)) == 0
MOI.set(model, MOI.RawOptimizerAttribute("PresolveType"), 1)
@test MOI.get(model, MOI.RawOptimizerAttribute("PresolveType")) == 1
MOI.set(model, MOI.RawOptimizerAttribute("PresolveType"), 0)
@test MOI.get(model, MOI.RawOptimizerAttribute("PresolveType")) == 0
end

function test_All_parameters()
model = Clp.Optimizer()
param = MOI.RawParameter("NotAnOption")
param = MOI.RawOptimizerAttribute("NotAnOption")
@test !MOI.supports(model, param)
@test_throws MOI.UnsupportedAttribute(param) MOI.get(model, param)
@test_throws MOI.UnsupportedAttribute(param) MOI.set(model, param, false)
for key in Clp.SUPPORTED_PARAMETERS
@test MOI.supports(model, MOI.RawParameter(key))
value = MOI.get(model, MOI.RawParameter(key))
MOI.set(model, MOI.RawParameter(key), value)
@test MOI.get(model, MOI.RawParameter(key)) == value
@test MOI.supports(model, MOI.RawOptimizerAttribute(key))
value = MOI.get(model, MOI.RawOptimizerAttribute(key))
MOI.set(model, MOI.RawOptimizerAttribute(key), value)
@test MOI.get(model, MOI.RawOptimizerAttribute(key)) == value
end
end

0 comments on commit f82dce5

Please sign in to comment.