|
157 | 157 | @test dest.added_constrained[idxmap[vi].value]
|
158 | 158 | end
|
159 | 159 | end
|
| 160 | + |
| 161 | + |
| 162 | +abstract type AbstractConstrainedVariablesModel <: MOI.ModelLike end |
| 163 | +mutable struct OrderConstrainedVariablesModel <: AbstractConstrainedVariablesModel |
| 164 | + constraintIndices ::Array{MOI.ConstraintIndex} |
| 165 | + inner ::MOIU.Model{Float64} |
| 166 | + OrderConstrainedVariablesModel() = new(MOI.ConstraintIndex[], MOIU.Model{Float64}()) |
| 167 | +end |
| 168 | +mutable struct ReverseOrderConstrainedVariablesModel <: AbstractConstrainedVariablesModel |
| 169 | + constraintIndices ::Array{MOI.ConstraintIndex} |
| 170 | + inner ::MOIU.Model{Float64} |
| 171 | + ReverseOrderConstrainedVariablesModel() = new(MOI.ConstraintIndex[], MOIU.Model{Float64}()) |
| 172 | +end |
| 173 | + |
| 174 | + |
| 175 | + |
| 176 | +MOI.add_variables(model::AbstractConstrainedVariablesModel, n) = MOI.add_variables(model.inner, n) |
| 177 | +MOI.add_variable(model::AbstractConstrainedVariablesModel) = MOI.add_variable(model.inner) |
| 178 | + |
| 179 | +function MOI.add_constraint(model::AbstractConstrainedVariablesModel, f::F, s::S) where {F<:MOI.AbstractFunction, S<:MOI.AbstractSet} |
| 180 | + ci = MOI.add_constraint(model.inner, f, s) |
| 181 | + push!(model.constraintIndices, ci) |
| 182 | + return ci |
| 183 | +end |
| 184 | + |
| 185 | +function MOI.copy_to(dest::AbstractConstrainedVariablesModel, src::MOI.ModelLike; kws...) |
| 186 | + MOIU.automatic_copy_to(dest, src; kws...) |
| 187 | +end |
| 188 | + |
| 189 | +MOIU.supports_default_copy_to(model::AbstractConstrainedVariablesModel, ::Bool) = true |
| 190 | + |
| 191 | +function MOI.empty!(model::AbstractConstrainedVariablesModel) |
| 192 | + model.constraintIndices = MOI.ConstraintIndex[] |
| 193 | + MOI.empty!(model.inner) |
| 194 | +end |
| 195 | + |
| 196 | + |
| 197 | +MOI.supports_constraint(::OrderConstrainedVariablesModel, ::Type{MOI.VectorOfVariables}, ::Type{MOI.Nonnegatives}) = false |
| 198 | +MOI.supports_add_constrained_variables(::OrderConstrainedVariablesModel, ::Type{MOI.Nonnegatives}) = true |
| 199 | +MOI.supports_constraint(::OrderConstrainedVariablesModel, ::Type{MOI.VectorOfVariables}, ::Type{MOI.Nonnegatives}) = true |
| 200 | +MOI.supports_add_constrained_variables(::OrderConstrainedVariablesModel, ::Type{MOI.Nonpositives}) = false |
| 201 | + |
| 202 | +MOI.supports_constraint(::ReverseOrderConstrainedVariablesModel, ::Type{MOI.VectorOfVariables}, ::Type{MOI.Nonnegatives}) = true |
| 203 | +MOI.supports_add_constrained_variables(::ReverseOrderConstrainedVariablesModel, ::Type{MOI.Nonnegatives}) = false |
| 204 | +MOI.supports_constraint(::ReverseOrderConstrainedVariablesModel, ::Type{MOI.VectorOfVariables}, ::Type{MOI.Nonnegatives}) = false |
| 205 | +MOI.supports_add_constrained_variables(::ReverseOrderConstrainedVariablesModel, ::Type{MOI.Nonpositives}) = true |
| 206 | + |
| 207 | + |
| 208 | +MOI.supports_constraint(::OrderConstrainedVariablesModel, ::Type{MOI.SingleVariable}, ::Type{<:MOI.GreaterThan}) = true |
| 209 | +MOI.supports_add_constrained_variable(::OrderConstrainedVariablesModel, ::Type{<:MOI.GreaterThan}) = false |
| 210 | +MOI.supports_constraint(::OrderConstrainedVariablesModel, ::Type{MOI.SingleVariable}, ::Type{<:MOI.LessThan}) = false |
| 211 | +MOI.supports_add_constrained_variable(::OrderConstrainedVariablesModel, ::Type{<:MOI.LessThan}) = true |
| 212 | + |
| 213 | +MOI.supports_constraint(::ReverseOrderConstrainedVariablesModel, ::Type{MOI.SingleVariable}, ::Type{<:MOI.GreaterThan}) = false |
| 214 | +MOI.supports_add_constrained_variable(::ReverseOrderConstrainedVariablesModel, ::Type{<:MOI.GreaterThan}) = true |
| 215 | +MOI.supports_constraint(::ReverseOrderConstrainedVariablesModel, ::Type{MOI.SingleVariable}, ::Type{<:MOI.LessThan}) = true |
| 216 | +MOI.supports_add_constrained_variable(::ReverseOrderConstrainedVariablesModel, ::Type{<:MOI.LessThan}) = false |
| 217 | + |
| 218 | + |
| 219 | +@testset "Create variables using supports_add_constrained_variable(s) (#987)" begin |
| 220 | + # With vectors |
| 221 | + src = MOIU.Model{Float64}() |
| 222 | + a, c1 = MOI.add_constrained_variables(src, MOI.Nonpositives(3)) |
| 223 | + c2 = MOI.add_constraint(src, a, MOI.Nonnegatives(3)) |
| 224 | + |
| 225 | + |
| 226 | + dest = OrderConstrainedVariablesModel() |
| 227 | + index_map = MOI.copy_to(dest, src) |
| 228 | + @test typeof(c1) == typeof(dest.constraintIndices[2]) |
| 229 | + @test typeof(c2) == typeof(dest.constraintIndices[1]) |
| 230 | + |
| 231 | + dest = ReverseOrderConstrainedVariablesModel() |
| 232 | + index_map = MOI.copy_to(dest, src) |
| 233 | + @test typeof(c1) == typeof(dest.constraintIndices[1]) |
| 234 | + @test typeof(c2) == typeof(dest.constraintIndices[2]) |
| 235 | + |
| 236 | + |
| 237 | + |
| 238 | + # With single variables |
| 239 | + src = MOIU.Model{Float64}() |
| 240 | + a, c1 = MOI.add_constrained_variable(src, MOI.GreaterThan{Float64}(5.0)) |
| 241 | + c2 = MOI.add_constraint(src, a, MOI.LessThan{Float64}(1.0)) |
| 242 | + |
| 243 | + |
| 244 | + dest = OrderConstrainedVariablesModel() |
| 245 | + index_map = MOI.copy_to(dest, src) |
| 246 | + @test typeof(c1) == typeof(dest.constraintIndices[2]) |
| 247 | + @test typeof(c2) == typeof(dest.constraintIndices[1]) |
| 248 | + |
| 249 | + dest = ReverseOrderConstrainedVariablesModel() |
| 250 | + index_map = MOI.copy_to(dest, src) |
| 251 | + @test typeof(c1) == typeof(dest.constraintIndices[1]) |
| 252 | + @test typeof(c2) == typeof(dest.constraintIndices[2]) |
| 253 | +end |
0 commit comments