Skip to content

Commit bc8751f

Browse files
authored
Fix writing integer variables with float bounds (#78)
1 parent 8c7a7d3 commit bc8751f

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed

src/write.jl

+3
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,16 @@ function _write_variables(io::IO, model::Model{T}) where {T}
6060
end
6161
elseif info.is_int
6262
if typemin(T) < lb && ub < typemax(T)
63+
lb, ub = ceil(Int, lb), floor(Int, ub)
6364
println(io, "var $lb .. $ub: $(info.name);")
6465
else
6566
println(io, "var int: $(info.name);")
6667
if ub < typemax(T)
68+
ub = floor(Int, ub)
6769
println(io, "constraint int_le($(info.name), $ub);")
6870
end
6971
if typemin(T) < lb
72+
lb = ceil(Int, lb)
7073
println(io, "constraint int_le($lb, $(info.name));")
7174
end
7275
end

test/runtests.jl

+69
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,35 @@ function test_write_int()
9191
return
9292
end
9393

94+
function test_write_int_float_interval()
95+
model = MiniZinc.Model{Float64}()
96+
x, _ = MOI.add_constrained_variable(model, MOI.Integer())
97+
MOI.add_constraint(model, x, MOI.Interval(1.5, 3.2))
98+
@test sprint(write, model) == """
99+
var 2 .. 3: x1;
100+
solve satisfy;
101+
"""
102+
return
103+
end
104+
105+
function test_write_int_float_greater_than()
106+
model = MiniZinc.Model{Float64}()
107+
x, _ = MOI.add_constrained_variable(model, MOI.Integer())
108+
MOI.add_constraint(model, x, MOI.GreaterThan(1.5))
109+
@test sprint(write, model) ==
110+
"var int: x1;\nconstraint int_le(2, x1);\nsolve satisfy;\n"
111+
return
112+
end
113+
114+
function test_write_int_float_less_than()
115+
model = MiniZinc.Model{Float64}()
116+
x, _ = MOI.add_constrained_variable(model, MOI.Integer())
117+
MOI.add_constraint(model, x, MOI.LessThan(1.5))
118+
@test sprint(write, model) ==
119+
"var int: x1;\nconstraint int_le(x1, 1);\nsolve satisfy;\n"
120+
return
121+
end
122+
94123
function test_write_interval()
95124
model = MiniZinc.Model{Int}()
96125
x, _ = MOI.add_constrained_variable(model, MOI.Integer())
@@ -1630,6 +1659,46 @@ function test_infix_unary_addition()
16301659
return
16311660
end
16321661

1662+
function test_integer_bounds_interval()
1663+
model = MOI.Utilities.Model{Float64}()
1664+
x = MOI.add_variables(model, 3)
1665+
MOI.add_constraint.(model, x, MOI.Integer())
1666+
MOI.add_constraint.(model, x, MOI.Interval(1.0, 3.0))
1667+
MOI.add_constraint(model, MOI.VectorOfVariables(x), MOI.AllDifferent(3))
1668+
mzn = MiniZinc.Optimizer{Float64}("highs")
1669+
index_map, _ = MOI.optimize!(mzn, model)
1670+
@test MOI.get(mzn, MOI.TerminationStatus()) == MOI.OPTIMAL
1671+
y = [MOI.get(mzn, MOI.VariablePrimal(), index_map[xi]) for xi in x]
1672+
@test sort(y) == [1, 2, 3]
1673+
return
1674+
end
1675+
1676+
function test_integer_bounds_greater_than()
1677+
model = MOI.Utilities.Model{Float64}()
1678+
x, _ = MOI.add_constrained_variable(model, MOI.Integer())
1679+
MOI.add_constraint(model, x, MOI.GreaterThan(1.5))
1680+
MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE)
1681+
MOI.set(model, MOI.ObjectiveFunction{MOI.VariableIndex}(), x)
1682+
mzn = MiniZinc.Optimizer{Float64}("highs")
1683+
index_map, _ = MOI.optimize!(mzn, model)
1684+
@test MOI.get(mzn, MOI.TerminationStatus()) == MOI.OPTIMAL
1685+
@test MOI.get(mzn, MOI.VariablePrimal(), index_map[x]) == 2
1686+
return
1687+
end
1688+
1689+
function test_integer_bounds_less_than_than()
1690+
model = MOI.Utilities.Model{Float64}()
1691+
x, _ = MOI.add_constrained_variable(model, MOI.Integer())
1692+
MOI.add_constraint(model, x, MOI.LessThan(1.5))
1693+
MOI.set(model, MOI.ObjectiveSense(), MOI.MAX_SENSE)
1694+
MOI.set(model, MOI.ObjectiveFunction{MOI.VariableIndex}(), x)
1695+
mzn = MiniZinc.Optimizer{Float64}("highs")
1696+
index_map, _ = MOI.optimize!(mzn, model)
1697+
@test MOI.get(mzn, MOI.TerminationStatus()) == MOI.OPTIMAL
1698+
@test MOI.get(mzn, MOI.VariablePrimal(), index_map[x]) == 1
1699+
return
1700+
end
1701+
16331702
end
16341703

16351704
TestMiniZinc.runtests()

0 commit comments

Comments
 (0)