Skip to content

Commit

Permalink
Merge pull request #262 from JuliaOpt/bl/intconic
Browse files Browse the repository at this point in the history
Fix and test intconic tests
  • Loading branch information
blegat authored Feb 27, 2018
2 parents a88cb73 + 4124111 commit 760f5dd
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 63 deletions.
120 changes: 59 additions & 61 deletions src/Test/intconic.jl
Original file line number Diff line number Diff line change
@@ -1,71 +1,69 @@
# Integer conic problems

function intsoc1test(model::MOI.ModelLike; atol=Base.rtoldefault(Float64), rtol=Base.rtoldefault(Float64))
function intsoc1test(model::MOI.ModelLike, config::TestConfig)
atol = config.atol
rtol = config.rtol
#@test MOI.supportsproblem(model, MOI.ScalarAffineFunction{Float64},
# [(MOI.VectorAffineFunction{Float64},MOI.Zeros),
# (MOI.SingleVariable,MOI.ZeroOne),
# (MOI.VectorOfVariables,MOI.SecondOrderCone)])
@testset "INTSOC1" begin

# Problem SINTSOC1
# min 0x - 2y - 1z
# st x == 1
# x >= ||(y,z)||
# (y,z) binary

MOI.empty!(model)
@test MOI.isempty(model)

MOI.canaddvariable(model)
x,y,z = MOI.addvariables!(model, 3)

@test MOI.canset(model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}())
MOI.set!(model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), MOI.ScalarAffineFunction([y,z],[-2.0,-1.0],0.0))
@test MOI.canset(model, MOI.ObjectiveSense())
MOI.set!(model, MOI.ObjectiveSense(), MOI.MinSense)

@test MOI.canaddconstraint(model, MOI.VectorAffineFunction{Float64}, MOI.Zeros)
ceq = MOI.addconstraint!(model, MOI.VectorAffineFunction([1],[x],[1.0],[-1.0]), MOI.Zeros(1))
@test MOI.canaddconstraint(model, MOI.VectorOfVariables, MOI.SecondOrderCone)
csoc = MOI.addconstraint!(model, MOI.VectorOfVariables([x,y,z]), MOI.SecondOrderCone(3))

@test MOI.get(model, MOI.NumberOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Zeros}()) == 1
@test MOI.get(model, MOI.NumberOfConstraints{MOI.VectorOfVariables,MOI.SecondOrderCone}()) == 1
loc = MOI.get(model, MOI.ListOfConstraints())
@test length(loc) == 2
@test (MOI.VectorAffineFunction{Float64},MOI.Zeros) in loc
@test (MOI.VectorOfVariables,MOI.SecondOrderCone) in loc

@test MOI.canaddconstraint(model, typeof(MOI.SingleVariable(y)), typeof(MOI.ZeroOne))
bin1 = MOI.addconstraint!(model, MOI.SingleVariable(y), MOI.ZeroOne)
@test MOI.canaddconstraint(model, typeof(MOI.SingleVariable(z)), typeof(MOI.ZeroOne))
bin2 = MOI.addconstraint!(model, MOI.SingleVariable(z), MOI.ZeroOne)

if config.solve
MOI.optimize!(model)

@test MOI.canget(model, MOI.TerminationStatus())
@test MOI.get(model, MOI.TerminationStatus()) == MOI.Success

@test MOI.canget(model, MOI.PrimalStatus())
@test MOI.get(model, MOI.PrimalStatus()) == MOI.FeasiblePoint

@test MOI.canget(model, MOI.ObjectiveValue())
@test MOI.get(model, MOI.ObjectiveValue()) -2 atol=atol rtol=rtol

@test MOI.canget(model, MOI.VariablePrimal(), MOI.VariableIndex)
@test MOI.get(model, MOI.VariablePrimal(), x) 1 atol=atol rtol=rtol
@test MOI.get(model, MOI.VariablePrimal(), y) 1 atol=atol rtol=rtol
@test MOI.get(model, MOI.VariablePrimal(), z) 0 atol=atol rtol=rtol
end

# Problem SINTSOC1
# min 0x - 2y - 1z
# st x == 1
# x >= ||(y,z)||
# (y,z) binary

MOI.empty!(model)
@test MOI.isempty(model)

MOI.canaddvariable(model)
x,y,z = MOI.addvariables!(model, 3)

@test MOI.canset(model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}())
MOI.set!(model, MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(), MOI.ScalarAffineFunction([y,z],[-2.0,-1.0],0.0))
@test MOI.canset(model, MOI.ObjectiveSense())
MOI.set!(model, MOI.ObjectiveSense(), MOI.MinSense)

