Skip to content

Commit e31983b

Browse files
authored
Add model_filename option (#20)
1 parent a95f160 commit e31983b

File tree

3 files changed

+56
-2
lines changed

3 files changed

+56
-2
lines changed

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,3 +102,14 @@ model = Model(() -> MiniZinc.Optimizer{Float64}("gurobi"))
102102
optimize!(model)
103103
@show value.(x)
104104
```
105+
106+
## Options
107+
108+
Set options using `MOI.RawOptimizerAttribute` in MOI or
109+
`set_optimizer_attribute` in JuMP.
110+
111+
`MiniZinc.jl` supports the following options:
112+
113+
* `model_filename::String = ""`: the location at which to write out the `.mzn`
114+
file during optimization. This option can be helpful during debugging. If
115+
left empty, a temporary file will be used instead.

src/optimize.jl

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,11 @@ mutable struct Optimizer{T} <: MOI.AbstractOptimizer
3434
inner::Model{T}
3535
has_solution::Bool
3636
primal_solution::Dict{MOI.VariableIndex,T}
37+
options::Dict{String,Any}
3738
function Optimizer{T}(solver::String) where {T}
38-
return new(solver, Model{T}(), false, Dict{MOI.VariableIndex,T}())
39+
primal_solution = Dict{MOI.VariableIndex,T}()
40+
options = Dict{String,Any}("model_filename" => "")
41+
return new(solver, Model{T}(), false, primal_solution, options)
3942
end
4043
end
4144

@@ -61,7 +64,10 @@ end
6164

6265
function _run_minizinc(dest::Optimizer)
6366
dir = mktempdir()
64-
filename = joinpath(dir, "model.mzn")
67+
filename = dest.options["model_filename"]
68+
if isempty(filename)
69+
filename = joinpath(dir, "model.mzn")
70+
end
6571
output = joinpath(dir, "model.ozn")
6672
open(filename, "w") do io
6773
return write(io, dest.inner)
@@ -86,6 +92,19 @@ function MOI.empty!(model::Optimizer)
8692
return
8793
end
8894

95+
function MOI.supports(model::Optimizer, attr::MOI.RawOptimizerAttribute)
96+
return haskey(model.options, attr.name)
97+
end
98+
99+
function MOI.get(model::Optimizer, attr::MOI.RawOptimizerAttribute)
100+
return get(model.options, attr.name, nothing)
101+
end
102+
103+
function MOI.set(model::Optimizer, attr::MOI.RawOptimizerAttribute, value)
104+
model.options[attr.name] = value
105+
return
106+
end
107+
89108
function MOI.supports_constraint(
90109
model::Optimizer,
91110
::Type{F},

test/runtests.jl

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,6 +1023,30 @@ function test_moi_tests()
10231023
return
10241024
end
10251025

1026+
function test_model_filename()
1027+
model = MOI.Utilities.Model{Int}()
1028+
x, x_int = MOI.add_constrained_variable(model, MOI.Integer())
1029+
c1 = MOI.add_constraint(model, x, MOI.GreaterThan(1))
1030+
c2 = MOI.add_constraint(model, x, MOI.LessThan(3))
1031+
@test MOI.is_valid(model, x)
1032+
@test MOI.is_valid(model, x_int)
1033+
@test MOI.is_valid(model, c1)
1034+
@test MOI.is_valid(model, c2)
1035+
solver = MiniZinc.Optimizer{Int}(MiniZinc.Chuffed())
1036+
attr = MOI.RawOptimizerAttribute("model_filename")
1037+
@test MOI.supports(solver, attr)
1038+
@test MOI.get(solver, attr) == ""
1039+
MOI.set(solver, attr, "test.mzn")
1040+
@test MOI.get(solver, attr) == "test.mzn"
1041+
index_map, _ = MOI.optimize!(solver, model)
1042+
@test MOI.get(solver, MOI.TerminationStatus()) === MOI.OPTIMAL
1043+
@test MOI.get(solver, MOI.ResultCount()) >= 1
1044+
@test MOI.get(solver, MOI.VariablePrimal(), index_map[x]) in [1, 2, 3]
1045+
@test read("test.mzn", String) == "var 1 .. 3: x1;\nsolve satisfy;\n"
1046+
rm("test.mzn")
1047+
return
1048+
end
1049+
10261050
end
10271051

10281052
TestMiniZinc.runtests()

0 commit comments

Comments
 (0)