Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name = "ProxSDP"
uuid = "65e78d25-6039-50a4-9445-38022e3d2eb3"
repo = "https://github.com/mariohsouto/ProxSDP.jl.git"
version = "1.6.1"
version = "1.6.2"

[deps]
Arpack = "7d9fca2a-8960-54d3-9f78-7d1dccf2cb97"
Expand Down
2 changes: 1 addition & 1 deletion src/pdhg.jl
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ function chambolle_pock(affine_sets::AffineSets, conic_sets::ConicSets, opt)::CP
else
if opt.log_verbose
println("---------------------------------------------------------------------------------------")
println(" Failed to finds certificate - type 2")
println(" Failed to find certificate - type 2")
println("---------------------------------------------------------------------------------------")
end

Expand Down
54 changes: 36 additions & 18 deletions test/moi_randsdp.jl
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
function moi_randsdp(optimizer, seed, n, m; verbose = false, test = false, atol = 1e-2, scalar = false)
function moi_randsdp(optimizer, seed, n, m; verbose = false, test = false, atol = 1e-2, scalar = false, varbounds = true)

MOI.empty!(optimizer)
if test
Expand All @@ -24,6 +24,21 @@ function moi_randsdp(optimizer, seed, n, m; verbose = false, test = false, atol
MOI.VectorAffineFunction(MOI.VectorAffineTerm.([1], ctr_k), [-b[k]]), MOI.Zeros(1))
end
end
if varbounds
for k in 1:n
ctr_k = [MOI.ScalarAffineTerm(1.0, X[k])]
ctr_k_n = [MOI.ScalarAffineTerm(-1.0, X[k])]
if scalar
MOI.add_constraint(optimizer, MOI.ScalarAffineFunction(ctr_k, 0.0), MOI.GreaterThan(-10.0))
MOI.add_constraint(optimizer, MOI.ScalarAffineFunction(ctr_k, 0.0), MOI.LessThan(10.0))
else
MOI.add_constraint(optimizer,
MOI.VectorAffineFunction(MOI.VectorAffineTerm.([1], ctr_k_n), [-10.0]), MOI.Nonpositives(1))
MOI.add_constraint(optimizer,
MOI.VectorAffineFunction(MOI.VectorAffineTerm.([1], ctr_k), [-10.0]), MOI.Nonpositives(1))
end
end
end

