From dab7d3a6e9fe6e21568fd65513456ee36b211ba5 Mon Sep 17 00:00:00 2001 From: guilhermebodin Date: Wed, 5 Jan 2022 16:15:21 -0300 Subject: [PATCH 1/7] Fixes for JuMP 0.22 and MOI 0.10 --- Project.toml | 9 +- docs/src/manual.md | 8 +- src/Dualization.jl | 5 +- src/MOI_wrapper.jl | 10 +- src/constrained_variables.jl | 16 ++-- src/dual_equality_constraints.jl | 42 ++++----- src/dual_model_variables.jl | 10 +- src/dualize.jl | 14 +-- src/objective_coefficients.jl | 34 +++---- src/supported.jl | 8 +- src/utils.jl | 4 +- test/Problems/Linear/linear_problems.jl | 40 ++++---- test/Problems/Quadratic/quadratic_problems.jl | 8 +- test/Problems/RSOC/rsoc_problems.jl | 28 +++--- test/Solvers/scs_test.jl | 10 -- test/Tests/test_MOI_wrapper.jl | 93 +++++++------------ test/Tests/test_dual_names.jl | 14 +-- test/Tests/test_dualize_conic_linear.jl | 4 +- test/Tests/test_dualize_exponential.jl | 4 +- test/Tests/test_dualize_linear.jl | 30 +++--- test/Tests/test_dualize_power.jl | 4 +- test/Tests/test_dualize_quadratic.jl | 8 +- test/Tests/test_dualize_rsoc.jl | 4 +- test/Tests/test_dualize_sdp.jl | 4 +- test/Tests/test_dualize_soc.jl | 4 +- test/Tests/test_objective_coefficients.jl | 2 +- test/Tests/test_partial_dual_linear.jl | 28 +++--- test/Tests/test_partial_dual_quadratic.jl | 26 +++--- test/Tests/test_structures.jl | 2 +- test/Tests/test_supported.jl | 8 +- test/runtests.jl | 5 +- 31 files changed, 221 insertions(+), 265 deletions(-) diff --git a/Project.toml b/Project.toml index 4b458f23..ec00304d 100644 --- a/Project.toml +++ b/Project.toml @@ -1,15 +1,18 @@ 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" +CSDP = "0.7" +ECOS = "0.14" +GLPK = "0.15" +JuMP = "0.22" +SCS = "0.8" 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..4a687396 100644 --- a/src/Dualization.jl +++ b/src/Dualization.jl @@ -5,15 +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") 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..aa615af0 100644 --- a/src/constrained_variables.jl +++ b/src/constrained_variables.jl @@ -6,21 +6,21 @@ 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 - _add_constrained_variable( + elseif S <: MOI.AbstractScalarSet + Dualization._add_constrained_variable( dual_problem.primal_dual_map, primal_model, S, params, - ) + ) end end end @@ -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..59539412 100644 --- a/src/dual_model_variables.jl +++ b/src/dual_model_variables.jl @@ -9,8 +9,8 @@ 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) && - haskey(primal_dual_map.constrained_var_dual, ci) + if (F === MOI.VectorOfVariables || F === MOI.VariableIndex) && + haskey(primal_dual_map.constrained_var_dual, ci) continue end # Add dual variable to dual cone @@ -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..f52741a7 100644 --- a/src/objective_coefficients.jl +++ b/src/objective_coefficients.jl @@ -29,12 +29,12 @@ 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 +123,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 +135,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 +149,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 +161,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 +238,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 +254,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 +265,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 +281,7 @@ function get_dual_objective( MOI.ScalarQuadraticTerm{T}( sense_change * MOI.coefficient(term), param, - term.variable_index, + term.variable, ), ) end @@ -289,8 +289,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..64234428 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,14 +365,14 @@ 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.ObjectiveFunction{MOI.VariableIndex}(), + X[1], ) MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE) @@ -391,9 +391,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 +425,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..2b9ac947 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,11 +80,11 @@ 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)) + 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, - MOI.SingleVariable(x[3]), + x[3], MOI.GreaterThan(2.0), ) @@ -123,12 +123,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 +182,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/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..a1a10653 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,86 +8,61 @@ 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_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 @@ -113,7 +88,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..b2d10a26 100644 --- a/test/Tests/test_dual_names.jl +++ b/test/Tests/test_dual_names.jl @@ -10,23 +10,15 @@ 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}}( + 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{ @@ -50,7 +42,7 @@ 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}}( + 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{ @@ -59,8 +51,6 @@ }( 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..22f04ef0 100644 --- a/test/Tests/test_dualize_conic_linear.jl +++ b/test/Tests/test_dualize_conic_linear.jl @@ -19,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 list_of_cons == [(VAF{Float64}, MOI.Nonnegatives)] @test MOI.get( dual_model, @@ -91,7 +91,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..34f8826f 100644 --- a/test/Tests/test_dualize_exponential.jl +++ b/test/Tests/test_dualize_exponential.jl @@ -20,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.DualExponentialCone)],) @test MOI.get( @@ -56,7 +56,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..66565ed8 100644 --- a/test/Tests/test_dualize_linear.jl +++ b/test/Tests/test_dualize_linear.jl @@ -19,21 +19,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, @@ -70,10 +70,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 +81,7 @@ ) @test MOI.get( dual_model, - MOI.NumberOfConstraints{SVF,MOI.GreaterThan{Float64}}(), + MOI.NumberOfConstraints{VI,MOI.GreaterThan{Float64}}(), ) == 1 @test MOI.get( dual_model, @@ -120,16 +120,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, @@ -165,16 +165,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, @@ -211,7 +211,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..c0defcf0 100644 --- a/test/Tests/test_dualize_power.jl +++ b/test/Tests/test_dualize_power.jl @@ -20,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.DualPowerCone{Float64})],) @test MOI.get( @@ -56,7 +56,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..dd2e02d2 100644 --- a/test/Tests/test_dualize_quadratic.jl +++ b/test/Tests/test_dualize_quadratic.jl @@ -20,16 +20,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, @@ -126,7 +126,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..6a83166c 100644 --- a/test/Tests/test_dualize_rsoc.jl +++ b/test/Tests/test_dualize_rsoc.jl @@ -21,7 +21,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( @@ -58,7 +58,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..97b5ca2b 100644 --- a/test/Tests/test_dualize_sdp.jl +++ b/test/Tests/test_dualize_sdp.jl @@ -20,7 +20,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( @@ -59,7 +59,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..7ba63b8d 100644 --- a/test/Tests/test_dualize_soc.jl +++ b/test/Tests/test_dualize_soc.jl @@ -19,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.SecondOrderCone)],) @test MOI.get( dual_model, @@ -52,7 +52,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..7efb1e1a 100644 --- a/test/Tests/test_partial_dual_linear.jl +++ b/test/Tests/test_partial_dual_linear.jl @@ -26,21 +26,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, @@ -101,17 +101,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 +141,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)] @@ -180,16 +180,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 +211,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..dd4b2351 100644 --- a/test/Tests/test_partial_dual_quadratic.jl +++ b/test/Tests/test_partial_dual_quadratic.jl @@ -22,16 +22,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, @@ -117,16 +117,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,8 +156,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)] == + @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 @@ -195,16 +195,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, @@ -235,9 +235,9 @@ [VI(1)] @test !(haskey( primal_con_dual_var, - CI{SVF,MOI.GreaterThan{Float64}}(1), + CI{VI,MOI.GreaterThan{Float64}}(1), )) - @test primal_con_dual_var[CI{SVF,MOI.GreaterThan{Float64}}(2)] == + @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..008239e2 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -5,14 +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, From 797a60b1ec7e0835886d935791e6db133b1cf1ee Mon Sep 17 00:00:00 2001 From: guilhermebodin Date: Thu, 6 Jan 2022 02:06:23 -0300 Subject: [PATCH 2/7] try to fix Project.toml --- Project.toml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Project.toml b/Project.toml index ec00304d..91311775 100644 --- a/Project.toml +++ b/Project.toml @@ -8,11 +8,8 @@ JuMP = "4076af6c-e467-56ae-b986-b466b2749572" MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" [compat] -CSDP = "0.7" -ECOS = "0.14" -GLPK = "0.15" JuMP = "0.22" -SCS = "0.8" +MathOptInterface = "0.10" julia = "1" [extras] From f5ce544b607acc11b9d61d908a0ccea8dce2982a Mon Sep 17 00:00:00 2001 From: guilhermebodin Date: Thu, 6 Jan 2022 02:21:44 -0300 Subject: [PATCH 3/7] Remove RSOC out of order from tests --- test/Tests/test_MOI_wrapper.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/Tests/test_MOI_wrapper.jl b/test/Tests/test_MOI_wrapper.jl index a1a10653..0a734326 100644 --- a/test/Tests/test_MOI_wrapper.jl +++ b/test/Tests/test_MOI_wrapper.jl @@ -52,6 +52,7 @@ "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", ] ) From 76ca8c5ee1130078a68da0025948f48ebfef091e Mon Sep 17 00:00:00 2001 From: guilhermebodin Date: Thu, 6 Jan 2022 16:02:14 -0300 Subject: [PATCH 4/7] [ci skip] format check --- src/Dualization.jl | 1 - src/constrained_variables.jl | 6 +++--- src/dual_model_variables.jl | 2 +- src/objective_coefficients.jl | 5 ++++- test/Problems/Linear/linear_problems.jl | 6 +----- test/Problems/RSOC/rsoc_problems.jl | 6 +----- test/Problems/SOC/soc_problems.jl | 7 +++---- test/Solvers/ecos_test.jl | 8 ++------ test/Tests/test_MOI_wrapper.jl | 18 ++++++------------ test/Tests/test_dual_names.jl | 10 ++++------ test/Tests/test_dualize_conic_linear.jl | 3 +-- test/Tests/test_dualize_exponential.jl | 3 +-- test/Tests/test_dualize_linear.jl | 5 ----- test/Tests/test_dualize_power.jl | 2 -- test/Tests/test_dualize_quadratic.jl | 2 -- test/Tests/test_dualize_rsoc.jl | 2 -- test/Tests/test_dualize_sdp.jl | 2 -- test/Tests/test_dualize_soc.jl | 3 +-- test/Tests/test_partial_dual_linear.jl | 6 ------ test/Tests/test_partial_dual_quadratic.jl | 14 +++----------- test/runtests.jl | 1 - 21 files changed, 31 insertions(+), 81 deletions(-) diff --git a/src/Dualization.jl b/src/Dualization.jl index 4a687396..d798fe25 100644 --- a/src/Dualization.jl +++ b/src/Dualization.jl @@ -13,7 +13,6 @@ const VAF{T} = MOI.VectorAffineFunction{T} const SQF{T} = MOI.ScalarQuadraticFunction{T} const VQF{T} = MOI.VectorQuadraticFunction{T} - include("structures.jl") include("utils.jl") include("dual_sets.jl") diff --git a/src/constrained_variables.jl b/src/constrained_variables.jl index aa615af0..93c360c7 100644 --- a/src/constrained_variables.jl +++ b/src/constrained_variables.jl @@ -14,13 +14,13 @@ function add_constrained_variables( S, params, ) - elseif S <: MOI.AbstractScalarSet - Dualization._add_constrained_variable( + elseif S <: MOI.AbstractScalarSet + _add_constrained_variable( dual_problem.primal_dual_map, primal_model, S, params, - ) + ) end end end diff --git a/src/dual_model_variables.jl b/src/dual_model_variables.jl index 59539412..dfa5a1f6 100644 --- a/src/dual_model_variables.jl +++ b/src/dual_model_variables.jl @@ -10,7 +10,7 @@ function add_dual_vars_in_dual_cones( 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.VariableIndex) && - haskey(primal_dual_map.constrained_var_dual, ci) + haskey(primal_dual_map.constrained_var_dual, ci) continue end # Add dual variable to dual cone diff --git a/src/objective_coefficients.jl b/src/objective_coefficients.jl index f52741a7..116a423e 100644 --- a/src/objective_coefficients.jl +++ b/src/objective_coefficients.jl @@ -34,7 +34,10 @@ function _scalar_quadratic_function( ) end function _scalar_quadratic_function(func::MOI.VariableIndex, T::Type) - return _scalar_quadratic_function(SAF{T}([MOI.ScalarAffineTerm(1.0, func)], 0), T) + return _scalar_quadratic_function( + SAF{T}([MOI.ScalarAffineTerm(1.0, func)], 0), + T, + ) end # Primals diff --git a/test/Problems/Linear/linear_problems.jl b/test/Problems/Linear/linear_problems.jl index 64234428..8c3e2870 100644 --- a/test/Problems/Linear/linear_problems.jl +++ b/test/Problems/Linear/linear_problems.jl @@ -369,11 +369,7 @@ function lp10_test() MOI.add_constraint(model, X[2], MOI.EqualTo(0.0)) - MOI.set( - model, - MOI.ObjectiveFunction{MOI.VariableIndex}(), - X[1], - ) + MOI.set(model, MOI.ObjectiveFunction{MOI.VariableIndex}(), X[1]) MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE) diff --git a/test/Problems/RSOC/rsoc_problems.jl b/test/Problems/RSOC/rsoc_problems.jl index 2b9ac947..f07b87a3 100644 --- a/test/Problems/RSOC/rsoc_problems.jl +++ b/test/Problems/RSOC/rsoc_problems.jl @@ -82,11 +82,7 @@ function rsoc3_test() 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), - ) + vc3 = MOI.add_constraint(model, x[3], MOI.GreaterThan(2.0)) rsoc = MOI.add_constraint( model, diff --git a/test/Problems/SOC/soc_problems.jl b/test/Problems/SOC/soc_problems.jl index d704fdbd..b0bc6499 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,7 @@ function soc4_test() s.t. y ≥ 1/√2 x² + y² ≤ 1 - + in conic form: min x s.t. @@ -196,7 +195,7 @@ function soc5_test() y ≥ 2 x ≤ 1 |y| ≤ x - + in conic form: min x s.t. @@ -251,7 +250,7 @@ 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..7d034705 100644 --- a/test/Solvers/ecos_test.jl +++ b/test/Solvers/ecos_test.jl @@ -9,12 +9,8 @@ const ECOS_DUAL_OPT = MOI.instantiate(ECOS_DUAL_FACTORY) @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, - ] + list_of_soc_problems = + [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 diff --git a/test/Tests/test_MOI_wrapper.jl b/test/Tests/test_MOI_wrapper.jl index 0a734326..75cd4eba 100644 --- a/test/Tests/test_MOI_wrapper.jl +++ b/test/Tests/test_MOI_wrapper.jl @@ -11,9 +11,7 @@ MOIT.runtests( linear_bridged, linear_config, - include = [ - "test_linear_", - ], + include = ["test_linear_"], exclude = [ "test_linear_FEASIBILITY_SENSE", "test_linear_INFEASIBLE_2", @@ -22,8 +20,8 @@ "test_linear_inactive_bounds", "test_linear_integration_2", "test_linear_integration_Interval", - "test_linear_integration_delete_variables" - ] + "test_linear_integration_delete_variables", + ], ) end end @@ -40,9 +38,7 @@ MOIT.runtests( conic_bridged, conic_config, - include = [ - "test_conic_" - ], + include = ["test_conic_"], exclude = [ "test_conic_NormInfinityCone_INFEASIBLE", "test_conic_NormOneCone_INFEASIBLE", @@ -54,7 +50,7 @@ "test_conic_SecondOrderCone_no_initial_bound", "test_conic_RotatedSecondOrderCone_out_of_order", "test_conic_linear_INFEASIBLE", - ] + ], ) end @@ -62,9 +58,7 @@ MOIT.runtests( conic_bridged, conic_config, - include = [ - "test_quadratic_" - ], + include = ["test_quadratic_"], ) end end diff --git a/test/Tests/test_dual_names.jl b/test/Tests/test_dual_names.jl index b2d10a26..e3ea8ed9 100644 --- a/test/Tests/test_dual_names.jl +++ b/test/Tests/test_dual_names.jl @@ -18,9 +18,8 @@ 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{VI,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}, @@ -42,9 +41,8 @@ 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{VI,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}, diff --git a/test/Tests/test_dualize_conic_linear.jl b/test/Tests/test_dualize_conic_linear.jl index 22f04ef0..835ad490 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. @@ -79,7 +78,7 @@ y <= 0 z >= 0 s zero - + dual max -4w_4 - 3w_5 + 12w_6 s.t diff --git a/test/Tests/test_dualize_exponential.jl b/test/Tests/test_dualize_exponential.jl index 34f8826f..1043c04f 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. @@ -43,7 +42,7 @@ 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. diff --git a/test/Tests/test_dualize_linear.jl b/test/Tests/test_dualize_linear.jl index 66565ed8..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. @@ -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. @@ -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 @@ -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. @@ -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. diff --git a/test/Tests/test_dualize_power.jl b/test/Tests/test_dualize_power.jl index c0defcf0..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. @@ -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. diff --git a/test/Tests/test_dualize_quadratic.jl b/test/Tests/test_dualize_quadratic.jl index dd2e02d2..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. @@ -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. diff --git a/test/Tests/test_dualize_rsoc.jl b/test/Tests/test_dualize_rsoc.jl index 6a83166c..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. @@ -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. diff --git a/test/Tests/test_dualize_sdp.jl b/test/Tests/test_dualize_sdp.jl index 97b5ca2b..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. @@ -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. diff --git a/test/Tests/test_dualize_soc.jl b/test/Tests/test_dualize_soc.jl index 7ba63b8d..4ce6c9c5 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. @@ -39,7 +38,7 @@ s.t. x == 1 :w_4 x >= ||(y,z)|| :w_1, w_2, w_3 - + dual min -w_4 s.t. diff --git a/test/Tests/test_partial_dual_linear.jl b/test/Tests/test_partial_dual_linear.jl index 7efb1e1a..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. @@ -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. @@ -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. diff --git a/test/Tests/test_partial_dual_quadratic.jl b/test/Tests/test_partial_dual_quadratic.jl index dd4b2351..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. @@ -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. @@ -157,8 +155,7 @@ @test primal_con_dual_var[CI{SAF{Float64},MOI.EqualTo{Float64}}(1)] == [VI(1)] @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 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. @@ -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{VI,MOI.GreaterThan{Float64}}(1), - )) - @test primal_con_dual_var[CI{VI,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/runtests.jl b/test/runtests.jl index 008239e2..b12a2fdc 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -12,7 +12,6 @@ const SAF{T} = MOI.ScalarAffineFunction{T} const VAF{T} = MOI.VectorAffineFunction{T} const SQF{T} = MOI.ScalarQuadraticFunction{T} - MOIU.@model( TestModel, (MOI.ZeroOne, MOI.Integer), From 7257619c92e28d65495e99c74bb5e47b8a01a7a0 Mon Sep 17 00:00:00 2001 From: guilhermebodin Date: Thu, 6 Jan 2022 16:03:22 -0300 Subject: [PATCH 5/7] Fix formats and exclude on ECOS test --- test/Problems/SOC/soc_problems.jl | 3 --- test/Tests/test_dualize_conic_linear.jl | 1 - test/Tests/test_dualize_exponential.jl | 1 - test/Tests/test_dualize_soc.jl | 1 - 4 files changed, 6 deletions(-) diff --git a/test/Problems/SOC/soc_problems.jl b/test/Problems/SOC/soc_problems.jl index b0bc6499..dc4e0c01 100644 --- a/test/Problems/SOC/soc_problems.jl +++ b/test/Problems/SOC/soc_problems.jl @@ -137,7 +137,6 @@ function soc4_test() s.t. y ≥ 1/√2 x² + y² ≤ 1 - in conic form: min x s.t. @@ -195,7 +194,6 @@ function soc5_test() y ≥ 2 x ≤ 1 |y| ≤ x - in conic form: min x s.t. @@ -250,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/Tests/test_dualize_conic_linear.jl b/test/Tests/test_dualize_conic_linear.jl index 835ad490..bde39d33 100644 --- a/test/Tests/test_dualize_conic_linear.jl +++ b/test/Tests/test_dualize_conic_linear.jl @@ -78,7 +78,6 @@ y <= 0 z >= 0 s zero - dual max -4w_4 - 3w_5 + 12w_6 s.t diff --git a/test/Tests/test_dualize_exponential.jl b/test/Tests/test_dualize_exponential.jl index 1043c04f..c6974536 100644 --- a/test/Tests/test_dualize_exponential.jl +++ b/test/Tests/test_dualize_exponential.jl @@ -42,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. diff --git a/test/Tests/test_dualize_soc.jl b/test/Tests/test_dualize_soc.jl index 4ce6c9c5..ce85fdab 100644 --- a/test/Tests/test_dualize_soc.jl +++ b/test/Tests/test_dualize_soc.jl @@ -38,7 +38,6 @@ s.t. x == 1 :w_4 x >= ||(y,z)|| :w_1, w_2, w_3 - dual min -w_4 s.t. From a9f922fb17f1f7296917163da9be5f76a97e29f0 Mon Sep 17 00:00:00 2001 From: guilhermebodin Date: Thu, 6 Jan 2022 18:40:09 -0300 Subject: [PATCH 6/7] Remove ECOS Conic Linear problems --- test/Solvers/ecos_test.jl | 6 ------ 1 file changed, 6 deletions(-) diff --git a/test/Solvers/ecos_test.jl b/test/Solvers/ecos_test.jl index 7d034705..c426ef64 100644 --- a/test/Solvers/ecos_test.jl +++ b/test/Solvers/ecos_test.jl @@ -5,14 +5,8 @@ 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))) @testset "ECOS conic Problems" begin - @testset "ECOS Conic linear problems" begin - list_of_soc_problems = - [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] From 489cb2239980ad59e7f39b38534e257af901d7fe Mon Sep 17 00:00:00 2001 From: guilhermebodin Date: Fri, 7 Jan 2022 12:46:50 -0300 Subject: [PATCH 7/7] update ECOS --- test/Solvers/ecos_test.jl | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/Solvers/ecos_test.jl b/test/Solvers/ecos_test.jl index c426ef64..ca785738 100644 --- a/test/Solvers/ecos_test.jl +++ b/test/Solvers/ecos_test.jl @@ -5,6 +5,15 @@ 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) +# 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 SOC problems" begin