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
30 changes: 17 additions & 13 deletions src/Utilities/mockoptimizer.jl
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ struct MockConstraintAttribute <: MOI.AbstractConstraintAttribute end
feature is that it can store the values that should be returned for each
attribute.
"""
mutable struct MockOptimizer{MT<:MOI.ModelLike} <: MOI.AbstractOptimizer
mutable struct MockOptimizer{MT<:MOI.ModelLike,T} <: MOI.AbstractOptimizer
inner_model::MT
# Flags
supports_names::Bool # Allows to test with optimizer not supporting names
Expand Down Expand Up @@ -47,12 +47,12 @@ mutable struct MockOptimizer{MT<:MOI.ModelLike} <: MOI.AbstractOptimizer
optimize_called::Bool
termination_status::MOI.TerminationStatusCode
result_count::Int
objective_value::Dict{Int,Float64}
dual_objective_value::Dict{Int,Float64}
objective_value::Dict{Int,T}
dual_objective_value::Dict{Int,T}
# Primal solution
primal_status::Dict{Int,MOI.ResultStatusCode}
variable_primal::Dict{MOI.VariableIndex,Dict{Int,Float64}}
callback_variable_primal::Dict{MOI.VariableIndex,Float64}
variable_primal::Dict{MOI.VariableIndex,Dict{Int,T}}
callback_variable_primal::Dict{MOI.VariableIndex,T}
# Dual solution
dual_status::Dict{Int,MOI.ResultStatusCode}
constraint_dual::Dict{MOI.ConstraintIndex,Dict{Int,Any}}
Expand All @@ -72,7 +72,8 @@ mutable struct MockOptimizer{MT<:MOI.ModelLike} <: MOI.AbstractOptimizer
end

function MockOptimizer(
inner_model::MOI.ModelLike;
inner_model::MOI.ModelLike,
T = Float64;
supports_names = true,
add_var_allowed = true,
add_con_allowed = true,
Expand All @@ -81,7 +82,7 @@ function MockOptimizer(
eval_variable_constraint_dual = true,
scalar_function_constant_non_zero = false,
)
return MockOptimizer(
return MockOptimizer{typeof(inner_model),T}(
inner_model,
# Flags
supports_names,
Expand All @@ -105,12 +106,12 @@ function MockOptimizer(
false,
MOI.OPTIMIZE_NOT_CALLED,
1,
Dict{Int,Float64}(),
Dict{Int,Float64}(),
Dict{Int,T}(),
Dict{Int,T}(),
# PrimalStatus
Dict{Int,MOI.ResultStatusCode}(),
Dict{MOI.VariableIndex,Dict{Int,Float64}}(),
Dict{MOI.VariableIndex,Float64}(),
Dict{MOI.VariableIndex,Dict{Int,T}}(),
Dict{MOI.VariableIndex,T}(),
# DualStatus
Dict{Int,MOI.ResultStatusCode}(),
Dict{MOI.ConstraintIndex,Dict{Int,Any}}(),
Expand Down Expand Up @@ -544,10 +545,13 @@ function MOI.get(mock::MockOptimizer, attr::MOI.ObjectiveValue)
return get(mock.objective_value, attr.result_index, NaN)
end

function MOI.get(mock::MockOptimizer, attr::MOI.DualObjectiveValue)
function MOI.get(
mock::MockOptimizer{<:MOI.ModelLike,T},
attr::MOI.DualObjectiveValue,
) where {T}
MOI.check_result_index_bounds(mock, attr)
if mock.eval_dual_objective_value
return get_fallback(mock, attr, Float64)
return get_fallback(mock, attr, T)
end
return get(mock.dual_objective_value, attr.result_index, NaN)
end
Expand Down
6 changes: 3 additions & 3 deletions test/Bridges/bridge_optimizer.jl
Original file line number Diff line number Diff line change
Expand Up @@ -514,11 +514,11 @@ function test_show()
)
@test_broken sprint(show, bridged_mock) == MOI.Utilities.replace_acronym(
"""
$(MOI.Bridges.Constraint.SingleBridgeOptimizer{MOI.Bridges.Constraint.LessToGreaterBridge{Float64,F,G} where G<:MOI.AbstractScalarFunction where F<:MOI.AbstractScalarFunction,MOI.Bridges.Constraint.SingleBridgeOptimizer{MOI.Bridges.Constraint.SplitIntervalBridge{Float64,F,S,LS,US} where US<:MOI.AbstractSet where LS<:MOI.AbstractSet where S<:MOI.AbstractSet where F<:MOI.AbstractFunction,MOI.Utilities.MockOptimizer{NoIntervalModel{Float64}}}})
$(MOI.Bridges.Constraint.SingleBridgeOptimizer{MOI.Bridges.Constraint.LessToGreaterBridge{Float64,F,G} where G<:MOI.AbstractScalarFunction where F<:MOI.AbstractScalarFunction,MOI.Bridges.Constraint.SingleBridgeOptimizer{MOI.Bridges.Constraint.SplitIntervalBridge{Float64,F,S,LS,US} where US<:MOI.AbstractSet where LS<:MOI.AbstractSet where S<:MOI.AbstractSet where F<:MOI.AbstractFunction,MOI.Utilities.MockOptimizer{NoIntervalModel{Float64},Float64}}})
with 1 constraint bridge
with inner model $(MOI.Bridges.Constraint.SingleBridgeOptimizer{MOI.Bridges.Constraint.SplitIntervalBridge{Float64,F,S,LS,US} where US<:MOI.AbstractSet where LS<:MOI.AbstractSet where S<:MOI.AbstractSet where F<:MOI.AbstractFunction,MOI.Utilities.MockOptimizer{NoIntervalModel{Float64}}})
with inner model $(MOI.Bridges.Constraint.SingleBridgeOptimizer{MOI.Bridges.Constraint.SplitIntervalBridge{Float64,F,S,LS,US} where US<:MOI.AbstractSet where LS<:MOI.AbstractSet where S<:MOI.AbstractSet where F<:MOI.AbstractFunction,MOI.Utilities.MockOptimizer{NoIntervalModel{Float64},Float64}})
with 0 constraint bridges
with inner model $(MOI.Utilities.MockOptimizer{NoIntervalModel{Float64}})""",
with inner model $(MOI.Utilities.MockOptimizer{NoIntervalModel{Float64},Float64})""",
)
return
end
Expand Down
15 changes: 6 additions & 9 deletions test/Test/Test.jl
Original file line number Diff line number Diff line change
Expand Up @@ -51,19 +51,16 @@ MOI.Test.runtests(

# Non-Float64 tests

# TODO(odow): fix excluded tests

MOI.Test.runtests(
MOI.Utilities.MockOptimizer(
MOI.Utilities.UniversalFallback(MOI.Utilities.Model{BigFloat}()),
BigFloat,
),
MOI.Test.Config(BigFloat),
include = ["test_constraint_", "test_linear_", "test_variable"],
exclude = String[
"test_constraint_qcp_duplicate_off_diagonal",
"test_linear_VectorAffineFunction_empty_row",
"test_linear_add_constraints",
"test_linear_integer_integration",
"test_linear_integration",
include = [
"test_basic_",
"test_constraint_",
"test_linear_",
"test_variable_",
],
)
7 changes: 4 additions & 3 deletions test/Utilities/cachingoptimizer.jl
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ function MOI.Test.setup_test(
model::MOI.Utilities.CachingOptimizer{
MOI.Utilities.MockOptimizer{
MOI.Utilities.UniversalFallback{MOI.Utilities.Model{Float64}},
Float64,
},
MOI.Utilities.Model{Float64},
},
Expand Down Expand Up @@ -627,7 +628,7 @@ function test_CachingOptimizer_AUTOMATIC_mode()
in state ATTACHED_OPTIMIZER
in mode AUTOMATIC
with model cache $(MOIU.Model{Float64})
with optimizer $(MOIU.MockOptimizer{MOIU.Model{Float64}})""")
with optimizer $(MOIU.MockOptimizer{MOIU.Model{Float64},Float64})""")

MOI.empty!(m)
@test MOIU.state(m) == MOIU.EMPTY_OPTIMIZER
Expand All @@ -644,11 +645,11 @@ function test_empty_model_and_optimizer()
@test MOIU.mode(m) == MOIU.AUTOMATIC
@test MOI.get(m, MOI.SolverName()) == "Mock"
@test sprint(show, m) == MOI.Utilities.replace_acronym("""
$(MOIU.CachingOptimizer{MOIU.MockOptimizer{MOIU.Model{Float64}},MOIU.Model{Float64}})
$(MOIU.CachingOptimizer{MOIU.MockOptimizer{MOIU.Model{Float64},Float64},MOIU.Model{Float64}})
in state EMPTY_OPTIMIZER
in mode AUTOMATIC
with model cache $(MOIU.Model{Float64})
with optimizer $(MOIU.MockOptimizer{MOIU.Model{Float64}})""")
with optimizer $(MOIU.MockOptimizer{MOIU.Model{Float64},Float64})""")
end

function test_empty_model_nonempty_optimizer()
Expand Down
2 changes: 2 additions & 0 deletions test/instantiate.jl
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,14 @@ function _test_instantiate(T)
optimizer = MOI.instantiate(optimizer_constructor)
@test optimizer isa MOI.Utilities.MockOptimizer{
MOI.Utilities.UniversalFallback{MOI.Utilities.Model{T}},
Float64,
}
@test MOI.get(optimizer, MOI.Silent())
optimizer = MOI.instantiate(optimizer_constructor, with_bridge_type = T)
@test optimizer isa MOI.Bridges.LazyBridgeOptimizer{
MOI.Utilities.MockOptimizer{
MOI.Utilities.UniversalFallback{MOI.Utilities.Model{T}},
Float64,
},
}
@test MOI.get(optimizer, MOI.Silent())
Expand Down