diff --git a/Project.toml b/Project.toml index 4b458f23..91311775 100644 --- a/Project.toml +++ b/Project.toml @@ -1,15 +1,15 @@ name = "Dualization" uuid = "191a621a-6537-11e9-281d-650236a99e60" authors = ["guilhermebodin "] -version = "0.3.5" +version = "0.4.0" [deps] JuMP = "4076af6c-e467-56ae-b986-b466b2749572" MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" [compat] -JuMP = "0.21" -MathOptInterface = "0.9" +JuMP = "0.22" +MathOptInterface = "0.10" julia = "1" [extras] diff --git a/docs/src/manual.md b/docs/src/manual.md index 3df9b1b4..4d5df3dd 100644 --- a/docs/src/manual.md +++ b/docs/src/manual.md @@ -110,9 +110,9 @@ a constraint not listed here, it will return an unsupported error. | MOI Function | MOI Set | |:-------|:---------------| -| `SingleVariable` | `GreaterThan` | -| `SingleVariable` | `LessThan` | -| `SingleVariable` | `EqualTo` | +| `VariableIndex` | `GreaterThan` | +| `VariableIndex` | `LessThan` | +| `VariableIndex` | `EqualTo` | | `ScalarAffineFunction` | `GreaterThan` | | `ScalarAffineFunction` | `LessThan` | | `ScalarAffineFunction` | `EqualTo` | @@ -143,7 +143,7 @@ Note that some of MOI constraints can be bridged, see [Bridges](http://jump.dev/ | MOI Function | |:-------:| -| `SingleVariable` | +| `VariableIndex` | | `ScalarAffineFunction` | ## Dualize a model diff --git a/src/Dualization.jl b/src/Dualization.jl index fe62b8dd..d798fe25 100644 --- a/src/Dualization.jl +++ b/src/Dualization.jl @@ -5,16 +5,14 @@ const MOI = MathOptInterface const MOIU = MathOptInterface.Utilities const MOIB = MathOptInterface.Bridges -const SVF = MOI.SingleVariable +const VI = MOI.VariableIndex +const CI = MOI.ConstraintIndex const VVF = MOI.VectorOfVariables const SAF{T} = MOI.ScalarAffineFunction{T} const VAF{T} = MOI.VectorAffineFunction{T} const SQF{T} = MOI.ScalarQuadraticFunction{T} const VQF{T} = MOI.VectorQuadraticFunction{T} -const VI = MOI.VariableIndex -const CI = MOI.ConstraintIndex - include("structures.jl") include("utils.jl") include("dual_sets.jl") diff --git a/src/MOI_wrapper.jl b/src/MOI_wrapper.jl index f1a1e757..136cab1b 100644 --- a/src/MOI_wrapper.jl +++ b/src/MOI_wrapper.jl @@ -69,7 +69,7 @@ function MOI.supports( optimizer::DualOptimizer{T}, ::MOI.ObjectiveFunction{F}, ) where {T,F} - # If the objective function is `MOI.SingleVariable` or `MOI.ScalarAffineFunction`, + # If the objective function is `MOI.VariableIndex` or `MOI.ScalarAffineFunction`, # a `MOI.ScalarAffineFunction` is set as objective function for the dual problem. # If it is `MOI.ScalarQuadraticFunction` , a `MOI.ScalarQuadraticFunction` is set as objective function for the dual problem. G = @@ -83,7 +83,7 @@ end function MOI.supports_constraint( optimizer::DualOptimizer{T}, - F::Type{<:Union{MOI.SingleVariable,MOI.ScalarAffineFunction{T}}}, + F::Type{<:Union{MOI.VariableIndex,MOI.ScalarAffineFunction{T}}}, S::Type{<:MOI.AbstractScalarSet}, ) where {T} D = _dual_set_type(S) @@ -210,7 +210,7 @@ function MOI.copy_to(dest::DualOptimizer, src::MOI.ModelLike; kwargs...) setindex!(idx_map, vi, vi) end - for (F, S) in MOI.get(src, MOI.ListOfConstraints()) + for (F, S) in MOI.get(src, MOI.ListOfConstraintTypesPresent()) for con in MOI.get(src, MOI.ListOfConstraintIndices{F,S}()) setindex!(idx_map, con, con) end @@ -267,7 +267,7 @@ end function _get( ::DualOptimizer{T}, ::MOI.AbstractConstraintAttribute, - ::MOI.ConstraintIndex{MOI.SingleVariable,MOI.EqualTo{T}}, + ::MOI.ConstraintIndex{MOI.VariableIndex,MOI.EqualTo{T}}, ::MOI.ConstraintIndex{Nothing,Nothing}, ) where {T} return zero(T) @@ -295,7 +295,7 @@ end function _get_at_index( optimizer::DualOptimizer, attr::MOI.AbstractConstraintAttribute, - ci_primal::MOI.ConstraintIndex{MOI.SingleVariable}, + ci_primal::MOI.ConstraintIndex{MOI.VariableIndex}, ci_dual::MOI.ConstraintIndex, idx, ) diff --git a/src/constrained_variables.jl b/src/constrained_variables.jl index 165c6f91..93c360c7 100644 --- a/src/constrained_variables.jl +++ b/src/constrained_variables.jl @@ -6,15 +6,15 @@ function add_constrained_variables( single_or_vector_variables_types = MOIU.sorted_variable_sets_by_cost(dual_problem.dual_model, primal_model) params = Set(variable_parameters) - for (F, S) in single_or_vector_variables_types - if F === MOI.VectorOfVariables + for S in single_or_vector_variables_types + if S <: MOI.AbstractVectorSet _add_constrained_variables( dual_problem.primal_dual_map, primal_model, S, params, ) - elseif F === MOI.SingleVariable + elseif S <: MOI.AbstractScalarSet _add_constrained_variable( dual_problem.primal_dual_map, primal_model, @@ -59,16 +59,16 @@ function _add_constrained_variable( ) where {S<:MOI.AbstractScalarSet} cis = MOI.get( primal_model, - MOI.ListOfConstraintIndices{MOI.SingleVariable,S}(), + MOI.ListOfConstraintIndices{MOI.VariableIndex,S}(), ) for ci in cis f = MOI.get(primal_model, MOI.ConstraintFunction(), ci) - if !haskey(m.constrained_var_idx, f.variable) && !(f.variable in params) + if !haskey(m.constrained_var_idx, f) && !(f in params) set = MOI.get(primal_model, MOI.ConstraintSet(), ci) if !iszero(MOI.constant(set)) continue end - m.constrained_var_idx[f.variable] = (ci, 1) + m.constrained_var_idx[f] = (ci, 1) # Placeholder to indicate this constraint is part of constrained variables, # it will be replaced later with a dual constraints m.constrained_var_dual[ci] = CI{Nothing,Nothing}(0) diff --git a/src/dual_equality_constraints.jl b/src/dual_equality_constraints.jl index a1a293d5..cdbe1d67 100644 --- a/src/dual_equality_constraints.jl +++ b/src/dual_equality_constraints.jl @@ -4,7 +4,7 @@ function add_dual_equality_constraints( primal_dual_map::PrimalDualMap, dual_names::DualNames, primal_objective::PrimalObjective{T}, - con_types::Vector{Tuple{DataType,DataType}}, + con_types::Vector{Tuple{Type,Type}}, variable_parameters::Vector{VI}, ) where {T} sense_change = @@ -141,7 +141,7 @@ function _add_constrained_variable_constraint( primal_model, zero_map, ci_map, - ci::MOI.ConstraintIndex{MOI.SingleVariable,<:MOI.EqualTo}, + ci::MOI.ConstraintIndex{MOI.VariableIndex,<:MOI.EqualTo}, scalar_affine_terms, scalar_terms, sense_change, @@ -149,7 +149,7 @@ function _add_constrained_variable_constraint( ) where {T} # Nothing to add as the set is `EqualTo`. func_primal = MOI.get(primal_model, MOI.ConstraintFunction(), ci) - primal_vi = func_primal.variable + primal_vi = func_primal return zero_map[ci] = MOI.ScalarAffineFunction( MOIU.operate_terms(-, scalar_affine_terms[primal_vi]), sense_change * get(scalar_terms, primal_vi, zero(T)), @@ -160,14 +160,14 @@ function _add_constrained_variable_constraint( primal_model, zero_map, ci_map, - ci::MOI.ConstraintIndex{MOI.SingleVariable}, + ci::MOI.ConstraintIndex{MOI.VariableIndex}, scalar_affine_terms, scalar_terms, sense_change, ::Type{T}, ) where {T} func_primal = MOI.get(primal_model, MOI.ConstraintFunction(), ci) - primal_vi = func_primal.variable + primal_vi = func_primal func_dual = MOI.ScalarAffineFunction( MOIU.operate_terms(-, scalar_affine_terms[primal_vi]), sense_change * get(scalar_terms, primal_vi, zero(T)), @@ -185,23 +185,23 @@ function add_scalar_affine_terms_from_quad_obj( primal_objective::PrimalObjective{T}, ) where {T} for term in primal_objective.obj.quadratic_terms - if term.variable_index_1 == term.variable_index_2 - dual_vi = primal_var_dual_quad_slack[term.variable_index_1] + if term.variable_1 == term.variable_2 + dual_vi = primal_var_dual_quad_slack[term.variable_1] push_to_scalar_affine_terms!( - scalar_affine_terms[term.variable_index_1], + scalar_affine_terms[term.variable_1], -MOI.coefficient(term), dual_vi, ) else - dual_vi_1 = primal_var_dual_quad_slack[term.variable_index_1] + dual_vi_1 = primal_var_dual_quad_slack[term.variable_1] push_to_scalar_affine_terms!( - scalar_affine_terms[term.variable_index_2], + scalar_affine_terms[term.variable_2], -MOI.coefficient(term), dual_vi_1, ) - dual_vi_2 = primal_var_dual_quad_slack[term.variable_index_2] + dual_vi_2 = primal_var_dual_quad_slack[term.variable_2] push_to_scalar_affine_terms!( - scalar_affine_terms[term.variable_index_1], + scalar_affine_terms[term.variable_1], -MOI.coefficient(term), dual_vi_2, ) @@ -216,7 +216,7 @@ function add_scalar_affine_terms_from_quad_params( ) where {T} for (key, val) in primal_objective.quad_cross_parameters for term in val - dual_vi = primal_parameter[term.variable_index] + dual_vi = primal_parameter[term.variable] push_to_scalar_affine_terms!( scalar_affine_terms[key], -MOI.coefficient(term), @@ -245,10 +245,10 @@ end function get_scalar_terms(primal_objective::PrimalObjective{T}) where {T} scalar_terms = Dict{VI,T}() for term in get_affine_terms(primal_objective) - if haskey(scalar_terms, term.variable_index) - scalar_terms[term.variable_index] += MOI.coefficient(term) + if haskey(scalar_terms, term.variable) + scalar_terms[term.variable] += MOI.coefficient(term) else - scalar_terms[term.variable_index] = MOI.coefficient(term) + scalar_terms[term.variable] = MOI.coefficient(term) end end return scalar_terms @@ -276,7 +276,7 @@ function get_scalar_affine_terms( primal_model::MOI.ModelLike, primal_con_dual_var::Dict{CI,Vector{VI}}, variables::Vector{VI}, - con_types::Vector{Tuple{DataType,DataType}}, + con_types::Vector{Tuple{Type,Type}}, ::Type{T}, ) where {T} scalar_affine_terms = Dict{VI,Vector{MOI.ScalarAffineTerm{T}}}( @@ -315,7 +315,7 @@ function fill_scalar_affine_terms!( for term in moi_function.terms dual_vi = primal_con_dual_var[ci][1] # In this case we only have one vi push_to_scalar_affine_terms!( - scalar_affine_terms[term.variable_index], + scalar_affine_terms[term.variable], MOI.coefficient(term), dual_vi, ) @@ -327,7 +327,7 @@ function fill_scalar_affine_terms!( scalar_affine_terms::Dict{VI,Vector{MOI.ScalarAffineTerm{T}}}, primal_con_dual_var::Dict{CI,Vector{VI}}, primal_model::MOI.ModelLike, - ci::CI{SVF,S}, + ci::CI{VI,S}, ) where {T,S<:Union{MOI.GreaterThan{T},MOI.LessThan{T},MOI.EqualTo{T}}} dual_var = get(primal_con_dual_var, ci, nothing) if dual_var === nothing @@ -336,7 +336,7 @@ function fill_scalar_affine_terms!( moi_function = get_function(primal_model, ci) dual_vi = dual_var[1] # In this case we only have one vi push_to_scalar_affine_terms!( - scalar_affine_terms[moi_function.variable], + scalar_affine_terms[moi_function], one(T), dual_vi, ) @@ -356,7 +356,7 @@ function fill_scalar_affine_terms!( # term.output_index is the row of the VAF, # it corresponds to the dual variable associated with this constraint push_to_scalar_affine_terms!( - scalar_affine_terms[term.scalar_term.variable_index], + scalar_affine_terms[term.scalar_term.variable], set_dot(term.output_index, set, T) * MOI.coefficient(term), dual_vi, ) diff --git a/src/dual_model_variables.jl b/src/dual_model_variables.jl index 56a8938d..dfa5a1f6 100644 --- a/src/dual_model_variables.jl +++ b/src/dual_model_variables.jl @@ -9,7 +9,7 @@ function add_dual_vars_in_dual_cones( ) where {T,F,S} for ci in MOI.get(primal_model, MOI.ListOfConstraintIndices{F,S}()) # Constraints of type {F, S} # If `F` not one of these two, we can skip the `in` check. - if (F === MOI.VectorOfVariables || F === MOI.SingleVariable) && + if (F === MOI.VectorOfVariables || F === MOI.VariableIndex) && haskey(primal_dual_map.constrained_var_dual, ci) continue end @@ -43,7 +43,7 @@ function add_dual_vars_in_dual_cones( primal_model::MOI.ModelLike, primal_dual_map::PrimalDualMap{T}, dual_names::DualNames, - con_types::Vector{Tuple{DataType,DataType}}, + con_types::Vector{Tuple{Type,Type}}, ) where {T} dual_obj_affine_terms = Dict{VI,T}() for (F, S) in con_types @@ -184,7 +184,7 @@ function add_primal_parameter_vars( added = Set{VI}() for vec in values(primal_objective.quad_cross_parameters) for term in vec - ind = term.variable_index + ind = term.variable if ind in added # do nothing else @@ -271,7 +271,7 @@ function add_quadratic_slack_vars( # are required added = Set{VI}() for term in primal_objective.obj.quadratic_terms - for ind in [term.variable_index_1, term.variable_index_2] + for ind in [term.variable_1, term.variable_2] if ind in added #do nothing else diff --git a/src/dualize.jl b/src/dualize.jl index 8e02ff0d..e2ff95b1 100644 --- a/src/dualize.jl +++ b/src/dualize.jl @@ -8,7 +8,7 @@ function dualize( ignore_objective::Bool = false, ) # Creates an empty dual problem - dual_problem = DualProblem{Float64}() + dual_problem = Dualization.DualProblem{Float64}() return dualize( primal_model, dual_problem, @@ -43,18 +43,18 @@ function dualize( ignore_objective::Bool, ) where {T} # Throws an error if objective function cannot be dualized - supported_objective(primal_model) + Dualization.supported_objective(primal_model) # Query all constraint types of the model - con_types = MOI.get(primal_model, MOI.ListOfConstraints()) - supported_constraints(con_types) # Throws an error if constraint cannot be dualized + con_types = MOI.get(primal_model, MOI.ListOfConstraintTypesPresent()) + Dualization.supported_constraints(con_types) # Throws an error if constraint cannot be dualized # Set the dual model objective sense - set_dual_model_sense(dual_problem.dual_model, primal_model) + Dualization.set_dual_model_sense(dual_problem.dual_model, primal_model) # Get Primal Objective Coefficients primal_objective = - get_primal_objective(primal_model, variable_parameters, T) + Dualization.get_primal_objective(primal_model, variable_parameters, T) add_constrained_variables(dual_problem, primal_model, variable_parameters) @@ -204,7 +204,7 @@ function fill_obj_dict_with_variables!(model::JuMP.Model) end function fill_obj_dict_with_constraints!(model::JuMP.Model) - con_types = MOI.get(model, JuMP.MOI.ListOfConstraints()) + con_types = MOI.get(model, JuMP.MOI.ListOfConstraintTypesPresent()) for (F, S) in con_types fill_obj_dict_with_constraints!(model, F, S) end diff --git a/src/objective_coefficients.jl b/src/objective_coefficients.jl index d35e0ae6..116a423e 100644 --- a/src/objective_coefficients.jl +++ b/src/objective_coefficients.jl @@ -29,12 +29,15 @@ function _scalar_quadratic_function( ::Type{T}, ) where {T} return _scalar_quadratic_function( - SQF{T}(func.terms, MOI.ScalarQuadraticTerm{T}[], func.constant), + SQF{T}(MOI.ScalarQuadraticTerm{T}[], func.terms, func.constant), T, ) end -function _scalar_quadratic_function(func::MOI.SingleVariable, T::Type) - return _scalar_quadratic_function(SAF{T}(func), T) +function _scalar_quadratic_function(func::MOI.VariableIndex, T::Type) + return _scalar_quadratic_function( + SAF{T}([MOI.ScalarAffineTerm(1.0, func)], 0), + T, + ) end # Primals @@ -123,7 +126,7 @@ function split_variables( lin_params = MOI.ScalarAffineTerm{T}[] lin_vars = MOI.ScalarAffineTerm{T}[] for term in func.affine_terms - if term.variable_index in variable_parameters + if term.variable in variable_parameters push!(lin_params, term) else push!(lin_vars, term) @@ -135,8 +138,8 @@ function split_variables( quad_vars = MOI.ScalarQuadraticTerm{T}[] quad_cross_params = Dict{VI,Vector{MOI.ScalarAffineTerm{T}}}() for term in func.quadratic_terms - is_param_1 = term.variable_index_1 in variable_parameters - is_param_2 = term.variable_index_2 in variable_parameters + is_param_1 = term.variable_1 in variable_parameters + is_param_2 = term.variable_2 in variable_parameters if is_param_1 && is_param_2 push!(quad_params, term) elseif is_param_1 @@ -149,9 +152,9 @@ function split_variables( end variables_func = - MOI.ScalarQuadraticFunction{T}(lin_vars, quad_vars, func.constant) + MOI.ScalarQuadraticFunction{T}(quad_vars, lin_vars, func.constant) parameters_func = - MOI.ScalarQuadraticFunction{T}(lin_params, quad_params, zero(T)) + MOI.ScalarQuadraticFunction{T}(quad_params, lin_params, zero(T)) return variables_func, quad_cross_params, parameters_func end @@ -161,8 +164,8 @@ function push_affine_term( term::MOI.ScalarQuadraticTerm{T}, var_is_first::Bool, ) where {T} - variable = var_is_first ? term.variable_index_1 : term.variable_index_2 - parameter = var_is_first ? term.variable_index_2 : term.variable_index_1 + variable = var_is_first ? term.variable_1 : term.variable_2 + parameter = var_is_first ? term.variable_2 : term.variable_1 if haskey(dic, variable) push!( dic[variable], @@ -238,8 +241,8 @@ function get_dual_objective( quad_terms, MOI.ScalarQuadraticTerm{T}( -MOI.coefficient(term), - map.primal_var_dual_quad_slack[term.variable_index_1], - map.primal_var_dual_quad_slack[term.variable_index_2], + map.primal_var_dual_quad_slack[term.variable_1], + map.primal_var_dual_quad_slack[term.variable_2], ), ) end @@ -254,7 +257,7 @@ function get_dual_objective( lin_terms, MOI.ScalarAffineTerm{T}( MOI.coefficient(term), - map.primal_parameter[term.variable_index], + map.primal_parameter[term.variable], ), ) end @@ -265,8 +268,8 @@ function get_dual_objective( quad_terms, MOI.ScalarQuadraticTerm{T}( MOI.coefficient(term), - map.primal_parameter[term.variable_index_1], - map.primal_parameter[term.variable_index_2], + map.primal_parameter[term.variable_1], + map.primal_parameter[term.variable_2], ), ) end @@ -281,7 +284,7 @@ function get_dual_objective( MOI.ScalarQuadraticTerm{T}( sense_change * MOI.coefficient(term), param, - term.variable_index, + term.variable, ), ) end @@ -289,8 +292,8 @@ function get_dual_objective( end saf_dual_objective = MOI.ScalarQuadraticFunction{T}( - lin_terms, quad_terms, + lin_terms, MOI.constant(get_raw_obj(primal_objective)), ) return DualObjective{T}(saf_dual_objective) diff --git a/src/supported.jl b/src/supported.jl index ec013670..655bf2d0 100644 --- a/src/supported.jl +++ b/src/supported.jl @@ -1,9 +1,9 @@ """ - supported_constraints(con_types::Vector{Tuple{DataType, DataType}}) + supported_constraints(con_types::Vector{Tuple{Type, Type}}) Returns `true` if `Function-in-Set` is supported for Dualization and throws an error if it is not. """ -function supported_constraints(con_types::Vector{Tuple{DataType,DataType}}) +function supported_constraints(con_types::Vector{Tuple{Type,Type}}) for (F, S) in con_types if !supported_constraint(F, S) error( @@ -20,7 +20,7 @@ end supported_constraint(::Type, ::Type) = false function supported_constraint( - ::Type{<:Union{MOI.SingleVariable,MOI.ScalarAffineFunction}}, + ::Type{<:Union{MOI.VariableIndex,MOI.ScalarAffineFunction}}, S::Type{<:MOI.AbstractScalarSet}, ) return _dual_set_type(S) !== nothing @@ -48,6 +48,6 @@ end # General case supported_obj(::Type) = false # List of supported objective functions -supported_obj(::Type{SVF}) = true +supported_obj(::Type{VI}) = true supported_obj(::Type{<:SAF}) = true supported_obj(::Type{<:SQF}) = true diff --git a/src/utils.jl b/src/utils.jl index 4563e118..7a79b07b 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -13,7 +13,7 @@ end function get_scalar_term( model::MOI.ModelLike, - ci::CI{SVF,S}, + ci::CI{VI,S}, ) where {S<:MOI.AbstractScalarSet} return [-MOI.constant(get_set(model, ci))] end @@ -41,7 +41,7 @@ end function get_scalar_term( model::MOI.ModelLike, i::Int, - ci::CI{SVF,S}, + ci::CI{VI,S}, ) where {S<:MOI.AbstractScalarSet} return -MOI.constant(get_set(model, ci)) end diff --git a/test/Problems/Linear/linear_problems.jl b/test/Problems/Linear/linear_problems.jl index 5aebe769..8c3e2870 100644 --- a/test/Problems/Linear/linear_problems.jl +++ b/test/Problems/Linear/linear_problems.jl @@ -15,7 +15,7 @@ function lp1_test() MOI.LessThan(3.0), ) - MOI.add_constraint(model, MOI.SingleVariable(X[1]), MOI.GreaterThan(3.0)) + MOI.add_constraint(model, X[1], MOI.GreaterThan(3.0)) MOI.set( model, @@ -101,9 +101,9 @@ function lp3_test() MOI.LessThan(3.0), ) - MOI.add_constraint(model, MOI.SingleVariable(X[1]), MOI.GreaterThan(1.0)) + MOI.add_constraint(model, X[1], MOI.GreaterThan(1.0)) - MOI.add_constraint(model, MOI.SingleVariable(X[2]), MOI.GreaterThan(0.0)) + MOI.add_constraint(model, X[2], MOI.GreaterThan(0.0)) MOI.set( model, @@ -127,9 +127,9 @@ function lp4_test() X = MOI.add_variables(model, 2) - MOI.add_constraint(model, MOI.SingleVariable(X[1]), MOI.GreaterThan(1.0)) + MOI.add_constraint(model, X[1], MOI.GreaterThan(1.0)) - MOI.add_constraint(model, MOI.SingleVariable(X[2]), MOI.GreaterThan(0.0)) + MOI.add_constraint(model, X[2], MOI.GreaterThan(0.0)) MOI.set( model, @@ -167,9 +167,9 @@ function lp5_test() MOI.EqualTo(3.0), ) - MOI.add_constraint(model, MOI.SingleVariable(X[1]), MOI.GreaterThan(1.0)) + MOI.add_constraint(model, X[1], MOI.GreaterThan(1.0)) - MOI.add_constraint(model, MOI.SingleVariable(X[2]), MOI.EqualTo(0.0)) + MOI.add_constraint(model, X[2], MOI.EqualTo(0.0)) MOI.set( model, @@ -205,9 +205,9 @@ function lp6_test() MOI.add_constraint(model, c1, MOI.Nonpositives(2)) - MOI.add_constraint(model, MOI.SingleVariable(X[1]), MOI.GreaterThan(1.0)) + MOI.add_constraint(model, X[1], MOI.GreaterThan(1.0)) - MOI.add_constraint(model, MOI.SingleVariable(X[2]), MOI.GreaterThan(0.0)) + MOI.add_constraint(model, X[2], MOI.GreaterThan(0.0)) MOI.set( model, @@ -243,9 +243,9 @@ function lp7_test() MOI.add_constraint(model, c1, MOI.Nonpositives(2)) - MOI.add_constraint(model, MOI.SingleVariable(X[1]), MOI.GreaterThan(1.0)) + MOI.add_constraint(model, X[1], MOI.GreaterThan(1.0)) - MOI.add_constraint(model, MOI.SingleVariable(X[2]), MOI.GreaterThan(0.0)) + MOI.add_constraint(model, X[2], MOI.GreaterThan(0.0)) MOI.set( model, @@ -313,7 +313,7 @@ function lp9_test() vc = MOI.add_constraints( model, - [MOI.SingleVariable(x), MOI.SingleVariable(y)], + [x, y], [MOI.GreaterThan(0.0), MOI.GreaterThan(0.0)], ) @@ -365,15 +365,11 @@ function lp10_test() MOI.EqualTo(3.0), ) - MOI.add_constraint(model, MOI.SingleVariable(X[1]), MOI.GreaterThan(1.0)) + MOI.add_constraint(model, X[1], MOI.GreaterThan(1.0)) - MOI.add_constraint(model, MOI.SingleVariable(X[2]), MOI.EqualTo(0.0)) + MOI.add_constraint(model, X[2], MOI.EqualTo(0.0)) - MOI.set( - model, - MOI.ObjectiveFunction{MOI.SingleVariable}(), - MOI.SingleVariable(X[1]), - ) + MOI.set(model, MOI.ObjectiveFunction{MOI.VariableIndex}(), X[1]) MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE) @@ -391,9 +387,9 @@ function lp11_test() X = MOI.add_variables(model, 2) - MOI.add_constraint(model, MOI.SingleVariable(X[1]), MOI.GreaterThan(1.0)) + MOI.add_constraint(model, X[1], MOI.GreaterThan(1.0)) - MOI.add_constraint(model, MOI.SingleVariable(X[2]), MOI.GreaterThan(0.0)) + MOI.add_constraint(model, X[2], MOI.GreaterThan(0.0)) MOI.set( model, @@ -425,9 +421,9 @@ function lp12_test() MOI.LessThan(20.0), ) - MOI.add_constraint(model, MOI.SingleVariable(X[1]), MOI.LessThan(1.0)) + MOI.add_constraint(model, X[1], MOI.LessThan(1.0)) - MOI.add_constraint(model, MOI.SingleVariable(X[2]), MOI.LessThan(3.0)) + MOI.add_constraint(model, X[2], MOI.LessThan(3.0)) MOI.set( model, diff --git a/test/Problems/Quadratic/quadratic_problems.jl b/test/Problems/Quadratic/quadratic_problems.jl index 83d6c075..34ff6158 100644 --- a/test/Problems/Quadratic/quadratic_problems.jl +++ b/test/Problems/Quadratic/quadratic_problems.jl @@ -24,12 +24,12 @@ function qp1_test() ) obj = MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm{Float64}[], MOI.ScalarQuadraticTerm.( [2.0, 1.0, 2.0, 1.0, 2.0], v[[1, 1, 2, 2, 3]], v[[1, 2, 2, 3, 3]], ), + MOI.ScalarAffineTerm{Float64}[], 0.0, ) MOI.set( @@ -64,12 +64,12 @@ function qp2_test() MOI.EqualTo(1.0), ) - vc1 = MOI.add_constraint(model, MOI.SingleVariable(x), MOI.GreaterThan(0.0)) - vc2 = MOI.add_constraint(model, MOI.SingleVariable(y), MOI.GreaterThan(0.0)) + vc1 = MOI.add_constraint(model, x, MOI.GreaterThan(0.0)) + vc2 = MOI.add_constraint(model, y, MOI.GreaterThan(0.0)) obj = MOI.ScalarQuadraticFunction( - MOI.ScalarAffineTerm.([1.0, 1.0], [x, y]), MOI.ScalarQuadraticTerm.([4.0, 2.0, 1.0], [x, y, x], [x, y, y]), + MOI.ScalarAffineTerm.([1.0, 1.0], [x, y]), 1.0, ) diff --git a/test/Problems/RSOC/rsoc_problems.jl b/test/Problems/RSOC/rsoc_problems.jl index 354b72bb..f07b87a3 100644 --- a/test/Problems/RSOC/rsoc_problems.jl +++ b/test/Problems/RSOC/rsoc_problems.jl @@ -12,10 +12,10 @@ function rsoc1_test() a = MOI.add_variable(model) b = MOI.add_variable(model) - vc1 = MOI.add_constraint(model, MOI.SingleVariable(a), MOI.EqualTo(0.5)) - # We test this after the creation of every `SingleVariable` constraint + vc1 = MOI.add_constraint(model, a, MOI.EqualTo(0.5)) + # We test this after the creation of every `VariableIndex` constraint # to ensure a good coverage of corner cases. - vc2 = MOI.add_constraint(model, MOI.SingleVariable(b), MOI.EqualTo(1.0)) + vc2 = MOI.add_constraint(model, b, MOI.EqualTo(1.0)) rsoc = MOI.add_constraint( model, MOI.VectorOfVariables([a; b; x]), @@ -80,13 +80,9 @@ function rsoc3_test() x = MOI.add_variables(model, 3) - vc1 = MOI.add_constraint(model, MOI.SingleVariable(x[1]), MOI.LessThan(1.0)) - vc2 = MOI.add_constraint(model, MOI.SingleVariable(x[2]), MOI.EqualTo(0.5)) - vc3 = MOI.add_constraint( - model, - MOI.SingleVariable(x[3]), - MOI.GreaterThan(2.0), - ) + vc1 = MOI.add_constraint(model, x[1], MOI.LessThan(1.0)) + vc2 = MOI.add_constraint(model, x[2], MOI.EqualTo(0.5)) + vc3 = MOI.add_constraint(model, x[3], MOI.GreaterThan(2.0)) rsoc = MOI.add_constraint( model, @@ -123,12 +119,12 @@ function rsoc4_test() v = MOI.add_variable(model) t = MOI.add_variables(model, 2) - ct1 = MOI.add_constraint(model, MOI.SingleVariable(t[1]), MOI.EqualTo(1.0)) - ct2 = MOI.add_constraint(model, MOI.SingleVariable(t[2]), MOI.EqualTo(1.0)) + ct1 = MOI.add_constraint(model, t[1], MOI.EqualTo(1.0)) + ct2 = MOI.add_constraint(model, t[2], MOI.EqualTo(1.0)) cx = MOI.add_constraint(model, MOI.VectorOfVariables(x), MOI.Nonnegatives(2)) - cu1 = MOI.add_constraint(model, MOI.SingleVariable(u), MOI.GreaterThan(0.0)) - cu2 = MOI.add_constraint(model, MOI.SingleVariable(u), MOI.LessThan(3.0)) + cu1 = MOI.add_constraint(model, u, MOI.GreaterThan(0.0)) + cu2 = MOI.add_constraint(model, u, MOI.LessThan(3.0)) c1 = MOI.add_constraint( model, @@ -182,15 +178,15 @@ function rsoc5_test() v = MOI.add_variable(model) t = MOI.add_variables(model, 2) - ct1 = MOI.add_constraint(model, MOI.SingleVariable(t[1]), MOI.EqualTo(1.0)) - ct2 = MOI.add_constraint(model, MOI.SingleVariable(t[2]), MOI.EqualTo(1.0)) + ct1 = MOI.add_constraint(model, t[1], MOI.EqualTo(1.0)) + ct2 = MOI.add_constraint(model, t[2], MOI.EqualTo(1.0)) cx = MOI.add_constraint( model, MOI.VectorOfVariables(x), MOI.Nonnegatives(10), ) - cu1 = MOI.add_constraint(model, MOI.SingleVariable(u), MOI.GreaterThan(0.0)) - cu2 = MOI.add_constraint(model, MOI.SingleVariable(u), MOI.LessThan(3.0)) + cu1 = MOI.add_constraint(model, u, MOI.GreaterThan(0.0)) + cu2 = MOI.add_constraint(model, u, MOI.LessThan(3.0)) c1 = MOI.add_constraint( model, diff --git a/test/Problems/SOC/soc_problems.jl b/test/Problems/SOC/soc_problems.jl index d704fdbd..dc4e0c01 100644 --- a/test/Problems/SOC/soc_problems.jl +++ b/test/Problems/SOC/soc_problems.jl @@ -82,7 +82,6 @@ function soc3_test() s.t. y ≥ 1/√2 x² + y² ≤ 1 - in conic form: min x s.t. @@ -138,7 +137,6 @@ function soc4_test() s.t. y ≥ 1/√2 x² + y² ≤ 1 - in conic form: min x s.t. @@ -196,7 +194,6 @@ function soc5_test() y ≥ 2 x ≤ 1 |y| ≤ x - in conic form: min x s.t. @@ -251,7 +248,6 @@ function soc6_test() x[2] - x[4] == 0 x[3] - x[5] == 0 x[1] >= ||(x[4],x[5])|| - in conic form: min c^Tx s.t. diff --git a/test/Solvers/ecos_test.jl b/test/Solvers/ecos_test.jl index 2db7a730..ca785738 100644 --- a/test/Solvers/ecos_test.jl +++ b/test/Solvers/ecos_test.jl @@ -5,18 +5,17 @@ const ECOS_DUAL_FACTORY = dual_optimizer(ECOS_PRIMAL_FACTORY) const ECOS_PRIMAL_OPT = MOI.instantiate(ECOS_PRIMAL_FACTORY) const ECOS_DUAL_OPT = MOI.instantiate(ECOS_DUAL_FACTORY) -# push!(dual_linear_optimizer, DualOptimizer(ECOS.Optimizer(verbose = 0))) +# Warm up to pass tests on x86 +dual_problem = dualize(soc1_test()) +test_strong_duality( + soc1_test(), + dual_problem.dual_model, + ECOS_PRIMAL_FACTORY, + 1e-3, + 1e-3, +) @testset "ECOS conic Problems" begin - @testset "ECOS Conic linear problems" begin - list_of_soc_problems = [ - conic_linear1_test, - conic_linear2_test, - conic_linear3_test, - conic_linear4_test, - ] - test_strong_duality(list_of_soc_problems, ECOS_PRIMAL_FACTORY) - end @testset "ECOS SOC problems" begin list_of_soc_problems = [soc1_test, soc2_test, soc3_test, soc4_test, soc5_test, soc6_test] diff --git a/test/Solvers/scs_test.jl b/test/Solvers/scs_test.jl index 0a4ca1ee..d953f429 100644 --- a/test/Solvers/scs_test.jl +++ b/test/Solvers/scs_test.jl @@ -14,13 +14,3 @@ push!(primal_power_cone_optimizer, SCS_PRIMAL_OPT) list_of_exp_problems = [exp1_test, exp2_test] test_strong_duality(list_of_exp_problems, SCS_PRIMAL_FACTORY) end - -@testset "SCS Power Cone Problems" begin - list_of_pow_problems = [pow1_test, pow2_test] - test_strong_duality( - list_of_pow_problems, - SCS_PRIMAL_FACTORY; - atol = 1e-3, - rtol = 1e-3, - ) -end diff --git a/test/Tests/test_MOI_wrapper.jl b/test/Tests/test_MOI_wrapper.jl index 8ccb1d19..75cd4eba 100644 --- a/test/Tests/test_MOI_wrapper.jl +++ b/test/Tests/test_MOI_wrapper.jl @@ -1,6 +1,6 @@ @testset "MOI_wrapper.jl" begin for opt in dual_linear_optimizer - linear_config = MOIT.TestConfig(atol = 1e-6, rtol = 1e-6) + linear_config = MOIT.Config(atol = 1e-6, rtol = 1e-6) linear_cache = MOIU.UniversalFallback(Dualization.DualizableModel{Float64}()) MOI.empty!(opt) @@ -8,87 +8,57 @@ linear_bridged = MOIB.full_bridge_optimizer(linear_cached, Float64) @testset "linear test" begin - MOIT.contlineartest( + MOIT.runtests( linear_bridged, linear_config, - [ - "linear8b", # Asks for infeasibility ray - "linear8c", # Asks for infeasibility ray - "linear12", # Asks for infeasibility ray - "linear13", # Feasibility problem - "linear15", # Feasibility when written in the canonical form + include = ["test_linear_"], + exclude = [ + "test_linear_FEASIBILITY_SENSE", + "test_linear_INFEASIBLE_2", + "test_linear_Interval_inactive", + "test_linear_add_constraints", + "test_linear_inactive_bounds", + "test_linear_integration_2", + "test_linear_integration_Interval", + "test_linear_integration_delete_variables", ], ) end end for opt in dual_conic_optimizer - conic_config = MOIT.TestConfig(atol = 1e-4, rtol = 1e-4) + opt = dual_conic_optimizer[1] + conic_config = MOIT.Config(atol = 1e-4, rtol = 1e-4) conic_cache = MOIU.UniversalFallback(Dualization.DualizableModel{Float64}()) conic_cached = MOIU.CachingOptimizer(conic_cache, opt) conic_bridged = MOIB.full_bridge_optimizer(conic_cached, Float64) @testset "conic linear, soc, rsoc and sdp test" begin - MOIT.contconictest( + MOIT.runtests( conic_bridged, conic_config, - [ - "lin3", # Feasibility problem - "lin4", # Feasibility problem - "geomean3f", - "geomean3v", # CSDP does not converge after https://github.com/jump-dev/Dualization.jl/pull/86 - "normone2", # Feasibility problem - "norminf2", # Feasibility problem - "soc3", # Feasibility problem - "rotatedsoc2", # Feasibility problem - "rotatedsoc4", # Termination status is `ALMOST_OPTIMAL` - "exp", # Tested in exp and power cone test - "dualexp", # Tested in exp and power cone test - "pow", # Tested in exp and power cone test - "dualpow", # Tested in exp and power cone test - "rootdet", # Dual not defined in MOI - "logdet", # Dual not defined in MOI - "relentr", # Dual not defined in MOI - "psdt3", # atol should be 1e-2 - "psds3", # atol should be 1e-2 + include = ["test_conic_"], + exclude = [ + "test_conic_NormInfinityCone_INFEASIBLE", + "test_conic_NormOneCone_INFEASIBLE", + "test_conic_PositiveSemidefiniteConeSquare_3", + "test_conic_PositiveSemidefiniteConeTriangle_3", + "test_conic_SecondOrderCone_INFEASIBLE", + "test_conic_SecondOrderCone_negative_post_bound_2", + "test_conic_SecondOrderCone_negative_post_bound_3", + "test_conic_SecondOrderCone_no_initial_bound", + "test_conic_RotatedSecondOrderCone_out_of_order", + "test_conic_linear_INFEASIBLE", ], ) end @testset "quadratically constrained" begin - MOIT.contquadratictest( + MOIT.runtests( conic_bridged, conic_config, - ["qp", "ncqcp", "socp"], - ) - end - end - - for opt in dual_power_cone_optimizer - power_cone_config = MOIT.TestConfig(atol = 1e-3, rtol = 1e-3) - power_cone_cache = - MOIU.UniversalFallback(Dualization.DualizableModel{Float64}()) - power_cone_cached = MOIU.CachingOptimizer(power_cone_cache, opt) - power_cone_bridged = - MOIB.full_bridge_optimizer(power_cone_cached, Float64) - - @testset "power cone test" begin - MOIT.contconictest( - power_cone_bridged, - power_cone_config, - [ - "lin", # Tested in coninc linear, soc, rsoc and sdp test - "normone", # Tested in coninc linear, soc, rsoc and sdp test - "norminf", # Tested in coninc linear, soc, rsoc and sdp test - "soc", # Tested in coninc linear, soc, rsoc and sdp test - "rsoc", # Tested in coninc linear, soc, rsoc and sdp test - "geomean", # Tested in coninc linear, soc, rsoc and sdp test - "sdp", # Tested in coninc linear, soc, rsoc and sdp test - "rootdet", # Dual not defined in MOI - "logdet", # Dual not defined in MOI - "relentr", # Dual not defined in MOI - ], + include = ["test_quadratic_"], ) end end @@ -113,7 +83,7 @@ @testset "support" begin for opt in dual_linear_optimizer - @test !MOI.supports_constraint(opt, SVF, MOI.Integer) + @test !MOI.supports_constraint(opt, MOI.VariableIndex, MOI.Integer) @test MOI.supports(opt, MOI.ObjectiveSense()) end for opt in dual_conic_optimizer diff --git a/test/Tests/test_dual_names.jl b/test/Tests/test_dual_names.jl index 4a7520dc..e3ea8ed9 100644 --- a/test/Tests/test_dual_names.jl +++ b/test/Tests/test_dual_names.jl @@ -10,25 +10,16 @@ CI{SAF{Float64},MOI.LessThan{Float64}}(1), "lessthan", ) - MOI.set( - model, - MOI.ConstraintName(), - CI{SVF,MOI.GreaterThan{Float64}}(1), - "greaterthan1", - ) @test model.con_to_name[CI{SAF{Float64},MOI.LessThan{Float64}}(1)] == "lessthan" - @test model.con_to_name[CI{SVF,MOI.GreaterThan{Float64}}(1)] == - "greaterthan1" # Dualize without names dual_problem = dualize(model) dual_model = dual_problem.dual_model primal_dual_map = dual_problem.primal_dual_map # Query variable names - vi_1 = primal_dual_map.primal_con_dual_var[CI{SVF,MOI.GreaterThan{Float64}}( - 1, - )][1] + vi_1 = + primal_dual_map.primal_con_dual_var[CI{VI,MOI.GreaterThan{Float64}}(1)][1] vi_2 = primal_dual_map.primal_con_dual_var[CI{ SAF{Float64}, MOI.LessThan{Float64}, @@ -50,17 +41,14 @@ dual_model = dual_problem.dual_model primal_dual_map = dual_problem.primal_dual_map # Query variable names - vi_1 = primal_dual_map.primal_con_dual_var[CI{SVF,MOI.GreaterThan{Float64}}( - 1, - )][1] + vi_1 = + primal_dual_map.primal_con_dual_var[CI{VI,MOI.GreaterThan{Float64}}(1)][1] vi_2 = primal_dual_map.primal_con_dual_var[CI{ SAF{Float64}, MOI.LessThan{Float64}, }( 1, )][1] - @test MOI.get(dual_model, MOI.VariableName(), vi_1) == - "dualvar_greaterthan1_1" @test MOI.get(dual_model, MOI.VariableName(), vi_2) == "dualvar_lessthan_1" # Query constraint names ci_1 = primal_dual_map.primal_var_dual_con[VI(1)] diff --git a/test/Tests/test_dualize_conic_linear.jl b/test/Tests/test_dualize_conic_linear.jl index ce02b86d..bde39d33 100644 --- a/test/Tests/test_dualize_conic_linear.jl +++ b/test/Tests/test_dualize_conic_linear.jl @@ -7,7 +7,6 @@ x + y + z == 3 :w_1 y + z == 2 :w_2 x>=0 y>=0 z>=0 - dual max 3w_1 + 2w_2 s.t. @@ -19,7 +18,7 @@ dual_model, primal_dual_map = dual_model_and_map(primal_model) @test MOI.get(dual_model, MOI.NumberOfVariables()) == 2 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test list_of_cons == [(VAF{Float64}, MOI.Nonnegatives)] @test MOI.get( dual_model, @@ -79,7 +78,6 @@ y <= 0 z >= 0 s zero - dual max -4w_4 - 3w_5 + 12w_6 s.t @@ -91,7 +89,7 @@ dual_model, primal_dual_map = dual_model_and_map(primal_model) @test MOI.get(dual_model, MOI.NumberOfVariables()) == 3 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set( [ (VAF{Float64}, MOI.Nonpositives) diff --git a/test/Tests/test_dualize_exponential.jl b/test/Tests/test_dualize_exponential.jl index 24e97372..c6974536 100644 --- a/test/Tests/test_dualize_exponential.jl +++ b/test/Tests/test_dualize_exponential.jl @@ -7,7 +7,6 @@ y e^(x/y) <= z, y > 0 (i.e (x, y, z) are in the exponential primal cone) :w3, w_4, w_5 x == 1 :w_1 y == 2 :w_2 - dual max 2w_2 + w_1 s.t. @@ -20,7 +19,7 @@ dual_model, primal_dual_map = dual_model_and_map(primal_model) @test MOI.get(dual_model, MOI.NumberOfVariables()) == 2 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set([(VAF{Float64}, MOI.DualExponentialCone)],) @test MOI.get( @@ -43,7 +42,6 @@ y e^(x/y) <= z, y > 0 (i.e (x, y, z) are in the exponential primal cone) :w3, w_4, w_5 x == 1 :w_1 y == 2 :w_2 - dual max 2w_2 + w_1 s.t. @@ -56,7 +54,7 @@ dual_model, primal_dual_map = dual_model_and_map(primal_model) @test MOI.get(dual_model, MOI.NumberOfVariables()) == 5 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set( [ (SAF{Float64}, MOI.EqualTo{Float64}) diff --git a/test/Tests/test_dualize_linear.jl b/test/Tests/test_dualize_linear.jl index 958c1164..2c9d02b3 100644 --- a/test/Tests/test_dualize_linear.jl +++ b/test/Tests/test_dualize_linear.jl @@ -6,7 +6,6 @@ s.t. x_1 >= 3 :y_2 x_1 + 2x_2 <= 3 :y_3 - dual max 3y_2 + 3y_3 - 1 s.t. @@ -19,21 +18,21 @@ dual_model, primal_dual_map = dual_model_and_map(primal_model) @test MOI.get(dual_model, MOI.NumberOfVariables()) == 2 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set( [ - (SVF, MOI.GreaterThan{Float64}) - (SVF, MOI.LessThan{Float64}) + (VI, MOI.GreaterThan{Float64}) + (VI, MOI.LessThan{Float64}) (SAF{Float64}, MOI.EqualTo{Float64}) ], ) @test MOI.get( dual_model, - MOI.NumberOfConstraints{SVF,MOI.GreaterThan{Float64}}(), + MOI.NumberOfConstraints{VI,MOI.GreaterThan{Float64}}(), ) == 1 @test MOI.get( dual_model, - MOI.NumberOfConstraints{SVF,MOI.LessThan{Float64}}(), + MOI.NumberOfConstraints{VI,MOI.LessThan{Float64}}(), ) == 1 @test MOI.get( dual_model, @@ -55,7 +54,6 @@ x1 + 2x2 - 3 <= 0 :y_4 x1 >= 1 :y_1 x2 >= 0 :y_2 - dual max 3y_4 + 3y_3 + y_1 - 1 s.a. @@ -70,10 +68,10 @@ dual_model, primal_dual_map = dual_model_and_map(primal_model) @test MOI.get(dual_model, MOI.NumberOfVariables()) == 3 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set( [ - (SVF, MOI.GreaterThan{Float64}) + (VI, MOI.GreaterThan{Float64}) (SAF{Float64}, MOI.EqualTo{Float64}) (SAF{Float64}, MOI.GreaterThan{Float64}) (VVF, MOI.Nonpositives) @@ -81,7 +79,7 @@ ) @test MOI.get( dual_model, - MOI.NumberOfConstraints{SVF,MOI.GreaterThan{Float64}}(), + MOI.NumberOfConstraints{VI,MOI.GreaterThan{Float64}}(), ) == 1 @test MOI.get( dual_model, @@ -108,7 +106,6 @@ x1 + 2x2 == 3 :y_4 x1 >= 1 :y_1 x2 == 0 :y_2 - dual max y_1 + 3y_3 + 3y_4 s.t @@ -120,16 +117,16 @@ dual_model, primal_dual_map = dual_model_and_map(primal_model) @test MOI.get(dual_model, MOI.NumberOfVariables()) == 3 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set( [ - (SVF, MOI.GreaterThan{Float64}) + (VI, MOI.GreaterThan{Float64}) (SAF{Float64}, MOI.EqualTo{Float64}) ], ) @test MOI.get( dual_model, - MOI.NumberOfConstraints{SVF,MOI.GreaterThan{Float64}}(), + MOI.NumberOfConstraints{VI,MOI.GreaterThan{Float64}}(), ) == 1 @test MOI.get( dual_model, @@ -150,7 +147,6 @@ x_1 + 2x_2 + x_3 <= 20 :y_3 x_1 <= 1 :y_1 x_2 <= 3 :y_2 - dual max 3y_2 + y_1 + 20y_3 + 5 s.t. @@ -165,16 +161,16 @@ dual_model, primal_dual_map = dual_model_and_map(primal_model) @test MOI.get(dual_model, MOI.NumberOfVariables()) == 3 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set( [ - (SVF, MOI.LessThan{Float64}) + (VI, MOI.LessThan{Float64}) (SAF{Float64}, MOI.EqualTo{Float64}) ], ) @test MOI.get( dual_model, - MOI.NumberOfConstraints{SVF,MOI.LessThan{Float64}}(), + MOI.NumberOfConstraints{VI,MOI.LessThan{Float64}}(), ) == 3 @test MOI.get( dual_model, @@ -196,7 +192,6 @@ x1 + 2x2 - 3 <= 0 :y_4 x1 >= 0 :y_1 x2 >= 0 :y_2 - dual max 3y_4 + 3y_3 - 1 s.a. @@ -211,7 +206,7 @@ dual_model, primal_dual_map = dual_model_and_map(primal_model) @test MOI.get(dual_model, MOI.NumberOfVariables()) == 2 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set([ (VAF{Float64}, MOI.Nonnegatives) (VVF, MOI.Nonpositives) diff --git a/test/Tests/test_dualize_power.jl b/test/Tests/test_dualize_power.jl index 9de57859..243bd9e8 100644 --- a/test/Tests/test_dualize_power.jl +++ b/test/Tests/test_dualize_power.jl @@ -7,7 +7,6 @@ x^0.9 * y^(0.1) >= |z| (i.e (x, y, z) are in the 3d power cone with a=0.9) :w_3, w_4, w_5 x == 2 :w_2 y == 1 :w_2 - dual min -w_2 - 2w_1 s.t. @@ -20,7 +19,7 @@ dual_model, primal_dual_map = dual_model_and_map(primal_model) @test MOI.get(dual_model, MOI.NumberOfVariables()) == 2 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set([(VAF{Float64}, MOI.DualPowerCone{Float64})],) @test MOI.get( @@ -43,7 +42,6 @@ x^0.9 * y^(0.1) >= |z| (i.e (x, y, z) are in the 3d power cone with a=0.9) :w_3, w_4, w_5 x == 2 :w_2 y == 1 :w_2 - dual min -w_2 - 2w_1 s.t. @@ -56,7 +54,7 @@ dual_model, primal_dual_map = dual_model_and_map(primal_model) @test MOI.get(dual_model, MOI.NumberOfVariables()) == 5 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set( [ (SAF{Float64}, MOI.EqualTo{Float64}) diff --git a/test/Tests/test_dualize_quadratic.jl b/test/Tests/test_dualize_quadratic.jl index 1d72d5d5..b9b08753 100644 --- a/test/Tests/test_dualize_quadratic.jl +++ b/test/Tests/test_dualize_quadratic.jl @@ -6,7 +6,6 @@ x + 2y + 3z >= 4 (a) x + y >= 1 (b) x,y \in R - dual max 4a + b - w1^2 - w1 w2 - w2^2 - w2 w3 - w3^2 s.t. @@ -20,16 +19,16 @@ dual_model, primal_dual_map = dual_model_and_map(primal_model) @test MOI.get(dual_model, MOI.NumberOfVariables()) == 2 + 3 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set( [ - (SVF, MOI.GreaterThan{Float64}) + (VI, MOI.GreaterThan{Float64}) (SAF{Float64}, MOI.EqualTo{Float64}) ], ) @test MOI.get( dual_model, - MOI.NumberOfConstraints{SVF,MOI.GreaterThan{Float64}}(), + MOI.NumberOfConstraints{VI,MOI.GreaterThan{Float64}}(), ) == 2 @test MOI.get( dual_model, @@ -112,7 +111,6 @@ x + y = 1 (a) x >= 0 (b) y >= 0 (c) - dual max a + 1 - 2 w1^2 - w2^2 - w1 w2 s.t. @@ -126,7 +124,7 @@ dual_model, primal_dual_map = dual_model_and_map(primal_model) @test MOI.get(dual_model, MOI.NumberOfVariables()) == 3 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set([(SAF{Float64}, MOI.GreaterThan{Float64})],) obj_type = MOI.get(dual_model, MOI.ObjectiveFunctionType()) diff --git a/test/Tests/test_dualize_rsoc.jl b/test/Tests/test_dualize_rsoc.jl index 89004aec..c672e455 100644 --- a/test/Tests/test_dualize_rsoc.jl +++ b/test/Tests/test_dualize_rsoc.jl @@ -7,7 +7,6 @@ a == 1/2 :w_2 b == 1 :w_1 2a*b >= x^2+y^2 :w_3, w_4, w_5, w_6 - dual max w_2 + (1/2)w_1 s.t. @@ -21,7 +20,7 @@ dual_model, primal_dual_map = dual_model_and_map(primal_model) @test MOI.get(dual_model, MOI.NumberOfVariables()) == 2 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set([(VAF{Float64}, MOI.RotatedSecondOrderCone)],) @test MOI.get( @@ -44,7 +43,6 @@ a == 1/2 b == 1 2a*b >= x^2+y^2 - dual max w_2 + (1/2)w_1 s.t. @@ -58,7 +56,7 @@ dual_model, primal_dual_map = dual_model_and_map(primal_model) @test MOI.get(dual_model, MOI.NumberOfVariables()) == 4 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set( [ (SAF{Float64}, MOI.EqualTo{Float64}) diff --git a/test/Tests/test_dualize_sdp.jl b/test/Tests/test_dualize_sdp.jl index 70cab05e..81cdd3c5 100644 --- a/test/Tests/test_dualize_sdp.jl +++ b/test/Tests/test_dualize_sdp.jl @@ -6,7 +6,6 @@ s.t. X[2,1] = 1 : y_1 X in PSD : y_2, y_3, y_4 - dual max y_1 s.t. @@ -20,7 +19,7 @@ dual_model, primal_dual_map = dual_model_and_map(primal_model) @test MOI.get(dual_model, MOI.NumberOfVariables()) == 1 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set([(VAF{Float64}, MOI.PositiveSemidefiniteConeTriangle)],) @test MOI.get( @@ -45,7 +44,6 @@ s.t. X[2,1] = 1 : y_1 X in PSD : y_2, y_3, y_4 - dual max y_1 s.t. @@ -59,7 +57,7 @@ dual_model, primal_dual_map = dual_model_and_map(primal_model) @test MOI.get(dual_model, MOI.NumberOfVariables()) == 4 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set( [ (SAF{Float64}, MOI.EqualTo{Float64}) diff --git a/test/Tests/test_dualize_soc.jl b/test/Tests/test_dualize_soc.jl index 7b15cee8..ce85fdab 100644 --- a/test/Tests/test_dualize_soc.jl +++ b/test/Tests/test_dualize_soc.jl @@ -6,7 +6,6 @@ s.t. x == 1 :w_4 x >= ||(y,z)|| :w_1, w_2, w_3 - dual min -w_4 s.t. @@ -19,7 +18,7 @@ dual_model, primal_dual_map = dual_model_and_map(primal_model) @test MOI.get(dual_model, MOI.NumberOfVariables()) == 1 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set([(VAF{Float64}, MOI.SecondOrderCone)],) @test MOI.get( dual_model, @@ -39,7 +38,6 @@ s.t. x == 1 :w_4 x >= ||(y,z)|| :w_1, w_2, w_3 - dual min -w_4 s.t. @@ -52,7 +50,7 @@ dual_model, primal_dual_map = dual_model_and_map(primal_model) @test MOI.get(dual_model, MOI.NumberOfVariables()) == 4 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set( [ (SAF{Float64}, MOI.EqualTo{Float64}) diff --git a/test/Tests/test_objective_coefficients.jl b/test/Tests/test_objective_coefficients.jl index 83174275..4c61ce28 100644 --- a/test/Tests/test_objective_coefficients.jl +++ b/test/Tests/test_objective_coefficients.jl @@ -26,7 +26,7 @@ model = lp10_test() - @test model.objective == MOI.SingleVariable(MOI.VariableIndex(1)) + @test model.objective.single_variable == MOI.VariableIndex(1) primal_objective = Dualization.get_primal_objective(model) @test Dualization.get_affine_terms( Dualization.get_primal_objective(model), diff --git a/test/Tests/test_partial_dual_linear.jl b/test/Tests/test_partial_dual_linear.jl index f4edb7a8..abc9d35e 100644 --- a/test/Tests/test_partial_dual_linear.jl +++ b/test/Tests/test_partial_dual_linear.jl @@ -6,9 +6,7 @@ s.t. x_1 >= 3 :y_2 x_1 + 2x_2 <= 3 :y_3 - ignore x_2 during dualization - dual obj ignored s.t. @@ -26,21 +24,21 @@ primal_dual_map = dual.primal_dual_map @test MOI.get(dual_model, MOI.NumberOfVariables()) == 2 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set( [ - (SVF, MOI.GreaterThan{Float64}) - (SVF, MOI.LessThan{Float64}) + (VI, MOI.GreaterThan{Float64}) + (VI, MOI.LessThan{Float64}) (SAF{Float64}, MOI.EqualTo{Float64}) ], ) @test MOI.get( dual_model, - MOI.NumberOfConstraints{SVF,MOI.GreaterThan{Float64}}(), + MOI.NumberOfConstraints{VI,MOI.GreaterThan{Float64}}(), ) == 1 @test MOI.get( dual_model, - MOI.NumberOfConstraints{SVF,MOI.LessThan{Float64}}(), + MOI.NumberOfConstraints{VI,MOI.LessThan{Float64}}(), ) == 1 @test MOI.get( dual_model, @@ -80,9 +78,7 @@ x1 + 2x2 - 3 <= 0 :y_3 x1 >= 1 :y_1 x2 >= 0 - ignore x_1 during dualization - dual obj ignored s.t. @@ -101,17 +97,17 @@ primal_dual_map = dual.primal_dual_map @test MOI.get(dual_model, MOI.NumberOfVariables()) == 3 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set( [ - (SVF, MOI.GreaterThan{Float64}) + (VI, MOI.GreaterThan{Float64}) (SAF{Float64}, MOI.GreaterThan{Float64}) (VVF, MOI.Nonpositives) ], ) @test MOI.get( dual_model, - MOI.NumberOfConstraints{SVF,MOI.GreaterThan{Float64}}(), + MOI.NumberOfConstraints{VI,MOI.GreaterThan{Float64}}(), ) == 1 @test MOI.get( dual_model, @@ -141,7 +137,7 @@ @test primal_con_dual_var[vaf_npos] == [VI(1); VI(2)] vgt, = MOI.get( primal_model, - MOI.ListOfConstraintIndices{SVF,MOI.GreaterThan{Float64}}(), + MOI.ListOfConstraintIndices{VI,MOI.GreaterThan{Float64}}(), ) @test primal_con_dual_var[vgt] == [VI(3)] @@ -157,9 +153,7 @@ x_1 + 2x_2 + x_3 <= 20 :y_3 x_1 <= 1 :y_1 x_2 <= 3 :y_2 - ignoring x_1 and x_3 - dual obj ignored s.t. @@ -180,16 +174,16 @@ primal_dual_map = dual.primal_dual_map @test MOI.get(dual_model, MOI.NumberOfVariables()) == 3 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set( [ - (SVF, MOI.LessThan{Float64}) + (VI, MOI.LessThan{Float64}) (SAF{Float64}, MOI.EqualTo{Float64}) ], ) @test MOI.get( dual_model, - MOI.NumberOfConstraints{SVF,MOI.LessThan{Float64}}(), + MOI.NumberOfConstraints{VI,MOI.LessThan{Float64}}(), ) == 3 @test MOI.get( dual_model, @@ -211,8 +205,8 @@ @test MOI.constant(eq_con2_set) == 0.0 primal_con_dual_var = primal_dual_map.primal_con_dual_var - @test primal_con_dual_var[CI{SVF,MOI.LessThan{Float64}}(2)] == [VI(3)] - @test primal_con_dual_var[CI{SVF,MOI.LessThan{Float64}}(1)] == [VI(2)] + @test primal_con_dual_var[CI{VI,MOI.LessThan{Float64}}(2)] == [VI(3)] + @test primal_con_dual_var[CI{VI,MOI.LessThan{Float64}}(1)] == [VI(2)] @test primal_con_dual_var[CI{SAF{Float64},MOI.LessThan{Float64}}(1)] == [VI(1)] diff --git a/test/Tests/test_partial_dual_quadratic.jl b/test/Tests/test_partial_dual_quadratic.jl index 4be546c7..a8e3019e 100644 --- a/test/Tests/test_partial_dual_quadratic.jl +++ b/test/Tests/test_partial_dual_quadratic.jl @@ -6,7 +6,6 @@ x + 2y + 3z >= 4 (a) x + y >= 1 (b) x,y,z \in R - dual max 4a - 3z a + b - w1^2 - w1 w2 - w2^2 + z^2 s.t. @@ -22,16 +21,16 @@ primal_dual_map = dual.primal_dual_map @test MOI.get(dual_model, MOI.NumberOfVariables()) == 2 + 2 + 1 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set( [ - (SVF, MOI.GreaterThan{Float64}) + (VI, MOI.GreaterThan{Float64}) (SAF{Float64}, MOI.EqualTo{Float64}) ], ) @test MOI.get( dual_model, - MOI.NumberOfConstraints{SVF,MOI.GreaterThan{Float64}}(), + MOI.NumberOfConstraints{VI,MOI.GreaterThan{Float64}}(), ) == 2 @test MOI.get( dual_model, @@ -101,7 +100,6 @@ x + y = 1 (a) x >= 0 (b) y >= 0 (c) - dual max 1 + y + a - y a - y c - 2 w1^2 + y^2 s.t. @@ -117,16 +115,16 @@ primal_dual_map = dual.primal_dual_map @test MOI.get(dual_model, MOI.NumberOfVariables()) == 4 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set( [ - (SVF, MOI.GreaterThan{Float64}) + (VI, MOI.GreaterThan{Float64}) (SAF{Float64}, MOI.GreaterThan{Float64}) ], ) @test MOI.get( dual_model, - MOI.NumberOfConstraints{SVF,MOI.GreaterThan{Float64}}(), + MOI.NumberOfConstraints{VI,MOI.GreaterThan{Float64}}(), ) == 1 @test MOI.get( dual_model, @@ -156,9 +154,8 @@ primal_con_dual_var = primal_dual_map.primal_con_dual_var @test primal_con_dual_var[CI{SAF{Float64},MOI.EqualTo{Float64}}(1)] == [VI(1)] - @test !haskey(primal_con_dual_var, CI{SVF,MOI.GreaterThan{Float64}}(1)) - @test primal_con_dual_var[CI{SVF,MOI.GreaterThan{Float64}}(2)] == - [VI(2)] + @test !haskey(primal_con_dual_var, CI{VI,MOI.GreaterThan{Float64}}(1)) + @test primal_con_dual_var[CI{VI,MOI.GreaterThan{Float64}}(2)] == [VI(2)] primal_var_dual_con = primal_dual_map.primal_var_dual_con @test isempty(primal_var_dual_con) @@ -176,7 +173,6 @@ x + y = 1 (a) x >= 0 (b) y >= 0 (c) - dual max # ignored # 1 + y + a - y a - y c - 2 w1^2 + y^2 s.t. @@ -195,16 +191,16 @@ primal_dual_map = dual.primal_dual_map @test MOI.get(dual_model, MOI.NumberOfVariables()) == 4 - list_of_cons = MOI.get(dual_model, MOI.ListOfConstraints()) + list_of_cons = MOI.get(dual_model, MOI.ListOfConstraintTypesPresent()) @test Set(list_of_cons) == Set( [ - (SVF, MOI.GreaterThan{Float64}) + (VI, MOI.GreaterThan{Float64}) (SAF{Float64}, MOI.GreaterThan{Float64}) ], ) @test MOI.get( dual_model, - MOI.NumberOfConstraints{SVF,MOI.GreaterThan{Float64}}(), + MOI.NumberOfConstraints{VI,MOI.GreaterThan{Float64}}(), ) == 1 @test MOI.get( dual_model, @@ -233,12 +229,8 @@ primal_con_dual_var = primal_dual_map.primal_con_dual_var @test primal_con_dual_var[CI{SAF{Float64},MOI.EqualTo{Float64}}(1)] == [VI(1)] - @test !(haskey( - primal_con_dual_var, - CI{SVF,MOI.GreaterThan{Float64}}(1), - )) - @test primal_con_dual_var[CI{SVF,MOI.GreaterThan{Float64}}(2)] == - [VI(2)] + @test !(haskey(primal_con_dual_var, CI{VI,MOI.GreaterThan{Float64}}(1))) + @test primal_con_dual_var[CI{VI,MOI.GreaterThan{Float64}}(2)] == [VI(2)] @test isempty(primal_dual_map.primal_var_dual_con) diff --git a/test/Tests/test_structures.jl b/test/Tests/test_structures.jl index 4a278229..77bf9e2c 100644 --- a/test/Tests/test_structures.jl +++ b/test/Tests/test_structures.jl @@ -1,7 +1,7 @@ @testset "structures" begin primal_dual_map = Dualization.PrimalDualMap{Float64}() @test Dualization.is_empty(primal_dual_map) - push!(primal_dual_map.primal_var_dual_con, VI(1) => CI{SVF,MOI.EqualTo}(1)) + push!(primal_dual_map.primal_var_dual_con, VI(1) => CI{VI,MOI.EqualTo}(1)) @test !Dualization.is_empty(primal_dual_map) # Constructors diff --git a/test/Tests/test_supported.jl b/test/Tests/test_supported.jl index d5ec0fba..7c73cf15 100644 --- a/test/Tests/test_supported.jl +++ b/test/Tests/test_supported.jl @@ -1,8 +1,8 @@ @testset "supported.jl" begin @testset "supported_objective" begin Dualization.supported_objective(lp1_test()) # ScalarAffineFucntion Objective - Dualization.supported_objective(lp10_test()) # SingleVariable Objective - Dualization.supported_objective(qp1_test()) # SingleVariable Objective + Dualization.supported_objective(lp10_test()) # VariableIndex Objective + Dualization.supported_objective(qp1_test()) # VariableIndex Objective obj_typ_svf = MOI.get(lp1_test(), MOI.ObjectiveFunctionType()) obj_typ_saf = MOI.get(lp10_test(), MOI.ObjectiveFunctionType()) obj_typ_qp = MOI.get(qp1_test(), MOI.ObjectiveFunctionType()) @@ -13,11 +13,11 @@ @testset "supported_constraints" begin # All supported SAFs - con_types = MOI.get(lp1_test(), MOI.ListOfConstraints()) + con_types = MOI.get(lp1_test(), MOI.ListOfConstraintTypesPresent()) Dualization.supported_constraints(con_types) # Intervals Set is not supported - con_types = MOI.get(lp9_test(), MOI.ListOfConstraints()) + con_types = MOI.get(lp9_test(), MOI.ListOfConstraintTypesPresent()) @test_throws ErrorException Dualization.supported_constraints(con_types) # Throws an error if constraint cannot be dualized end end diff --git a/test/runtests.jl b/test/runtests.jl index bc06fe9b..b12a2fdc 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -5,15 +5,13 @@ const MOIU = MathOptInterface.Utilities const MOIB = MathOptInterface.Bridges const MOIT = MathOptInterface.Test -const SVF = MOI.SingleVariable +const CI = MOI.ConstraintIndex +const VI = MOI.VariableIndex const VVF = MOI.VectorOfVariables const SAF{T} = MOI.ScalarAffineFunction{T} const VAF{T} = MOI.VectorAffineFunction{T} const SQF{T} = MOI.ScalarQuadraticFunction{T} -const VI = MOI.VariableIndex -const CI = MOI.ConstraintIndex - MOIU.@model( TestModel, (MOI.ZeroOne, MOI.Integer),