Skip to content

Commit ae4ad7c

Browse files
authored
[Utilities] Support generic number type in MockOptimizer (#1677)
1 parent f395b38 commit ae4ad7c

File tree

5 files changed

+32
-28
lines changed

5 files changed

+32
-28
lines changed

src/Utilities/mockoptimizer.jl

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ struct MockConstraintAttribute <: MOI.AbstractConstraintAttribute end
1515
feature is that it can store the values that should be returned for each
1616
attribute.
1717
"""
18-
mutable struct MockOptimizer{MT<:MOI.ModelLike} <: MOI.AbstractOptimizer
18+
mutable struct MockOptimizer{MT<:MOI.ModelLike,T} <: MOI.AbstractOptimizer
1919
inner_model::MT
2020
# Flags
2121
supports_names::Bool # Allows to test with optimizer not supporting names
@@ -47,12 +47,12 @@ mutable struct MockOptimizer{MT<:MOI.ModelLike} <: MOI.AbstractOptimizer
4747
optimize_called::Bool
4848
termination_status::MOI.TerminationStatusCode
4949
result_count::Int
50-
objective_value::Dict{Int,Float64}
51-
dual_objective_value::Dict{Int,Float64}
50+
objective_value::Dict{Int,T}
51+
dual_objective_value::Dict{Int,T}
5252
# Primal solution
5353
primal_status::Dict{Int,MOI.ResultStatusCode}
54-
variable_primal::Dict{MOI.VariableIndex,Dict{Int,Float64}}
55-
callback_variable_primal::Dict{MOI.VariableIndex,Float64}
54+
variable_primal::Dict{MOI.VariableIndex,Dict{Int,T}}
55+
callback_variable_primal::Dict{MOI.VariableIndex,T}
5656
# Dual solution
5757
dual_status::Dict{Int,MOI.ResultStatusCode}
5858
constraint_dual::Dict{MOI.ConstraintIndex,Dict{Int,Any}}
@@ -72,7 +72,8 @@ mutable struct MockOptimizer{MT<:MOI.ModelLike} <: MOI.AbstractOptimizer
7272
end
7373

7474
function MockOptimizer(
75-
inner_model::MOI.ModelLike;
75+
inner_model::MOI.ModelLike,
76+
T = Float64;
7677
supports_names = true,
7778
add_var_allowed = true,
7879
add_con_allowed = true,
@@ -81,7 +82,7 @@ function MockOptimizer(
8182
eval_variable_constraint_dual = true,
8283
scalar_function_constant_non_zero = false,
8384
)
84-
return MockOptimizer(
85+
return MockOptimizer{typeof(inner_model),T}(
8586
inner_model,
8687
# Flags
8788
supports_names,
@@ -105,12 +106,12 @@ function MockOptimizer(
105106
false,
106107
MOI.OPTIMIZE_NOT_CALLED,
107108
1,
108-
Dict{Int,Float64}(),
109-
Dict{Int,Float64}(),
109+
Dict{Int,T}(),
110+
Dict{Int,T}(),
110111
# PrimalStatus
111112
Dict{Int,MOI.ResultStatusCode}(),
112-
Dict{MOI.VariableIndex,Dict{Int,Float64}}(),
113-
Dict{MOI.VariableIndex,Float64}(),
113+
Dict{MOI.VariableIndex,Dict{Int,T}}(),
114+
Dict{MOI.VariableIndex,T}(),
114115
# DualStatus
115116
Dict{Int,MOI.ResultStatusCode}(),
116117
Dict{MOI.ConstraintIndex,Dict{Int,Any}}(),
@@ -544,10 +545,13 @@ function MOI.get(mock::MockOptimizer, attr::MOI.ObjectiveValue)
544545
return get(mock.objective_value, attr.result_index, NaN)
545546
end
546547

547-
function MOI.get(mock::MockOptimizer, attr::MOI.DualObjectiveValue)
548+
function MOI.get(
549+
mock::MockOptimizer{<:MOI.ModelLike,T},
550+
attr::MOI.DualObjectiveValue,
551+
) where {T}
548552
MOI.check_result_index_bounds(mock, attr)
549553
if mock.eval_dual_objective_value
550-
return get_fallback(mock, attr, Float64)
554+
return get_fallback(mock, attr, T)
551555
end
552556
return get(mock.dual_objective_value, attr.result_index, NaN)
553557
end

test/Bridges/bridge_optimizer.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -514,11 +514,11 @@ function test_show()
514514
)
515515
@test_broken sprint(show, bridged_mock) == MOI.Utilities.replace_acronym(
516516
"""
517-
$(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}}}})
517+
$(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}}})
518518
with 1 constraint bridge
519-
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}}})
519+
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}})
520520
with 0 constraint bridges
521-
with inner model $(MOI.Utilities.MockOptimizer{NoIntervalModel{Float64}})""",
521+
with inner model $(MOI.Utilities.MockOptimizer{NoIntervalModel{Float64},Float64})""",
522522
)
523523
return
524524
end

