Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/Bridges/Constraint/scalarize.jl
Original file line number Diff line number Diff line change
Expand Up @@ -122,15 +122,15 @@ function MOI.modify(model::MOI.ModelLike, bridge::ScalarizeBridge,
nothing
end
function MOI.set(model::MOI.ModelLike, ::MOI.ConstraintFunction,
bridge::ScalarizeBridge{T}, func) where T
bridge::ScalarizeBridge{T,F,S}, func) where {T,F,S}
old_constants = bridge.constants
bridge.constants = MOI.constant(func, T)
new_func = MOIU.scalarize(func, true)
MOI.set.(model, MOI.ConstraintFunction(), bridge.scalar_constraints,
new_func)
for i in eachindex(bridge.constants)
if bridge.constants[i] != old_constants[i]
MOI.set(model, MOI.ConstraintSet(), bridge.scalar_constraints,
MOI.set(model, MOI.ConstraintSet(), bridge.scalar_constraints[i],
S(-bridge.constants[i]))
end
end
Expand Down
45 changes: 45 additions & 0 deletions src/Test/UnitTests/modifications.jl
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,51 @@ function solve_func_scalaraffine_lessthan(model::MOI.ModelLike, config::TestConf
end
modificationtests["solve_func_scalaraffine_lessthan"] = solve_func_scalaraffine_lessthan

"""
solve_func_vectoraffine_nonneg(model::MOI.ModelLike, config::TestConfig)

Test setting the function in a VectorAffineFunction-in-Nonnegatives
constraint. If `config.solve=true` confirm that it solves correctly, and if
`config.duals=true`, check that the duals are computed correctly.
"""
function solve_func_vectoraffine_nonneg(model::MOI.ModelLike, config::TestConfig)
MOI.empty!(model)
MOIU.loadfromstring!(model,"""
variables: x, y
minobjective: 1.0x + 2.0y
c: [1.0x, 2.0y] in Nonnegatives(2)
""")
x = MOI.get(model, MOI.VariableIndex, "x")
y = MOI.get(model, MOI.VariableIndex, "y")
c = MOI.get(model, MOI.ConstraintIndex, "c")
test_model_solution(model, config;
objective_value = 0.0,
variable_primal = [(x, 0.0), (y, 0.0)],
constraint_primal = [(c, [0.0, 0.0])]
)
MOI.set(model, MOI.ConstraintFunction(), c,
MOI.VectorAffineFunction([
MOI.VectorAffineTerm(1, MOI.ScalarAffineTerm(1.0, x)),
MOI.VectorAffineTerm(2, MOI.ScalarAffineTerm(2.0, y))
],
[-1.0, -1.5]
)
)
foo = MOI.get(model, MOI.ConstraintFunction(), c)
@test foo ≈ MOI.VectorAffineFunction([
MOI.VectorAffineTerm(1, MOI.ScalarAffineTerm(1.0, x)),
MOI.VectorAffineTerm(2, MOI.ScalarAffineTerm(2.0, y))
],
[-1.0, -1.5]
)
test_model_solution(model, config;
objective_value = 2.5,
variable_primal = [(x, 1.0), (y, 0.75)],
constraint_primal = [(c, [0.0, 0.0])]
)
end
modificationtests["solve_func_vectoraffine_nonneg"] = solve_func_vectoraffine_nonneg

"""
solve_const_vectoraffine_nonpos(model::MOI.ModelLike, config::TestConfig)

Expand Down
6 changes: 6 additions & 0 deletions test/Bridges/Constraint/scalarize.jl
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,12 @@ config = MOIT.TestConfig()
((MOI.ScalarAffineFunction{Float64}, MOI.EqualTo{Float64}, 0),
(MOI.ScalarAffineFunction{Float64}, MOI.GreaterThan{Float64}, 0)))

# Test setting VectorAffineFunction with nonzero constants
MOIU.set_mock_optimize!(mock,
(mock::MOIU.MockOptimizer) -> MOIU.mock_optimize!(mock, [0.0, 0.0]),
(mock::MOIU.MockOptimizer) -> MOIU.mock_optimize!(mock, [1.0, 0.75]))
MOIT.solve_func_vectoraffine_nonneg(bridged_mock, config)

# VectorOfVariables-in-Nonnegatives
# VectorOfVariables-in-Nonpositives
# VectorOfVariables-in-Zeros
Expand Down