Skip to content

Commit

Permalink
Modify constraint sets
Browse files Browse the repository at this point in the history
  • Loading branch information
odow committed Jan 23, 2024
1 parent 5842d04 commit 70efebd
Show file tree
Hide file tree
Showing 2 changed files with 111 additions and 1 deletion.
25 changes: 25 additions & 0 deletions src/MOI_wrapper.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1590,6 +1590,31 @@ function MOI.set(
return
end

function MOI.set(
model::Optimizer,
::MOI.ConstraintSet,
c::Vector{MOI.ConstraintIndex{MOI.ScalarAffineFunction{Float64},S}},
s::Vector{S},
) where {S<:_SCALAR_SETS}
if length(c) != length(s)
msg = "number of constraints does not match number of sets"
throw(DimensionMismatch(msg))
end
for ci in c
MOI.throw_if_not_valid(model, ci)
end
N = length(c)
rows, lower, upper = zeros(Cint, N), zeros(Cdouble, N), zeros(Cdouble, N)
for (i, (ci, si)) in enumerate(zip(c, s))
info = _info(model, ci)
rows[i] = info.row
lower[i], upper[i] = info.lower, info.upper = _bounds(si)
end
ret = Highs_changeRowsBoundsBySet(model, N, rows, lower, upper)
_check_ret(ret)
return
end

function MOI.get(
model::Optimizer,
::MOI.ConstraintFunction,
Expand Down
87 changes: 86 additions & 1 deletion test/MOI_wrapper.jl
Original file line number Diff line number Diff line change
Expand Up @@ -543,7 +543,7 @@ function test_change_col_bounds_by_set_less_than()
return
end

function test_change_col_bounds_by_set_less_than()
function test_change_col_bounds_by_set_equal_to()
model = HiGHS.Optimizer()
MOI.set(model, MOI.Silent(), true)
x = MOI.add_variables(model, 3)
Expand All @@ -561,6 +561,91 @@ function test_change_col_bounds_by_set_less_than()
return
end

function test_change_row_bounds_by_set_dimension_mismatch()
model = HiGHS.Optimizer()
MOI.set(model, MOI.Silent(), true)
x = MOI.add_variables(model, 3)
c = MOI.add_constraint.(model, 1.0 .* x, MOI.GreaterThan.(1.0:3.0))
@test_throws(
DimensionMismatch,
MOI.set(model, MOI.ConstraintSet(), c, MOI.GreaterThan.([4.0, 5.0])),
)
return
end

function test_change_row_bounds_by_set_invalid()
model = HiGHS.Optimizer()
MOI.set(model, MOI.Silent(), true)
x = MOI.add_variable(model)
c = MOI.add_constraint(model, 1.0 .* x, MOI.GreaterThan(0.0))
c_invalid = typeof(c)(-123456)
sets = MOI.GreaterThan.(1.0:2.0)
@test_throws(
MOI.InvalidIndex(c_invalid),
MOI.set(model, MOI.ConstraintSet(), [c, c_invalid], sets),
)
return
end

function test_change_row_bounds_by_set_greater_than()
model = HiGHS.Optimizer()
MOI.set(model, MOI.Silent(), true)
x = MOI.add_variables(model, 3)
c = MOI.add_constraint.(model, 1.0 .* x, MOI.GreaterThan.(1.0:3.0))
MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE)
f = 1.0 * x[1] + x[2] + x[3]
MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f)
MOI.optimize!(model)
@test (MOI.get(model, MOI.ObjectiveValue()), 6; atol = 1e-6)
MOI.set(
model,
MOI.ConstraintSet(),
[c[1], c[3]],
MOI.GreaterThan.([4.0, 5.0]),
)
MOI.optimize!(model)
@test (MOI.get(model, MOI.ObjectiveValue()), 11; atol = 1e-6)
@test MOI.get(model, MOI.ConstraintSet(), c) ==
MOI.GreaterThan.([4.0, 2.0, 5.0])
return
end

function test_change_row_bounds_by_set_less_than()
model = HiGHS.Optimizer()
MOI.set(model, MOI.Silent(), true)
x = MOI.add_variables(model, 3)
c = MOI.add_constraint.(model, 1.0 .* x, MOI.LessThan.(1.0:3.0))
MOI.set(model, MOI.ObjectiveSense(), MOI.MAX_SENSE)
f = 1.0 * x[1] + x[2] + x[3]
MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f)
MOI.optimize!(model)
@test (MOI.get(model, MOI.ObjectiveValue()), 6; atol = 1e-6)
MOI.set(model, MOI.ConstraintSet(), [c[1], c[3]], MOI.LessThan.([4.0, 5.0]))
MOI.optimize!(model)
@test (MOI.get(model, MOI.ObjectiveValue()), 11; atol = 1e-6)
@test MOI.get(model, MOI.ConstraintSet(), c) ==
MOI.LessThan.([4.0, 2.0, 5.0])
return
end

function test_change_row_bounds_by_set_equal_to()
model = HiGHS.Optimizer()
MOI.set(model, MOI.Silent(), true)
x = MOI.add_variables(model, 3)
c = MOI.add_constraint.(model, 1.0 .* x, MOI.EqualTo.(1.0:3.0))
MOI.set(model, MOI.ObjectiveSense(), MOI.MAX_SENSE)
f = 1.0 * x[1] + x[2] + x[3]
MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f)
MOI.optimize!(model)
@test (MOI.get(model, MOI.ObjectiveValue()), 6; atol = 1e-6)
MOI.set(model, MOI.ConstraintSet(), [c[1], c[3]], MOI.EqualTo.([4.0, 5.0]))
MOI.optimize!(model)
@test (MOI.get(model, MOI.ObjectiveValue()), 11; atol = 1e-6)
@test MOI.get(model, MOI.ConstraintSet(), c) ==
MOI.EqualTo.([4.0, 2.0, 5.0])
return
end

end

TestMOIHighs.runtests()

0 comments on commit 70efebd

Please sign in to comment.