From f96979f7e07e469e67e74e0173941f1f16a3cbcd Mon Sep 17 00:00:00 2001 From: odow Date: Tue, 23 Nov 2021 11:29:39 +1300 Subject: [PATCH] [Utilities] Support generic number type in MockOptimizer --- src/Utilities/mockoptimizer.jl | 30 +++++++++++++++++------------- test/Bridges/bridge_optimizer.jl | 6 +++--- test/Test/Test.jl | 15 ++++++--------- test/Utilities/cachingoptimizer.jl | 7 ++++--- test/instantiate.jl | 2 ++ 5 files changed, 32 insertions(+), 28 deletions(-) diff --git a/src/Utilities/mockoptimizer.jl b/src/Utilities/mockoptimizer.jl index 7b0f77f433..4b2b4a3d2d 100644 --- a/src/Utilities/mockoptimizer.jl +++ b/src/Utilities/mockoptimizer.jl @@ -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 @@ -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}} @@ -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, @@ -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, @@ -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}}(), @@ -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 diff --git a/test/Bridges/bridge_optimizer.jl b/test/Bridges/bridge_optimizer.jl index 79036e32bd..b6134920d0 100644 --- a/test/Bridges/bridge_optimizer.jl +++ b/test/Bridges/bridge_optimizer.jl @@ -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 diff --git a/test/Test/Test.jl b/test/Test/Test.jl index 8697cebf36..68f3dbad2c 100644 --- a/test/Test/Test.jl +++ b/test/Test/Test.jl @@ -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_", ], ) diff --git a/test/Utilities/cachingoptimizer.jl b/test/Utilities/cachingoptimizer.jl index 2243cf8e61..5887b3e024 100644 --- a/test/Utilities/cachingoptimizer.jl +++ b/test/Utilities/cachingoptimizer.jl @@ -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}, }, @@ -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 @@ -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() diff --git a/test/instantiate.jl b/test/instantiate.jl index bf03f1eaf9..a6258f92a5 100644 --- a/test/instantiate.jl +++ b/test/instantiate.jl @@ -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())