Skip to content

Commit

Permalink
Precompile only if Env() succeeds (#615)
Browse files Browse the repository at this point in the history
  • Loading branch information
odow authored Feb 26, 2025
1 parent 5ce5b4b commit 723fa2b
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 44 deletions.
99 changes: 55 additions & 44 deletions src/Gurobi.jl
Original file line number Diff line number Diff line change
Expand Up @@ -114,52 +114,63 @@ end

import PrecompileTools

function _precompile_(env::Env)
model = MOI.Utilities.CachingOptimizer(
MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()),
MOI.instantiate(
() -> Gurobi.Optimizer(env);
with_bridge_type = Float64,
),
)
MOI.set(model, MOI.Silent(), true)
x = MOI.add_variables(model, 3)
MOI.supports(model, MOI.VariableName(), typeof(x[1]))
MOI.set(model, MOI.VariableName(), x[1], "x1")
MOI.set(model, MOI.VariablePrimalStart(), x[1], 0.0)
MOI.add_constraint(model, x[1], MOI.ZeroOne())
MOI.add_constraint(model, x[2], MOI.Integer())
for F in (MOI.VariableIndex, MOI.ScalarAffineFunction{Float64})
MOI.supports_constraint(model, F, MOI.GreaterThan{Float64})
MOI.supports_constraint(model, F, MOI.LessThan{Float64})
MOI.supports_constraint(model, F, MOI.EqualTo{Float64})
end
MOI.supports_constraint(model, MOI.VariableIndex, MOI.ZeroOne)
MOI.supports_constraint(model, MOI.VariableIndex, MOI.Integer)
MOI.add_constraint(model, x[1], MOI.GreaterThan(0.0))
MOI.add_constraint(model, x[2], MOI.LessThan(0.0))
MOI.add_constraint(model, x[3], MOI.EqualTo(0.0))
MOI.add_constrained_variable(model, MOI.GreaterThan(0.0))
MOI.add_constrained_variable(model, MOI.LessThan(0.0))
MOI.add_constrained_variable(model, MOI.EqualTo(0.0))
MOI.add_constrained_variable(model, MOI.Integer())
MOI.add_constrained_variable(model, MOI.ZeroOne())
set = (MOI.GreaterThan(0.0), MOI.LessThan(0.0))
MOI.supports_add_constrained_variable(model, typeof(set))
MOI.add_constrained_variable(model, set)
f = 1.0 * x[1] + x[2] + x[3]
c1 = MOI.add_constraint(model, f, MOI.GreaterThan(0.0))
MOI.set(model, MOI.ConstraintName(), c1, "c1")
MOI.supports(model, MOI.ConstraintName(), typeof(c1))
MOI.add_constraint(model, f, MOI.LessThan(0.0))
MOI.add_constraint(model, f, MOI.EqualTo(0.0))
MOI.set(model, MOI.ObjectiveSense(), MOI.MAX_SENSE)
MOI.supports(model, MOI.ObjectiveFunction{typeof(f)}())
MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f)
MOI.optimize!(model)
MOI.get(model, MOI.TerminationStatus())
MOI.get(model, MOI.PrimalStatus())
MOI.get(model, MOI.DualStatus())
MOI.get(model, MOI.VariablePrimal(), x)
return
end

PrecompileTools.@setup_workload begin
PrecompileTools.@compile_workload begin
if libgurobi != "__skipped_installation__"
model = MOI.Utilities.CachingOptimizer(
MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()),
MOI.instantiate(Gurobi.Optimizer; with_bridge_type = Float64),
)
MOI.set(model, MOI.Silent(), true)
x = MOI.add_variables(model, 3)
MOI.supports(model, MOI.VariableName(), typeof(x[1]))
MOI.set(model, MOI.VariableName(), x[1], "x1")
MOI.set(model, MOI.VariablePrimalStart(), x[1], 0.0)
MOI.add_constraint(model, x[1], MOI.ZeroOne())
MOI.add_constraint(model, x[2], MOI.Integer())
for F in (MOI.VariableIndex, MOI.ScalarAffineFunction{Float64})
MOI.supports_constraint(model, F, MOI.GreaterThan{Float64})
MOI.supports_constraint(model, F, MOI.LessThan{Float64})
MOI.supports_constraint(model, F, MOI.EqualTo{Float64})
end
MOI.supports_constraint(model, MOI.VariableIndex, MOI.ZeroOne)
MOI.supports_constraint(model, MOI.VariableIndex, MOI.Integer)
MOI.add_constraint(model, x[1], MOI.GreaterThan(0.0))
MOI.add_constraint(model, x[2], MOI.LessThan(0.0))
MOI.add_constraint(model, x[3], MOI.EqualTo(0.0))
MOI.add_constrained_variable(model, MOI.GreaterThan(0.0))
MOI.add_constrained_variable(model, MOI.LessThan(0.0))
MOI.add_constrained_variable(model, MOI.EqualTo(0.0))
MOI.add_constrained_variable(model, MOI.Integer())
MOI.add_constrained_variable(model, MOI.ZeroOne())
set = (MOI.GreaterThan(0.0), MOI.LessThan(0.0))
MOI.supports_add_constrained_variable(model, typeof(set))
MOI.add_constrained_variable(model, set)
f = 1.0 * x[1] + x[2] + x[3]
c1 = MOI.add_constraint(model, f, MOI.GreaterThan(0.0))
MOI.set(model, MOI.ConstraintName(), c1, "c1")
MOI.supports(model, MOI.ConstraintName(), typeof(c1))
MOI.add_constraint(model, f, MOI.LessThan(0.0))
MOI.add_constraint(model, f, MOI.EqualTo(0.0))
MOI.set(model, MOI.ObjectiveSense(), MOI.MAX_SENSE)
MOI.supports(model, MOI.ObjectiveFunction{typeof(f)}())
MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f)
MOI.optimize!(model)
MOI.get(model, MOI.TerminationStatus())
MOI.get(model, MOI.PrimalStatus())
MOI.get(model, MOI.DualStatus())
MOI.get(model, MOI.VariablePrimal(), x)
try
env = Env()
_precompile_(env)
catch
nothing
end
end
end
Expand Down
6 changes: 6 additions & 0 deletions test/MOI/MOI_wrapper.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1593,6 +1593,12 @@ function test_write_to_file()
return
end

function test_precompile()
# Just test that this does not error.
Gurobi._precompile_(GRB_ENV)
return
end

end # TestMOIWrapper

TestMOIWrapper.runtests()

0 comments on commit 723fa2b

Please sign in to comment.