@test MOI.canaddconstraint(model, MOI.VectorAffineFunction{Float64}, MOI.Zeros)
ceq = MOI.addconstraint!(model, MOI.VectorAffineFunction([1],[x],[1.0],[-1.0]), MOI.Zeros(1))
@test MOI.canaddconstraint(model, MOI.VectorOfVariables, MOI.SecondOrderCone)
csoc = MOI.addconstraint!(model, MOI.VectorOfVariables([x,y,z]), MOI.SecondOrderCone(3))

@test MOI.get(model, MOI.NumberOfConstraints{MOI.VectorAffineFunction{Float64},MOI.Zeros}()) == 1
@test MOI.get(model, MOI.NumberOfConstraints{MOI.VectorOfVariables,MOI.SecondOrderCone}()) == 1
loc = MOI.get(model, MOI.ListOfConstraints())
@test length(loc) == 2
@test (MOI.VectorAffineFunction{Float64},MOI.Zeros) in loc
@test (MOI.VectorOfVariables,MOI.SecondOrderCone) in loc

@test MOI.canaddconstraint(model, MOI.SingleVariable, MOI.ZeroOne)
bin1 = MOI.addconstraint!(model, MOI.SingleVariable(y), MOI.ZeroOne())
@test MOI.canaddconstraint(model, MOI.SingleVariable, MOI.ZeroOne)
bin2 = MOI.addconstraint!(model, MOI.SingleVariable(z), MOI.ZeroOne())

if config.solve
MOI.optimize!(model)

@test MOI.canget(model, MOI.TerminationStatus())
@test MOI.get(model, MOI.TerminationStatus()) == MOI.Success

@test MOI.canget(model, MOI.PrimalStatus())
@test MOI.get(model, MOI.PrimalStatus()) == MOI.FeasiblePoint

@test MOI.canget(model, MOI.ObjectiveValue())
@test MOI.get(model, MOI.ObjectiveValue()) -2 atol=atol rtol=rtol

@test MOI.canget(model, MOI.VariablePrimal(), MOI.VariableIndex)
@test MOI.get(model, MOI.VariablePrimal(), x) 1 atol=atol rtol=rtol
@test MOI.get(model, MOI.VariablePrimal(), y) 1 atol=atol rtol=rtol
@test MOI.get(model, MOI.VariablePrimal(), z) 0 atol=atol rtol=rtol
end
end

function intsoctests(model::MOI.ModelLike; atol=Base.rtoldefault(Float64), rtol=Base.rtoldefault(Float64))
intsoc1test(model, atol=atol, rtol=rtol)
end
const intsoctests = Dict("intsoc1" => intsoc1test)

function intconictests(model::MOI.ModelLike; atol=Base.rtoldefault(Float64), rtol=Base.rtoldefault(Float64))
intsoctests(model, atol=atol, rtol=rtol)
end
@moitestset intsoc

const intconictests = Dict("intsoc" => intsoctest)

@moitestset intconic true
10 changes: 10 additions & 0 deletions test/intconic.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
@testset "Integer Conic" begin
optimizer = MOIU.MockOptimizer(Model{Float64}())
config = MOIT.TestConfig()
optimizer.evalobjective = true

@testset "SOC" begin
optimizer.optimize! = (optimizer::MOIU.MockOptimizer) -> MOIU.mock_optimize!(optimizer, [1.0, 1.0, 0.0])
MOIT.intsoc1test(optimizer, config)
end
end
6 changes: 4 additions & 2 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ include("interval.jl")
# Needed by test spread over several files, defining it here make it easier to comment out tests
# Model supporting every MOI functions and sets
MOIU.@model(Model,
(), # <- example of giving no set
(ZeroOne,),
(EqualTo, GreaterThan, LessThan, Interval),
(Reals, Zeros, Nonnegatives, Nonpositives, SecondOrderCone, RotatedSecondOrderCone, GeometricMeanCone, ExponentialCone, DualExponentialCone, PositiveSemidefiniteConeTriangle, RootDetConeTriangle, LogDetConeTriangle),
(PowerCone, DualPowerCone),
(SingleVariable,), # <- example of giving only one set
(SingleVariable,),
(ScalarAffineFunction, ScalarQuadraticFunction),
(VectorOfVariables,),
(VectorAffineFunction, VectorQuadraticFunction))
Expand All @@ -35,3 +35,5 @@ include("copy.jl")
# It tests that the ConstraintPrimal value requested in the tests is consistent with the VariablePrimal
include("contlinear.jl")
include("contconic.jl")

include("intconic.jl")

0 comments on commit 760f5dd

Please sign in to comment.