From a45df4703d4164734ad9636f69cc9084edc0bae6 Mon Sep 17 00:00:00 2001 From: Joaquim Dias Garcia Date: Fri, 18 Feb 2022 22:41:10 -0300 Subject: [PATCH 1/9] MOI 1.0 --- Project.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Project.toml b/Project.toml index 5774b2f..f59f80c 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "ProxSDP" uuid = "65e78d25-6039-50a4-9445-38022e3d2eb3" repo = "https://github.com/mariohsouto/ProxSDP.jl.git" -version = "1.7.0" +version = "1.8.0" [deps] Arpack = "7d9fca2a-8960-54d3-9f78-7d1dccf2cb97" @@ -15,10 +15,10 @@ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" [compat] -julia = "1" +julia = "1.6" Arpack = "0.3.2, 0.5.1" KrylovKit = "0.5.2" -MathOptInterface = "0.10.6" +MathOptInterface = "1" TimerOutputs = "0.5.0" [extras] From 0434830e41d8e78dc04e3b119b4aa8860126c5ee Mon Sep 17 00:00:00 2001 From: joaquim Date: Wed, 2 Mar 2022 00:34:48 -0300 Subject: [PATCH 2/9] cleanup moi tests --- test/moi_proxsdp_unit.jl | 4 +- test/moitest.jl | 108 --------------------------------------- 2 files changed, 3 insertions(+), 109 deletions(-) diff --git a/test/moi_proxsdp_unit.jl b/test/moi_proxsdp_unit.jl index 876a09f..7db9184 100644 --- a/test/moi_proxsdp_unit.jl +++ b/test/moi_proxsdp_unit.jl @@ -359,4 +359,6 @@ lp_in_SDP_inequality_form(optimizer) sdp_from_moi(optimizer) double_sdp_from_moi(optimizer) double_sdp_with_duplicates(optimizer) -sdp_wiki(optimizer) \ No newline at end of file +sdp_wiki(optimizer) +sdp_wiki(optimizer_full) +sdp_wiki(optimizer_print) \ No newline at end of file diff --git a/test/moitest.jl b/test/moitest.jl index a5f6aba..57feefe 100644 --- a/test/moitest.jl +++ b/test/moitest.jl @@ -9,7 +9,6 @@ import SparseArrays import DelimitedFiles const MOI = MathOptInterface -const MOIT = MOI.DeprecatedTest const MOIB = MOI.Bridges const MOIU = MOI.Utilities @@ -51,8 +50,6 @@ const optimizer_lowacc_arpack = MOIU.CachingOptimizer(cache, ProxSDP.Optimizer(eigsolver = 1, tol_gap = 1e-3, tol_feasibility = 1e-3, log_verbose = false)) const optimizer_lowacc_krylovkit = MOIU.CachingOptimizer(cache, ProxSDP.Optimizer(eigsolver = 2, tol_gap = 1e-3, tol_feasibility = 1e-3, log_verbose = false)) -const config = MOIT.Config{Float64}(atol=1e-3, rtol=1e-3, infeas_certificates = true) -const config_conic = MOIT.Config{Float64}(atol=1e-3, rtol=1e-3, duals = true, infeas_certificates = true) @testset "SolverName" begin @test MOI.get(optimizer, MOI.SolverName()) == "ProxSDP" @@ -102,8 +99,6 @@ function test_runtests() # see: https://github.com/jump-dev/MathOptInterface.jl/issues/1665 "test_model_UpperBoundAlreadySet", "test_model_LowerBoundAlreadySet", - # # TODO(joaquimg): good catch, but very pathological - # "test_objective_ObjectiveFunction_blank", # poorly scaled problem (solved bellow with higher accuracy) "test_linear_add_constraints", ], @@ -138,98 +133,6 @@ end test_runtests() end -@testset "Old MOI 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 - "solve_integer_edge_cases", "solve_objbound_edge_cases", - "solve_zero_one_with_bounds_1", - "solve_zero_one_with_bounds_2", - "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", - "solve_farkas_variable_lessthan", - "solve_farkas_lessthan", - "solve_farkas_greaterthan", - ] - ) - # 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 - bridged = MOIB.full_bridge_optimizer(optimizer, Float64) - # MOIT.linear8atest(MOIB.full_bridge_optimizer(optimizer_high_acc, Float64), config) - # MOIT.linear8btest(MOIB.full_bridge_optimizer(optimizer_high_acc, Float64), config) - # MOIT.linear8ctest(MOIB.full_bridge_optimizer(optimizer_high_acc, Float64), config) - # MOIT.linear12test(MOIB.full_bridge_optimizer(optimizer_high_acc, Float64), config) - MOIT.contlineartest(bridged, config, [ - # infeasible/unbounded - "linear8a", - #"linear8b", "linear8c", "linear12", - # poorly conditioned - "linear5", - "linear9", - "linear10", - # primalstart not accepted - "partial_start", - # certificate - "linear12", - ] - ) - MOIT.linear8atest(MOIB.full_bridge_optimizer(optimizer_high_acc, Float64), config) - MOIT.linear5test(MOIB.full_bridge_optimizer(optimizer_high_acc, Float64), config) - MOIT.linear9test(MOIB.full_bridge_optimizer(optimizer_high_acc, Float64), config) - MOIT.linear10test(MOIB.full_bridge_optimizer(optimizer_high_acc, Float64), config) - MOIT.linear12test(MOIB.full_bridge_optimizer(optimizer_high_acc, Float64), config) -end - -@testset "MOI Continuous Conic" begin - MOIT.contconictest(MOIB.full_bridge_optimizer(optimizer, Float64), config_conic, [ - # bridge: some problem with square psd - "rootdets", - # exp cone - "logdet", "exp", "dualexp", - # pow cone - "pow","dualpow", - # other cones - "relentr", - # infeasible/unbounded - # "lin3", "lin4", - # See https://travis-ci.com/blegat/SolverTests/jobs/268551133 - # geomean2v: Test Failed at /home/travis/.julia/dev/MathOptInterface/src/Test/contconic.jl:1328 - # Expression: MOI.get(model, MOI.TerminationStatus()) == config.optimal_status - # Evaluated: INFEASIBLE_OR_UNBOUNDED::TerminationStatusCode = 6 == OPTIMAL::TerminationStatusCode = 1 - # "geomean2v", "geomean2f", , "rotatedsoc2", "psdt2", - # "normone2", "norminf2", "rotatedsoc2"# - # slow to find certificate - "normone2", - "norminf2", # new - ] - ) - # # 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_slow, Float64), config_conic) - # # requires certificates always - # MOIT.rotatedsoc2test(MOIB.full_bridge_optimizer(optimizer, Float64), config_conic_nodual) -end - @testset "ProxSDP MOI Units tests" begin include("moi_proxsdp_unit.jl") end @@ -288,17 +191,6 @@ end end end -@testset "Full eig" begin - MOIT.psdt0vtest( - MOIB.full_bridge_optimizer(optimizer_full, Float64), - MOIT.Config{Float64}(atol=1e-3, rtol=1e-3, duals = false) - ) -end - -@testset "Print" begin - MOIT.linear15test(optimizer_print, MOIT.Config{Float64}(atol=1e-3, rtol=1e-3)) -end - @testset "Unsupported argument" begin MOI.empty!(cache) @test_throws ErrorException optimizer_unsupportedarg = MOIU.CachingOptimizer(cache, ProxSDP.Optimizer(unsupportedarg = 10)) From 3927cd6646d080222311af87e387e8f3e3e2869e Mon Sep 17 00:00:00 2001 From: joaquim Date: Wed, 2 Mar 2022 00:42:44 -0300 Subject: [PATCH 3/9] fix version --- src/MOI_wrapper.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MOI_wrapper.jl b/src/MOI_wrapper.jl index 892e86e..9ff9565 100644 --- a/src/MOI_wrapper.jl +++ b/src/MOI_wrapper.jl @@ -81,7 +81,7 @@ end MOI.get(::Optimizer, ::MOI.SolverName) = "ProxSDP" -MOI.get(::Optimizer, ::MOI.SolverVersion) = "1.7.0" +MOI.get(::Optimizer, ::MOI.SolverVersion) = "1.8.0" function MOI.set(optimizer::Optimizer, param::MOI.RawOptimizerAttribute, value) fields = fieldnames(Options) From 2fe2da5a8d2a15392e610f51f79a5fb2eb4ceac6 Mon Sep 17 00:00:00 2001 From: joaquim Date: Wed, 2 Mar 2022 01:23:15 -0300 Subject: [PATCH 4/9] cleanup --- test/moi_proxsdp_unit.jl | 11 ----- test/moitest.jl | 78 +++++++++++++++------------------- test/test_terminationstatus.jl | 23 +++++----- 3 files changed, 48 insertions(+), 64 deletions(-) diff --git a/test/moi_proxsdp_unit.jl b/test/moi_proxsdp_unit.jl index 7db9184..45eb600 100644 --- a/test/moi_proxsdp_unit.jl +++ b/test/moi_proxsdp_unit.jl @@ -275,17 +275,6 @@ end function double_sdp_with_duplicates(optimizer) - cache = MOIU.UniversalFallback(MOIU.Model{Float64}()); - optimizer0 = ProxSDP.Optimizer( - log_verbose = true, - log_freq = 10, - check_dual_feas = true, - check_dual_feas_freq = 10, - ) - MOI.empty!(cache); - optimizer1 = MOIU.CachingOptimizer(cache, optimizer0); - optimizer = MOIB.full_bridge_optimizer(optimizer1, Float64); - MOI.empty!(optimizer) x = MOI.add_variable(optimizer) diff --git a/test/moitest.jl b/test/moitest.jl index 57feefe..b380dcc 100644 --- a/test/moitest.jl +++ b/test/moitest.jl @@ -12,44 +12,42 @@ const MOI = MathOptInterface const MOIB = MOI.Bridges const MOIU = MOI.Utilities -const cache = MOIU.UniversalFallback(MOIU.Model{Float64}()) - -const optimizer = MOIU.CachingOptimizer(cache, - ProxSDP.Optimizer( +const optimizer = MOI.instantiate( + ()->ProxSDP.Optimizer( tol_gap = 1e-6, tol_feasibility= 1e-6, # max_iter = 100_000, time_limit = 3., #seconds FAST warn_on_limit = true, # log_verbose = true, log_freq = 100000 )) -const optimizer_slow = MOIU.CachingOptimizer(cache, - ProxSDP.Optimizer( +const optimizer_slow = MOI.instantiate( + ()->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 )) -const optimizer_high_acc = MOIU.CachingOptimizer(cache, - ProxSDP.Optimizer( +const optimizer_high_acc = MOI.instantiate( + ()->ProxSDP.Optimizer( tol_primal = 1e-7, tol_dual = 1e-7, tol_gap = 1e-7, tol_feasibility = 1e-7, # log_verbose = true, log_freq = 1000 )) -const optimizer_low_acc = MOIU.CachingOptimizer(cache, - ProxSDP.Optimizer( +const optimizer_low_acc = MOI.instantiate( + ()->ProxSDP.Optimizer( tol_gap = 1e-3, tol_feasibility = 1e-3, # log_verbose = true, log_freq = 1000 )) -const optimizer_full = MOIU.CachingOptimizer(cache, - ProxSDP.Optimizer(full_eig_decomp = true, tol_gap = 1e-4, tol_feasibility = 1e-4)) -const optimizer_print = MOIU.CachingOptimizer(cache, - ProxSDP.Optimizer(log_freq = 10, log_verbose = true, timer_verbose = true, extended_log = true, extended_log2 = true, +const optimizer_full = MOI.instantiate( + ()->ProxSDP.Optimizer(full_eig_decomp = true, tol_gap = 1e-4, tol_feasibility = 1e-4)) +const optimizer_print = MOI.instantiate( + ()->ProxSDP.Optimizer(log_freq = 10, log_verbose = true, timer_verbose = true, extended_log = true, extended_log2 = true, tol_gap = 1e-4, tol_feasibility = 1e-4)) -const optimizer_lowacc_arpack = MOIU.CachingOptimizer(cache, - ProxSDP.Optimizer(eigsolver = 1, tol_gap = 1e-3, tol_feasibility = 1e-3, log_verbose = false)) -const optimizer_lowacc_krylovkit = MOIU.CachingOptimizer(cache, - ProxSDP.Optimizer(eigsolver = 2, tol_gap = 1e-3, tol_feasibility = 1e-3, log_verbose = false)) +const optimizer_lowacc_arpack = MOI.instantiate( + ()->ProxSDP.Optimizer(eigsolver = 1, tol_gap = 1e-3, tol_feasibility = 1e-3, log_verbose = false)) +const optimizer_lowacc_krylovkit = MOI.instantiate( + ()->ProxSDP.Optimizer(eigsolver = 2, tol_gap = 1e-3, tol_feasibility = 1e-3, log_verbose = false)) @testset "SolverName" begin @test MOI.get(optimizer, MOI.SolverName()) == "ProxSDP" @@ -82,42 +80,37 @@ function test_runtests() warn_on_limit = true, # log_verbose = true, log_freq = 100000 ) - MOI.set(opt, MOI.Silent(), true) - model = MOI.Bridges.full_bridge_optimizer( - MOI.Utilities.CachingOptimizer( - MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), - opt, - ), - Float64, - ) + model = MOI.instantiate(()->opt, with_bridge_type = Float64) + MOI.set(model, MOI.Silent(), true) + MOI.Test.runtests( model, config, exclude = String[ - # unexpected failure. But this is probably in the bridge - # layer, not ProxSDP. + # Not ProxSDP fail. # see: https://github.com/jump-dev/MathOptInterface.jl/issues/1665 "test_model_UpperBoundAlreadySet", "test_model_LowerBoundAlreadySet", # poorly scaled problem (solved bellow with higher accuracy) "test_linear_add_constraints", + # time limit hit + "test_solve_DualStatus_INFEASIBILITY_CERTIFICATE_VariableIndex_LessThan_max", ], ) - opt = ProxSDP.Optimizer( - tol_primal = 1e-7, tol_dual = 1e-7, - tol_gap = 1e-7, tol_feasibility = 1e-7, - time_limit = 5.0, - warn_on_limit = true, - ) - MOI.set(opt, MOI.Silent(), true) - model = MOI.Bridges.full_bridge_optimizer( - MOI.Utilities.CachingOptimizer( - MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), - opt, - ), - Float64, + MOI.set(model, MOI.RawOptimizerAttribute("time_limit"), 5.0) + MOI.empty!(model) + MOI.Test.test_solve_DualStatus_INFEASIBILITY_CERTIFICATE_VariableIndex_LessThan_max( + model, + config, ) + + MOI.set(model, MOI.RawOptimizerAttribute("tol_primal"), 1e-7) + MOI.set(model, MOI.RawOptimizerAttribute("tol_dual"), 1e-7) + MOI.set(model, MOI.RawOptimizerAttribute("tol_gap"), 1e-7) + MOI.set(model, MOI.RawOptimizerAttribute("tol_feasibility"), 1e-7) + + MOI.set(model, MOI.Silent(), true) MOI.empty!(model) MOI.Test.test_linear_add_constraints( model, @@ -192,8 +185,7 @@ end end @testset "Unsupported argument" begin - MOI.empty!(cache) - @test_throws ErrorException optimizer_unsupportedarg = MOIU.CachingOptimizer(cache, ProxSDP.Optimizer(unsupportedarg = 10)) + @test_throws ErrorException optimizer_unsupportedarg = ProxSDP.Optimizer(unsupportedarg = 10) # @test_throws ErrorException MOI.optimize!(optimizer_unsupportedarg) end diff --git a/test/test_terminationstatus.jl b/test/test_terminationstatus.jl index 29b495d..05c7d06 100644 --- a/test/test_terminationstatus.jl +++ b/test/test_terminationstatus.jl @@ -1,5 +1,4 @@ -function build_simple_lp!(pre_opt::MOIU.CachingOptimizer) - optim = MOIB.full_bridge_optimizer(pre_opt, Float64) +function build_simple_lp!(pre_opt) MOI.empty!(optim) @test MOI.is_empty(optim) @@ -38,8 +37,12 @@ function build_simple_lp!(pre_opt::MOIU.CachingOptimizer) MOI.set(optim, MOI.ObjectiveSense(), MOI.MIN_SENSE) end -const optimizer_maxiter = MOIU.CachingOptimizer(cache, ProxSDP.Optimizer(max_iter = 1, log_verbose = false)) -const optimizer_timelimit = MOIU.CachingOptimizer(cache, ProxSDP.Optimizer(time_limit = 0.0001, log_verbose = false)) +const optimizer_maxiter = MOI.instantiate( + ProxSDP.Optimizer(max_iter = 1, log_verbose = false), + with_bridge_type = Float64) +const optimizer_timelimit = MOI.instantiate( + ProxSDP.Optimizer(time_limit = 0.0001, log_verbose = false), + with_bridge_type = Float64) @testset "MOI status" begin @testset "MOI.OPTIMAL" begin @@ -56,10 +59,10 @@ const optimizer_timelimit = MOIU.CachingOptimizer(cache, ProxSDP.Optimizer(time_ MOI.empty!(optimizer_maxiter) end - # @testset "MOI.TIME_LIMIT" begin - # build_simple_lp!(optimizer_timelimit) - # MOI.optimize!(optimizer_timelimit) - # @test MOI.get(optimizer_timelimit, MOI.TerminationStatus()) == MOI.TIME_LIMIT - # MOI.empty!(optimizer_timelimit) - # end + @testset "MOI.TIME_LIMIT" begin + build_simple_lp!(optimizer_timelimit) + MOI.optimize!(optimizer_timelimit) + @test MOI.get(optimizer_timelimit, MOI.TerminationStatus()) == MOI.TIME_LIMIT + MOI.empty!(optimizer_timelimit) + end end \ No newline at end of file From b37314e8fdf7e18fe099bf76fe269f7265fa0134 Mon Sep 17 00:00:00 2001 From: joaquim Date: Wed, 2 Mar 2022 02:09:46 -0300 Subject: [PATCH 5/9] more cleanup --- src/MOI_wrapper.jl | 2 ++ test/moi_proxsdp_unit.jl | 46 +++++++++++++++++++----------- test/moitest.jl | 51 +++++++++------------------------- test/test_terminationstatus.jl | 14 +++++----- 4 files changed, 52 insertions(+), 61 deletions(-) diff --git a/src/MOI_wrapper.jl b/src/MOI_wrapper.jl index 9ff9565..f8a04ae 100644 --- a/src/MOI_wrapper.jl +++ b/src/MOI_wrapper.jl @@ -353,6 +353,8 @@ function MOI.optimize!(dest::Optimizer, src::MOI.ModelLike) return index_map, false end +MOI.supports_incremental_interface(::Optimizer) = false + #= Attributes =# diff --git a/test/moi_proxsdp_unit.jl b/test/moi_proxsdp_unit.jl index 45eb600..271f0cb 100644 --- a/test/moi_proxsdp_unit.jl +++ b/test/moi_proxsdp_unit.jl @@ -1,6 +1,5 @@ -function simple_lp(optimizer) +function simple_lp(bridged) - bridged = MOIB.full_bridge_optimizer(optimizer, Float64) MOI.empty!(bridged) @test MOI.is_empty(bridged) @@ -49,9 +48,8 @@ function simple_lp(optimizer) end -function simple_lp_2_1d_sdp(optimizer) +function simple_lp_2_1d_sdp(bridged) - bridged = MOIB.full_bridge_optimizer(optimizer, Float64) MOI.empty!(bridged) @test MOI.is_empty(bridged) @@ -96,9 +94,8 @@ function simple_lp_2_1d_sdp(optimizer) end -function lp_in_SDP_equality_form(optimizer) +function lp_in_SDP_equality_form(bridged) - bridged = MOIB.full_bridge_optimizer(optimizer, Float64) MOI.empty!(bridged) @test MOI.is_empty(bridged) @@ -341,13 +338,30 @@ function sdp_wiki(optimizer) end -simple_lp(optimizer) -simple_lp_2_1d_sdp(optimizer) -lp_in_SDP_equality_form(optimizer) -lp_in_SDP_inequality_form(optimizer) -sdp_from_moi(optimizer) -double_sdp_from_moi(optimizer) -double_sdp_with_duplicates(optimizer) -sdp_wiki(optimizer) -sdp_wiki(optimizer_full) -sdp_wiki(optimizer_print) \ No newline at end of file +simple_lp(optimizer_bridged) +simple_lp_2_1d_sdp(optimizer_bridged) +lp_in_SDP_equality_form(optimizer_bridged) +lp_in_SDP_inequality_form(optimizer_bridged) +sdp_from_moi(optimizer_bridged) +double_sdp_from_moi(optimizer_bridged) +double_sdp_with_duplicates(optimizer_bridged) +sdp_wiki(optimizer_bridged) + +# print test +const optimizer_print = MOI.instantiate( + ()->ProxSDP.Optimizer( + log_freq = 10, log_verbose = true, timer_verbose = true, extended_log = true, extended_log2 = true, + tol_gap = 1e-4, tol_feasibility = 1e-4), + with_bridge_type = Float64) +sdp_wiki(optimizer_print) + +# eig solvers +default_solver = MOI.get(optimizer_bridged, MOI.RawOptimizerAttribute("eigsolver")) +MOI.set(optimizer_bridged, MOI.RawOptimizerAttribute("eigsolver"), 1) +sdp_wiki(optimizer_bridged) +MOI.set(optimizer_bridged, MOI.RawOptimizerAttribute("eigsolver"), 2) +sdp_wiki(optimizer_bridged) +MOI.set(optimizer_bridged, MOI.RawOptimizerAttribute("eigsolver"), default_solver) +MOI.set(optimizer_bridged, MOI.RawOptimizerAttribute("full_eig_decomp"), true) +sdp_wiki(optimizer_bridged) +MOI.set(optimizer_bridged, MOI.RawOptimizerAttribute("full_eig_decomp"), false) diff --git a/test/moitest.jl b/test/moitest.jl index b380dcc..9520064 100644 --- a/test/moitest.jl +++ b/test/moitest.jl @@ -12,50 +12,23 @@ const MOI = MathOptInterface const MOIB = MOI.Bridges const MOIU = MOI.Utilities -const optimizer = MOI.instantiate( +const optimizer_bridged = MOI.instantiate( ()->ProxSDP.Optimizer( tol_gap = 1e-6, tol_feasibility= 1e-6, # max_iter = 100_000, time_limit = 3., #seconds FAST warn_on_limit = true, # log_verbose = true, log_freq = 100000 - )) -const optimizer_slow = MOI.instantiate( - ()->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 - )) -const optimizer_high_acc = MOI.instantiate( - ()->ProxSDP.Optimizer( - tol_primal = 1e-7, tol_dual = 1e-7, - tol_gap = 1e-7, tol_feasibility = 1e-7, - # log_verbose = true, log_freq = 1000 - )) -const optimizer_low_acc = MOI.instantiate( - ()->ProxSDP.Optimizer( - tol_gap = 1e-3, tol_feasibility = 1e-3, - # log_verbose = true, log_freq = 1000 - )) -const optimizer_full = MOI.instantiate( - ()->ProxSDP.Optimizer(full_eig_decomp = true, tol_gap = 1e-4, tol_feasibility = 1e-4)) -const optimizer_print = MOI.instantiate( - ()->ProxSDP.Optimizer(log_freq = 10, log_verbose = true, timer_verbose = true, extended_log = true, extended_log2 = true, - tol_gap = 1e-4, tol_feasibility = 1e-4)) -const optimizer_lowacc_arpack = MOI.instantiate( - ()->ProxSDP.Optimizer(eigsolver = 1, tol_gap = 1e-3, tol_feasibility = 1e-3, log_verbose = false)) -const optimizer_lowacc_krylovkit = MOI.instantiate( - ()->ProxSDP.Optimizer(eigsolver = 2, tol_gap = 1e-3, tol_feasibility = 1e-3, log_verbose = false)) + ), + with_bridge_type = Float64) @testset "SolverName" begin - @test MOI.get(optimizer, MOI.SolverName()) == "ProxSDP" + @test MOI.get(optimizer_bridged, MOI.SolverName()) == "ProxSDP" end @testset "SolverVersion" begin ver = readlines(joinpath(@__DIR__, "..", "Project.toml"))[4][12:16] - @test MOI.get(optimizer, MOI.SolverVersion()) == ver + @test MOI.get(optimizer_bridged, MOI.SolverVersion()) == ver end function test_runtests() @@ -135,7 +108,7 @@ end include("moi_mimo.jl") for i in 2:5 @testset "MIMO n = $(i)" begin - moi_mimo(optimizer, 123, i, test = true) + moi_mimo(optimizer_bridged, 123, i, test = true) end end end @@ -153,6 +126,12 @@ end # end # This problems are too large for Travis +opt_low_acc = ProxSDP.Optimizer( + tol_gap = 1e-3, tol_feasibility = 1e-3, + # log_verbose = true, log_freq = 1000 + ) +cache = MOI.default_cache(opt_low_acc, Float64) +optimizer_low_acc = MOI.Utilities.CachingOptimizer(cache, opt_low_acc) @testset "SDPLIB Sizes" begin datapath = joinpath(dirname(@__FILE__), "data") include("base_sdplib.jl") @@ -161,15 +140,11 @@ end # badly conditioned # moi_sdplib(optimizer_low_acc, joinpath(datapath, "gpp124-1.dat-s"), test = true) moi_sdplib(optimizer_low_acc, joinpath(datapath, "gpp124-2.dat-s"), test = true) - moi_sdplib(optimizer_lowacc_arpack, joinpath(datapath, "gpp124-2.dat-s"), test = true) - moi_sdplib(optimizer_lowacc_krylovkit, joinpath(datapath, "gpp124-2.dat-s"), test = true) # moi_sdplib(optimizer, joinpath(datapath, "gpp124-3.dat-s"), test = true) # moi_sdplib(optimizer, joinpath(datapath, "gpp124-4.dat-s"), test = true) end @testset "MAX CUT" begin moi_sdplib(optimizer_low_acc, joinpath(datapath, "mcp124-1.dat-s"), test = true) - moi_sdplib(optimizer_lowacc_arpack, joinpath(datapath, "mcp124-1.dat-s"), test = true) - moi_sdplib(optimizer_lowacc_krylovkit, joinpath(datapath, "mcp124-1.dat-s"), test = true) # moi_sdplib(optimizer, joinpath(datapath, "mcp124-2.dat-s"), test = true) # moi_sdplib(optimizer, joinpath(datapath, "mcp124-3.dat-s"), test = true) # moi_sdplib(optimizer, joinpath(datapath, "mcp124-4.dat-s"), test = true) @@ -180,7 +155,7 @@ end include("base_sensorloc.jl") include("moi_sensorloc.jl") for n in 5:5:10 - moi_sensorloc(optimizer, 0, n, test = true) + moi_sensorloc(optimizer_bridged, 0, n, test = true) end end diff --git a/test/test_terminationstatus.jl b/test/test_terminationstatus.jl index 05c7d06..61b3aba 100644 --- a/test/test_terminationstatus.jl +++ b/test/test_terminationstatus.jl @@ -1,4 +1,4 @@ -function build_simple_lp!(pre_opt) +function build_simple_lp!(optim) MOI.empty!(optim) @test MOI.is_empty(optim) @@ -38,18 +38,18 @@ function build_simple_lp!(pre_opt) end const optimizer_maxiter = MOI.instantiate( - ProxSDP.Optimizer(max_iter = 1, log_verbose = false), + ()->ProxSDP.Optimizer(max_iter = 1, log_verbose = false), with_bridge_type = Float64) const optimizer_timelimit = MOI.instantiate( - ProxSDP.Optimizer(time_limit = 0.0001, log_verbose = false), + ()->ProxSDP.Optimizer(time_limit = 0.0, log_verbose = false), with_bridge_type = Float64) @testset "MOI status" begin @testset "MOI.OPTIMAL" begin - build_simple_lp!(optimizer) - MOI.optimize!(optimizer) - @test MOI.get(optimizer, MOI.TerminationStatus()) == MOI.OPTIMAL - MOI.empty!(optimizer) + build_simple_lp!(optimizer_bridged) + MOI.optimize!(optimizer_bridged) + @test MOI.get(optimizer_bridged, MOI.TerminationStatus()) == MOI.OPTIMAL + MOI.empty!(optimizer_bridged) end @testset "MOI.ITERATION_LIMIT" begin From 6be7424b2942acaf43492ed94ba494796b343f4d Mon Sep 17 00:00:00 2001 From: joaquim Date: Wed, 2 Mar 2022 04:55:42 -0300 Subject: [PATCH 6/9] fix time limit test --- test/test_terminationstatus.jl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/test_terminationstatus.jl b/test/test_terminationstatus.jl index 61b3aba..44dc7ae 100644 --- a/test/test_terminationstatus.jl +++ b/test/test_terminationstatus.jl @@ -41,7 +41,9 @@ const optimizer_maxiter = MOI.instantiate( ()->ProxSDP.Optimizer(max_iter = 1, log_verbose = false), with_bridge_type = Float64) const optimizer_timelimit = MOI.instantiate( - ()->ProxSDP.Optimizer(time_limit = 0.0, log_verbose = false), + ()->ProxSDP.Optimizer( + tol_gap = 1e-16, tol_feasibility= 1e-16, + time_limit = 0.0, log_verbose = false), with_bridge_type = Float64) @testset "MOI status" begin From e3e7a80b74493aceebed72cb9af3ec666dcd02a3 Mon Sep 17 00:00:00 2001 From: joaquim Date: Wed, 2 Mar 2022 05:05:09 -0300 Subject: [PATCH 7/9] test eigsolvers --- test/moi_proxsdp_unit.jl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/moi_proxsdp_unit.jl b/test/moi_proxsdp_unit.jl index 271f0cb..3944a62 100644 --- a/test/moi_proxsdp_unit.jl +++ b/test/moi_proxsdp_unit.jl @@ -357,10 +357,13 @@ sdp_wiki(optimizer_print) # eig solvers default_solver = MOI.get(optimizer_bridged, MOI.RawOptimizerAttribute("eigsolver")) +min_size_krylov_eigs = MOI.get(optimizer_bridged, MOI.RawOptimizerAttribute("min_size_krylov_eigs")) MOI.set(optimizer_bridged, MOI.RawOptimizerAttribute("eigsolver"), 1) +MOI.set(optimizer_bridged, MOI.RawOptimizerAttribute("min_size_krylov_eigs"), 1) sdp_wiki(optimizer_bridged) MOI.set(optimizer_bridged, MOI.RawOptimizerAttribute("eigsolver"), 2) sdp_wiki(optimizer_bridged) +MOI.set(optimizer_bridged, MOI.RawOptimizerAttribute("min_size_krylov_eigs"), min_size_krylov_eigs) MOI.set(optimizer_bridged, MOI.RawOptimizerAttribute("eigsolver"), default_solver) MOI.set(optimizer_bridged, MOI.RawOptimizerAttribute("full_eig_decomp"), true) sdp_wiki(optimizer_bridged) From 897c333371c92167fc53e2a87c137c237fa23deb Mon Sep 17 00:00:00 2001 From: joaquim Date: Wed, 2 Mar 2022 05:25:52 -0300 Subject: [PATCH 8/9] more time limit --- src/pdhg.jl | 4 ++-- test/test_terminationstatus.jl | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/pdhg.jl b/src/pdhg.jl index 6e8a446..2b115b4 100644 --- a/src/pdhg.jl +++ b/src/pdhg.jl @@ -332,7 +332,7 @@ function chambolle_pock( end # max_iter or time limit stop condition - if p.iter >= opt.max_iter_local || time() - p.time0 > opt.time_limit + if p.iter >= opt.max_iter_local || time() - p.time0 >= opt.time_limit if p.iter > opt.min_iter_time_infeas && max_abs_diff(residuals.dual_gap) < opt.infeas_stable_gap_tol && residuals.dual_gap[k] > opt.infeas_limit_gap_tol # low gap but far from zero, say 10% @@ -376,7 +376,7 @@ function chambolle_pock( println(" WARNING: Time limit hit.") end end - if p.iter >= opt.max_iter_local || time() - p.time0 > opt.time_limit + if p.iter >= opt.max_iter_local || time() - p.time0 >= opt.time_limit break end end diff --git a/test/test_terminationstatus.jl b/test/test_terminationstatus.jl index 44dc7ae..b989ee3 100644 --- a/test/test_terminationstatus.jl +++ b/test/test_terminationstatus.jl @@ -42,8 +42,11 @@ const optimizer_maxiter = MOI.instantiate( with_bridge_type = Float64) const optimizer_timelimit = MOI.instantiate( ()->ProxSDP.Optimizer( - tol_gap = 1e-16, tol_feasibility= 1e-16, - time_limit = 0.0, log_verbose = false), + tol_gap = 1e-16, tol_feasibility = 1e-16, + tol_primal = 1e-16, tol_dual = 1e-16, + tol_feasibility_dual = 1e-16, tol_psd = 1e-16, + time_limit = 0.0, check_dual_feas = false, + check_dual_feas_freq = 1), with_bridge_type = Float64) @testset "MOI status" begin From aabdf9084bb2b1c1cc2dc450acbd5904385f06f5 Mon Sep 17 00:00:00 2001 From: joaquim Date: Wed, 2 Mar 2022 05:39:52 -0300 Subject: [PATCH 9/9] inf fail --- test/moitest.jl | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/moitest.jl b/test/moitest.jl index 9520064..7e009f1 100644 --- a/test/moitest.jl +++ b/test/moitest.jl @@ -67,6 +67,7 @@ function test_runtests() # poorly scaled problem (solved bellow with higher accuracy) "test_linear_add_constraints", # time limit hit + "test_linear_INFEASIBLE", "test_solve_DualStatus_INFEASIBILITY_CERTIFICATE_VariableIndex_LessThan_max", ], ) @@ -77,6 +78,11 @@ function test_runtests() model, config, ) + MOI.empty!(model) + MOI.Test.test_linear_INFEASIBLE( + model, + config, + ) MOI.set(model, MOI.RawOptimizerAttribute("tol_primal"), 1e-7) MOI.set(model, MOI.RawOptimizerAttribute("tol_dual"), 1e-7)