vov = MOI.VectorOfVariables(X)
cX = MOI.add_constraint(optimizer, vov, MOI.PositiveSemidefiniteConeTriangle(n))
Expand All @@ -35,35 +50,38 @@ function moi_randsdp(optimizer, seed, n, m; verbose = false, test = false, atol

MOI.optimize!(optimizer)

objval = MOI.get(optimizer, MOI.ObjectiveValue())
status = 0
if MOI.get(optimizer, MOI.TerminationStatus()) == MOI.OPTIMAL
status = 1
end

objval = Inf
stime = -1.0
try
stime = MOI.get(optimizer, MOI.SolveTime())
catch
println("could not query time")
end
if status == 1
objval = MOI.get(optimizer, MOI.ObjectiveValue())

Xsq_s = MOI.get.(optimizer, MOI.VariablePrimal(), Xsq)
Xsq_s = MOI.get.(optimizer, MOI.VariablePrimal(), Xsq)

minus_rank = length([eig for eig in eigen(Xsq_s).values if eig < -1e-4])
if test
@test minus_rank == 0
end
# rank = length([eig for eig in eigen(XX).values if eig > 1e-10])
# @show rank
if test
@test tr(C * Xsq_s) - objval < atol
for i in 1:m
@test abs(tr(A[i] * Xsq_s)-b[i])/(1+abs(b[i])) < atol
minus_rank = length([eig for eig in eigen(Xsq_s).values if eig < -1e-4])
if test
@test minus_rank == 0
end
# rank = length([eig for eig in eigen(XX).values if eig > 1e-10])
# @show rank
if test
@test tr(C * Xsq_s) - objval < atol
for i in 1:m
@test abs(tr(A[i] * Xsq_s)-b[i])/(1+abs(b[i])) < atol
end
end
verbose && randsdp_eval(A,b,C,n,m,Xsq_s)
end
verbose && randsdp_eval(A,b,C,n,m,Xsq_s)

rank = -1
status = 0
if MOI.get(optimizer, MOI.TerminationStatus()) == MOI.OPTIMAL
status = 1
end
return (objval, stime, rank, status)
end
72 changes: 43 additions & 29 deletions test/moitest.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@ push!(Base.LOAD_PATH,joinpath(dirname(@__FILE__),"..",".."))

using ProxSDP, MathOptInterface, Test, LinearAlgebra, Random, SparseArrays, DelimitedFiles

using LinearAlgebra
LinearAlgebra.symmetric_type(::Type{MathOptInterface.VariableIndex}) = MathOptInterface.VariableIndex
LinearAlgebra.symmetric(v::MathOptInterface.VariableIndex, ::Symbol) = v
LinearAlgebra.transpose(v::MathOptInterface.VariableIndex) = v

const MOI = MathOptInterface
const MOIT = MOI.Test
const MOIB = MOI.Bridges
Expand All @@ -13,7 +18,15 @@ const optimizer = MOIU.CachingOptimizer(cache,
ProxSDP.Optimizer(
tol_gap = 1e-6, tol_feasibility= 1e-6,
# max_iter = 100_000,
time_limit = 10., #seconds
time_limit = 3., #seconds FAST
warn_on_limit = true,
# log_verbose = true, log_freq = 100000
))
const optimizer_slow = MOIU.CachingOptimizer(cache,
ProxSDP.Optimizer(
tol_gap = 1e-6, tol_feasibility= 1e-6,
# max_iter = 100_000,
time_limit = 30., #seconds
warn_on_limit = true,
# log_verbose = true, log_freq = 100000
))
Expand Down Expand Up @@ -53,6 +66,8 @@ end
@testset "Unit" begin
bridged = MOIB.full_bridge_optimizer(optimizer, Float64)
MOIT.unittest(bridged, config,[
# not supported attributes
"number_threads",
# Quadratic functions are not supported
"solve_qcp_edge_cases", "solve_qp_edge_cases",
# Integer and ZeroOne sets are not supported
Expand All @@ -62,17 +77,25 @@ end
"solve_zero_one_with_bounds_3",
# farkas proof
"solve_farkas_interval_upper",
"solve_farkas_interval_lower",
"solve_farkas_equalto_upper",
"solve_farkas_equalto_lower",
"solve_farkas_variable_lessthan_max",
# not supported attributes
"number_threads",
# ArgumentError: The number of constraints in SCSModel must be greater than 0
# "solve_unbounded_model", # takes very long becaus only stop by time limit
"solve_farkas_variable_lessthan",
"solve_farkas_lessthan",
"solve_farkas_greaterthan",
]
)
MOIT.solve_farkas_variable_lessthan_max(bridged, config)
MOIT.solve_farkas_interval_upper(bridged, config)
MOIT.solve_farkas_equalto_upper(bridged, config)
# TODO:
bridged_slow = MOIB.full_bridge_optimizer(optimizer_slow, Float64)
# MOIT.solve_farkas_interval_upper(bridged_slow, config)
# MOIT.solve_farkas_interval_lower(bridged, config)
# MOIT.solve_farkas_equalto_upper(bridged_slow, config)
# MOIT.solve_farkas_equalto_lower(bridged, config)
# MOIT.solve_farkas_variable_lessthan_max(bridged_slow, config)
MOIT.solve_farkas_variable_lessthan(bridged_slow, config)
# MOIT.solve_farkas_lessthan(bridged_slow, config)
# MOIT.solve_farkas_greaterthan(bridged, config)
end

@testset "MOI Continuous Linear" begin
Expand Down Expand Up @@ -117,11 +140,13 @@ end
# Evaluated: INFEASIBLE_OR_UNBOUNDED::TerminationStatusCode = 6 == OPTIMAL::TerminationStatusCode = 1
# "geomean2v", "geomean2f", , "rotatedsoc2", "psdt2",
# "normone2", "norminf2", "rotatedsoc2"#
# slow to find certificate
"normone2",
]
)
# # these fail due to infeasibility certificate not being disabled
# MOIT.norminf2test(MOIB.full_bridge_optimizer(optimizer, Float64), config_conic_nodual)
# MOIT.normone2test(MOIB.full_bridge_optimizer(optimizer, Float64), config_conic_nodual)
MOIT.normone2test(MOIB.full_bridge_optimizer(optimizer_slow, Float64), config_conic)
# # requires certificates always
# MOIT.rotatedsoc2test(MOIB.full_bridge_optimizer(optimizer, Float64), config_conic_nodual)
end
Expand Down Expand Up @@ -403,12 +428,6 @@ end

@testset "SDP with duplicates from MOI" begin

using MathOptInterface
# using SCS,ProxSDP
MOI = MathOptInterface
MOIU = MathOptInterface.Utilities
MOIB = MathOptInterface.Bridges

cache = MOIU.UniversalFallback(MOIU.Model{Float64}());
#optimizer0 = SCS.Optimizer(linear_solver=SCS.Direct, eps=1e-8);
optimizer0 = ProxSDP.Optimizer()#linear_solver=SCS.Direct, eps=1e-8);
Expand Down Expand Up @@ -481,11 +500,6 @@ end

end

using LinearAlgebra
LinearAlgebra.symmetric_type(::Type{MathOptInterface.VariableIndex}) = MathOptInterface.VariableIndex
LinearAlgebra.symmetric(v::MathOptInterface.VariableIndex, ::Symbol) = v
LinearAlgebra.transpose(v::MathOptInterface.VariableIndex) = v

@testset "MIMO Sizes" begin
include("base_mimo.jl")
include("moi_mimo.jl")
Expand All @@ -498,15 +512,15 @@ end

# hitting time limit
# probably infeasible/unbounded
@testset "RANDSDP Sizes" begin
include("base_randsdp.jl")
include("moi_randsdp.jl")
for n in 10:11, m in 10:11
@testset "RANDSDP n=$n, m=$m" begin
moi_randsdp(optimizer, 123, n, m, test = true, atol = 1e-1)
end
end
end
# @testset "RANDSDP Sizes" begin
# include("base_randsdp.jl")
# include("moi_randsdp.jl")
# for n in 10:11, m in 10:11
# @testset "RANDSDP n=$n, m=$m" begin
# moi_randsdp(optimizer, 123, n, m, test = true, atol = 1e-1)
# end
# end
# end

# This problems are too large for Travis
@testset "SDPLIB Sizes" begin
Expand Down