Skip to content

Commit

Permalink
Fix ConstraintNames in MOI wrapper (#107)
Browse files Browse the repository at this point in the history
  • Loading branch information
odow authored Mar 4, 2024
1 parent 4787294 commit 2726d70
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 12 deletions.
22 changes: 10 additions & 12 deletions src/MOI_wrapper.jl
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ function _F_linear_operator(model::Optimizer)
M = SparseArrays.sparse(Int32[], Int32[], Float64[], n, n)
q = zeros(n)
has_term = fill(false, n)
names = String[]
names = fill("", n)
for index in MOI.get(
model,
MOI.ListOfConstraintIndices{
Expand Down Expand Up @@ -234,11 +234,11 @@ function _F_linear_operator(model::Optimizer)
M[row_i, s_term.variable.value] += s_term.coefficient
end
c_name = MOI.get(model, MOI.ConstraintName(), index)
if Si.dimension == 2
push!(names, c_name)
if length(rows) == 2
names[rows[1]] = c_name
else
for i in 1:div(Si.dimension, 2)
push!(names, "$(c_name)[$i]")
names[rows[i]] = "$(c_name)[$i]"
end
end
end
Expand All @@ -264,7 +264,7 @@ end
function _F_nonlinear_operator(model::Optimizer)
x = MOI.get(model, MOI.ListOfVariableIndices())
f_map = Vector{MOI.ScalarNonlinearFunction}(undef, length(x))
names = String[]
names = fill("", length(x))
for (FType, SType) in MOI.get(model, MOI.ListOfConstraintTypesPresent())
if SType != MOI.Complements
continue
Expand All @@ -274,6 +274,7 @@ function _F_nonlinear_operator(model::Optimizer)
s = MOI.get(model, MOI.ConstraintSet(), ci)
N = div(MOI.dimension(s), 2)
scalars = MOI.Utilities.scalarize(f)
c_name = MOI.get(model, MOI.ConstraintName(), ci)
for i in 1:N
fi, xi = _to_f(scalars[i]), _to_x(scalars[i+N])
if isassigned(f_map, xi.value)
Expand All @@ -283,13 +284,10 @@ function _F_nonlinear_operator(model::Optimizer)
)
end
f_map[xi.value] = fi
end
c_name = MOI.get(model, MOI.ConstraintName(), ci)
if N == 1
push!(names, c_name)
else
for i in 1:N
push!(names, "$(c_name)[$i]")
if N == 1
names[xi.value] = c_name
else
names[xi.value] = "$(c_name)[$i]"
end
end
end
Expand Down
38 changes: 38 additions & 0 deletions test/MOI_wrapper.jl
Original file line number Diff line number Diff line change
Expand Up @@ -551,6 +551,44 @@ function test_solve_with_names_nonlinear()
return
end

function test_nonlinear_blank_row()
model = PATHSolver.Optimizer()
MOI.Utilities.loadfromstring!(
model,
"""
variables: a, x
[1.0 * x * x + 2.0 * x + -1.0, x] in Complements(2)
a in GreaterThan(0.0)
x in GreaterThan(0.0)
""",
)
x = MOI.get(model, MOI.ListOfVariableIndices())
MOI.optimize!(model)
@test (
MOI.get.(model, MOI.VariablePrimal(), x),
[0.0, -1 + sqrt(2)];
atol = 1e-6,
)
return
end

function test_linear_blank_row()
model = PATHSolver.Optimizer()
MOI.Utilities.loadfromstring!(
model,
"""
variables: a, x
c: [2.0 * x + -1.0, x] in Complements(2)
a in GreaterThan(0.0)
x in GreaterThan(0.0)
""",
)
x = MOI.get(model, MOI.ListOfVariableIndices())
MOI.optimize!(model)
@test (MOI.get.(model, MOI.VariablePrimal(), x), [0.0, 0.5]; atol = 1e-6)
return
end

end

TestMOIWrapper.runtests()

0 comments on commit 2726d70

Please sign in to comment.