test/Test/Test.jl

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,19 +51,16 @@ MOI.Test.runtests(
5151

5252
# Non-Float64 tests
5353

54-
# TODO(odow): fix excluded tests
55-
5654
MOI.Test.runtests(
5755
MOI.Utilities.MockOptimizer(
5856
MOI.Utilities.UniversalFallback(MOI.Utilities.Model{BigFloat}()),
57+
BigFloat,
5958
),
6059
MOI.Test.Config(BigFloat),
61-
include = ["test_constraint_", "test_linear_", "test_variable"],
62-
exclude = String[
63-
"test_constraint_qcp_duplicate_off_diagonal",
64-
"test_linear_VectorAffineFunction_empty_row",
65-
"test_linear_add_constraints",
66-
"test_linear_integer_integration",
67-
"test_linear_integration",
60+
include = [
61+
"test_basic_",
62+
"test_constraint_",
63+
"test_linear_",
64+
"test_variable_",
6865
],
6966
)

test/Utilities/cachingoptimizer.jl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ function MOI.Test.setup_test(
137137
model::MOI.Utilities.CachingOptimizer{
138138
MOI.Utilities.MockOptimizer{
139139
MOI.Utilities.UniversalFallback{MOI.Utilities.Model{Float64}},
140+
Float64,
140141
},
141142
MOI.Utilities.Model{Float64},
142143
},
@@ -627,7 +628,7 @@ function test_CachingOptimizer_AUTOMATIC_mode()
627628
in state ATTACHED_OPTIMIZER
628629
in mode AUTOMATIC
629630
with model cache $(MOIU.Model{Float64})
630-
with optimizer $(MOIU.MockOptimizer{MOIU.Model{Float64}})""")
631+
with optimizer $(MOIU.MockOptimizer{MOIU.Model{Float64},Float64})""")
631632

632633
MOI.empty!(m)
633634
@test MOIU.state(m) == MOIU.EMPTY_OPTIMIZER
@@ -644,11 +645,11 @@ function test_empty_model_and_optimizer()
644645
@test MOIU.mode(m) == MOIU.AUTOMATIC
645646
@test MOI.get(m, MOI.SolverName()) == "Mock"
646647
@test sprint(show, m) == MOI.Utilities.replace_acronym("""
647-
$(MOIU.CachingOptimizer{MOIU.MockOptimizer{MOIU.Model{Float64}},MOIU.Model{Float64}})
648+
$(MOIU.CachingOptimizer{MOIU.MockOptimizer{MOIU.Model{Float64},Float64},MOIU.Model{Float64}})
648649
in state EMPTY_OPTIMIZER
649650
in mode AUTOMATIC
650651
with model cache $(MOIU.Model{Float64})
651-
with optimizer $(MOIU.MockOptimizer{MOIU.Model{Float64}})""")
652+
with optimizer $(MOIU.MockOptimizer{MOIU.Model{Float64},Float64})""")
652653
end
653654

654655
function test_empty_model_nonempty_optimizer()

test/instantiate.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@ function _test_instantiate(T)
1818
optimizer = MOI.instantiate(optimizer_constructor)
1919
@test optimizer isa MOI.Utilities.MockOptimizer{
2020
MOI.Utilities.UniversalFallback{MOI.Utilities.Model{T}},
21+
Float64,
2122
}
2223
@test MOI.get(optimizer, MOI.Silent())
2324
optimizer = MOI.instantiate(optimizer_constructor, with_bridge_type = T)
2425
@test optimizer isa MOI.Bridges.LazyBridgeOptimizer{
2526
MOI.Utilities.MockOptimizer{
2627
MOI.Utilities.UniversalFallback{MOI.Utilities.Model{T}},
28+
Float64,
2729
},
2830
}
2931
@test MOI.get(optimizer, MOI.Silent())

0 commit comments

Comments
 (0)