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
7 changes: 6 additions & 1 deletion src/Bridges/Objective/slack.jl
Original file line number Diff line number Diff line change
Expand Up @@ -131,11 +131,16 @@ function MOI.get(
return obj_slack_constant + slack - constant
end

_constant_term(set::MOI.LessThan) = set.upper
_constant_term(set::MOI.GreaterThan) = set.lower

function MOI.get(
model::MOI.ModelLike,
::MOI.ObjectiveFunction{G},
bridge::SlackBridge{T,F,G},
) where {T,F,G<:MOI.AbstractScalarFunction}
func = MOI.get(model, MOI.ConstraintFunction(), bridge.constraint)
return MOIU.convert_approx(G, MOIU.remove_variable(func, bridge.slack))
set = MOI.get(model, MOI.ConstraintSet(), bridge.constraint)
f = MOIU.operate(-, T, func, _constant_term(set))
return MOIU.convert_approx(G, MOIU.remove_variable(f, bridge.slack))
end
53 changes: 34 additions & 19 deletions test/Bridges/Objective/functionize.jl
Original file line number Diff line number Diff line change
@@ -1,25 +1,35 @@
module TestObjectiveFunctionize

using Test

using MathOptInterface
const MOI = MathOptInterface
const MOIT = MathOptInterface.DeprecatedTest
const MOIU = MathOptInterface.Utilities
const MOIB = MathOptInterface.Bridges

include("../utilities.jl")

mock = MOIU.MockOptimizer(MOIU.Model{Float64}())
config = MOIT.Config()
function runtests()
for name in names(@__MODULE__; all = true)
if startswith("$(name)", "test_")
@testset "$(name)" begin
getfield(@__MODULE__, name)()
end
end
end
return
end

bridged_mock = MOIB.Objective.Functionize{Float64}(mock)
include("../utilities.jl")

@testset "solve_singlevariable_obj" begin
MOIU.set_mock_optimize!(
function test_solve_singlevariable_obj()
mock = MOI.Utilities.MockOptimizer(MOI.Utilities.Model{Float64}())
bridged_mock = MOI.Bridges.Objective.Functionize{Float64}(mock)
MOI.Utilities.set_mock_optimize!(
mock,
(mock::MOIU.MockOptimizer) ->
MOIU.mock_optimize!(mock, [1.0], MOI.FEASIBLE_POINT),
(mock::MOI.Utilities.MockOptimizer) ->
MOI.Utilities.mock_optimize!(mock, [1.0], MOI.FEASIBLE_POINT),
)
MOI.Test.test_objective_ObjectiveFunction_SingleVariable(
bridged_mock,
MOI.Test.Config(),
)
MOIT.solve_singlevariable_obj(bridged_mock, config)
@test MOI.get(mock, MOI.ObjectiveFunctionType()) ==
MOI.ScalarAffineFunction{Float64}
@test MOI.get(bridged_mock, MOI.ObjectiveFunctionType()) ==
Expand All @@ -38,20 +48,25 @@ bridged_mock = MOIB.Objective.Functionize{Float64}(mock)
@test MOI.get(mock, MOI.ObjectiveSense()) == MOI.MAX_SENSE
@test MOI.get(bridged_mock, MOI.ObjectiveSense()) == MOI.MAX_SENSE
_test_delete_objective(bridged_mock, 1, tuple())
return
end

# Tests that the `ObjectiveValue` attribute passed has the correct
# `result_index`.
@testset "solve_result_index" begin
MOIU.set_mock_optimize!(
function test_solve_result_index()
mock = MOI.Utilities.MockOptimizer(MOI.Utilities.Model{Float64}())
bridged_mock = MOI.Bridges.Objective.Functionize{Float64}(mock)
MOI.Utilities.set_mock_optimize!(
mock,
(mock::MOIU.MockOptimizer) -> MOIU.mock_optimize!(
(mock::MOI.Utilities.MockOptimizer) -> MOI.Utilities.mock_optimize!(
mock,
MOI.OPTIMAL,
(MOI.FEASIBLE_POINT, [1.0]),
MOI.FEASIBLE_POINT,
(MOI.SingleVariable, MOI.GreaterThan{Float64}) => [1.0],
),
)
MOIT.solve_result_index(bridged_mock, config)
return MOI.Test.test_solve_result_index(bridged_mock, MOI.Test.Config())
end

end # module

TestObjectiveFunctionize.runtests()
77 changes: 50 additions & 27 deletions test/Bridges/Objective/map.jl
Original file line number Diff line number Diff line change
@@ -1,42 +1,65 @@
module TestObjectiveMap

using Test

using MathOptInterface
const MOI = MathOptInterface
const MOIB = MOI.Bridges

struct ObjectiveDummyBridge <: MOIB.Objective.AbstractBridge
function runtests()
for name in names(@__MODULE__; all = true)
if startswith("$(name)", "test_")
@testset "$(name)" begin
getfield(@__MODULE__, name)()
end
end
end
return
end

struct ObjectiveDummyBridge <: MOI.Bridges.Objective.AbstractBridge
id::Int
end

function test_empty(map)
function _test_empty(map)
@test isempty(map)
@test length(map) == 0
@test isempty(values(map))
@test iterate(map) === nothing
@test MOIB.Objective.function_type(map) === nothing
@test MOI.Bridges.Objective.function_type(map) === nothing
end

map = MOIB.Objective.Map()
test_empty(map)
@test sprint(MOIB.print_num_bridges, map) == "\nwith 0 objective bridges"

x = MOI.VariableIndex(1)
fx = MOI.SingleVariable(x)
MOIB.Objective.add_key_for_bridge(map, ObjectiveDummyBridge(1), fx)
@test MOIB.Objective.root_bridge(map) == ObjectiveDummyBridge(1)
@test sprint(MOIB.print_num_bridges, map) == "\nwith 1 objective bridge"
func = 1.0fx
MOIB.Objective.add_key_for_bridge(map, ObjectiveDummyBridge(2), func)
@test MOIB.Objective.root_bridge(map) == ObjectiveDummyBridge(2)
@test sprint(MOIB.print_num_bridges, map) == "\nwith 2 objective bridges"

empty!(map)
test_empty(map)
@test sprint(MOIB.print_num_bridges, map) == "\nwith 0 objective bridges"

@testset "EmptyMap" begin
map = MOIB.Objective.EmptyMap()
test_empty(map)
function test_Map()
map = MOI.Bridges.Objective.Map()
_test_empty(map)
@test sprint(MOI.Bridges.print_num_bridges, map) ==
"\nwith 0 objective bridges"
x = MOI.VariableIndex(1)
fx = MOI.SingleVariable(x)
MOI.Bridges.Objective.add_key_for_bridge(map, ObjectiveDummyBridge(1), fx)
@test MOI.Bridges.Objective.root_bridge(map) == ObjectiveDummyBridge(1)
@test sprint(MOI.Bridges.print_num_bridges, map) ==
"\nwith 1 objective bridge"
func = 1.0fx
MOI.Bridges.Objective.add_key_for_bridge(map, ObjectiveDummyBridge(2), func)
@test MOI.Bridges.Objective.root_bridge(map) == ObjectiveDummyBridge(2)
@test sprint(MOI.Bridges.print_num_bridges, map) ==
"\nwith 2 objective bridges"
empty!(map)
test_empty(map)
@test sprint(MOIB.print_num_bridges, map) == ""
_test_empty(map)
@test sprint(MOI.Bridges.print_num_bridges, map) ==
"\nwith 0 objective bridges"
return
end

function test_EmptyMap()
map = MOI.Bridges.Objective.EmptyMap()
_test_empty(map)
empty!(map)
_test_empty(map)
@test sprint(MOI.Bridges.print_num_bridges, map) == ""
return
end

end # module

TestObjectiveMap.runtests()
Loading