Skip to content

Commit 9b05d55

Browse files
authored
Switch to using a mosek.lic file in GitHub actions (#216)
1 parent 080e215 commit 9b05d55

2 files changed

Lines changed: 60 additions & 66 deletions

File tree

.github/workflows/ci.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,16 @@ jobs:
1717
steps:
1818
- name: Install xmllint
1919
run: sudo apt-get install -y curl
20-
- uses: actions/checkout@v4
20+
- uses: actions/checkout@v6
2121
- uses: julia-actions/setup-julia@v2
2222
with:
2323
version: ${{ matrix.version }}
2424
arch: ${{ matrix.arch }}
25-
- uses: julia-actions/cache@v2
25+
- uses: julia-actions/cache@v3
2626
- uses: julia-actions/julia-buildpkg@v1
2727
- uses: julia-actions/julia-runtest@v1
28+
env:
29+
MOSEKLM_LICENSE_FILE: ${{ secrets.MOSEK_LICENSE }}
2830
with:
2931
depwarn: error
3032
- uses: julia-actions/julia-processcoverage@v1

test/runtests.jl

Lines changed: 56 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -10,69 +10,35 @@ using Test
1010

1111
import MathOptInterface as MOI
1212

13-
const _MOSEK_API_COUNTER = Ref{Int}(0)
14-
1513
if isdefined(MOI.Test, :_error_handler)
1614
@eval function MOI.Test._error_handler(
1715
err::Mosek.MosekError,
1816
name::String,
1917
warn_unsupported::Bool,
2018
)
21-
if Mosek.Rescode(err.rcode) == Mosek.MSK_RES_ERR_SERVER_STATUS
22-
_MOSEK_API_COUNTER[] += 1
23-
return # Server returned non-ok HTTP status code
24-
elseif Mosek.Rescode(err.rcode) == Mosek.MSK_RES_ERR_CONE_OVERLAP_APPEND
19+
if Mosek.Rescode(err.rcode) == Mosek.MSK_RES_ERR_CONE_OVERLAP_APPEND
2520
return # Mosek doesn't support this problem formulation
2621
end
2722
return rethrow(err)
2823
end
2924
end
3025

31-
_is_intermittent(::Any) = false
32-
function _is_intermittent(err::Mosek.MosekError)
33-
return Mosek.Rescode(err.rcode) == Mosek.MSK_RES_ERR_SERVER_STATUS
34-
end
35-
3626
function runtests()
37-
_MOSEK_API_COUNTER[] = 0
38-
for name in names(@__MODULE__; all = true)
39-
if startswith("$name", "test_")
40-
@testset "$name" begin
41-
try
42-
getfield(@__MODULE__, name)()
43-
catch err
44-
if _is_intermittent(err) # A flakey failure. Retry once.
45-
getfield(@__MODULE__, name)()
46-
else
47-
rethrow(err)
48-
end
49-
end
50-
end
51-
end
27+
is_test(name) = startswith("$name", "test_")
28+
@testset "$name" for name in filter(is_test, names(@__MODULE__; all = true))
29+
getfield(@__MODULE__, name)()
5230
end
53-
# Test that there are less than 5 API call failures during a test run
54-
@test _MOSEK_API_COUNTER[] < 5
5531
return
5632
end
5733

58-
function MosekOptimizerWithFallback()
59-
optimizer = Mosek.Optimizer()
60-
MOI.set(
61-
optimizer,
62-
MOI.RawOptimizerAttribute("fallback"),
63-
"mosek://solve.mosek.com:30080",
64-
)
65-
MOI.set(optimizer, MOI.Silent(), true)
66-
return optimizer
67-
end
68-
6934
function test_SolverName()
7035
@test MOI.get(Mosek.Optimizer(), MOI.SolverName()) == "Mosek"
7136
return
7237
end
7338

7439
function test_Double_Parameter()
75-
optimizer = MosekOptimizerWithFallback()
40+
optimizer = Mosek.Optimizer()
41+
MOI.set(optimizer, MOI.Silent(), true)
7642
MOI.set(optimizer, MOI.RawOptimizerAttribute("INTPNT_CO_TOL_DFEAS"), 1e-7)
7743
@test MOI.get(
7844
optimizer,
@@ -100,7 +66,8 @@ function test_Double_Parameter()
10066
end
10167

10268
function test_Integer_Parameter()
103-
optimizer = MosekOptimizerWithFallback()
69+
optimizer = Mosek.Optimizer()
70+
MOI.set(optimizer, MOI.Silent(), true)
10471
MOI.set(
10572
optimizer,
10673
MOI.RawOptimizerAttribute("MSK_IPAR_INTPNT_MAX_ITERATIONS"),
@@ -138,7 +105,8 @@ function test_String_Parameter()
138105
end
139106

140107
function test_TimeLimitSec()
141-
optimizer = MosekOptimizerWithFallback()
108+
optimizer = Mosek.Optimizer()
109+
MOI.set(optimizer, MOI.Silent(), true)
142110
@test MOI.get(
143111
optimizer,
144112
MOI.RawOptimizerAttribute("MSK_DPAR_OPTIMIZER_MAX_TIME"),
@@ -165,7 +133,8 @@ function test_supports_incremental_interface()
165133
end
166134

167135
function test_Number_of_variables_and_deletion()
168-
optimizer = MosekOptimizerWithFallback()
136+
optimizer = Mosek.Optimizer()
137+
MOI.set(optimizer, MOI.Silent(), true)
169138
x = MOI.add_variable(optimizer)
170139
@test MOI.get(optimizer, MOI.NumberOfVariables()) == 1
171140
y, cy = MOI.add_constrained_variables(
@@ -188,7 +157,8 @@ function test_Number_of_variables_and_deletion()
188157
end
189158

190159
function test_Matrix_name()
191-
optimizer = MosekOptimizerWithFallback()
160+
optimizer = Mosek.Optimizer()
161+
MOI.set(optimizer, MOI.Silent(), true)
192162
x, cx = MOI.add_constrained_variables(
193163
optimizer,
194164
MOI.PositiveSemidefiniteConeTriangle(3),
@@ -212,7 +182,8 @@ end
212182

213183
# See https://github.com/jump-dev/MosekTools.jl/issues/95
214184
function test_Mapping_enums()
215-
optimizer = MosekOptimizerWithFallback()
185+
optimizer = Mosek.Optimizer()
186+
MOI.set(optimizer, MOI.Silent(), true)
216187
# Force variable bridging to test attribute substitution
217188
bridged = MOI.Bridges.Variable.Zeros{Float64}(optimizer)
218189
cache = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
@@ -233,7 +204,8 @@ function test_Mapping_enums()
233204
end
234205

235206
function test_LMIs()
236-
optimizer = MosekOptimizerWithFallback()
207+
optimizer = Mosek.Optimizer()
208+
MOI.set(optimizer, MOI.Silent(), true)
237209
@test MOI.supports_constraint(
238210
optimizer,
239211
MOI.VectorAffineFunction{Float64},
@@ -354,8 +326,10 @@ function test_modify_psd()
354326
end
355327

356328
function test_moi_test_runtests_Mosek()
329+
optimizer = Mosek.Optimizer()
330+
MOI.set(optimizer, MOI.Silent(), true)
357331
MOI.Test.runtests(
358-
MosekOptimizerWithFallback(),
332+
optimizer,
359333
MOI.Test.Config(; atol = 1e-3, rtol = 1e-3);
360334
# Evaluated: MOI.OTHER_ERROR in (MOI.OPTIMAL, MOI.INVALID_MODEL)
361335
exclude = ["test_conic_empty_matrix"],
@@ -364,8 +338,10 @@ function test_moi_test_runtests_Mosek()
364338
end
365339

366340
function test_moi_test_runtests_Bridge_Mosek()
341+
model = MOI.instantiate(Mosek.Optimizer; with_bridge_type = Float64)
342+
MOI.set(model, MOI.Silent(), true)
367343
MOI.Test.runtests(
368-
MOI.instantiate(MosekOptimizerWithFallback; with_bridge_type = Float64),
344+
model,
369345
MOI.Test.Config(; atol = 1e-3, rtol = 1e-3);
370346
exclude = [
371347
# Evaluated: MOI.OTHER_ERROR in (MOI.OPTIMAL, MOI.INVALID_MODEL)
@@ -379,12 +355,14 @@ function test_moi_test_runtests_Bridge_Mosek()
379355
end
380356

381357
function test_moi_test_runtests_Bridge_Cache_Mosek()
358+
model = MOI.instantiate(
359+
Mosek.Optimizer;
360+
with_bridge_type = Float64,
361+
with_cache_type = Float64,
362+
)
363+
MOI.set(model, MOI.Silent(), true)
382364
MOI.Test.runtests(
383-
MOI.instantiate(
384-
MosekOptimizerWithFallback;
385-
with_bridge_type = Float64,
386-
with_cache_type = Float64,
387-
),
365+
model,
388366
MOI.Test.Config(; atol = 1e-3, rtol = 1e-3);
389367
# Evaluated: MOI.OTHER_ERROR in (MOI.OPTIMAL, MOI.INVALID_MODEL)
390368
exclude = ["test_conic_empty_matrix"],
@@ -397,11 +375,12 @@ function test_more_SDP_tests_by_forced_bridging()
397375
MOI.Bridges.Constraint.RSOCtoPSD{Float64}( # Forced bridging
398376
MOI.Utilities.CachingOptimizer(
399377
MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()),
400-
MosekOptimizerWithFallback(),
378+
Mosek.Optimizer(),
401379
),
402380
),
403381
Float64,
404382
)
383+
MOI.set(model, MOI.Silent(), true)
405384
config = MOI.Test.Config(
406385
Float64;
407386
atol = 1e-3,
@@ -415,7 +394,8 @@ end
415394

416395
function test_VariableBasisStatus()
417396
attr = MOI.VariableBasisStatus()
418-
model = MosekOptimizerWithFallback()
397+
model = Mosek.Optimizer()
398+
MOI.set(model, MOI.Silent(), true)
419399
x_low, _ = MOI.add_constrained_variable(model, MOI.GreaterThan(0.0))
420400
x_upr, _ = MOI.add_constrained_variable(model, MOI.LessThan(0.0))
421401
x_fix, _ = MOI.add_constrained_variable(model, MOI.EqualTo(0.0))
@@ -440,7 +420,8 @@ function test_VariableBasisStatus()
440420
end
441421

442422
function test_variable_name()
443-
model = MosekOptimizerWithFallback()
423+
model = Mosek.Optimizer()
424+
MOI.set(model, MOI.Silent(), true)
444425
x = MOI.add_variable(model)
445426
set = MOI.PositiveSemidefiniteConeTriangle(2)
446427
y, _ = MOI.add_constrained_variables(model, set)
@@ -519,7 +500,7 @@ end
519500

520501
function test_issue_134()
521502
model = MOI.instantiate(
522-
MosekOptimizerWithFallback;
503+
Mosek.Optimizer;
523504
with_bridge_type = Float64,
524505
with_cache_type = Float64,
525506
)
@@ -618,15 +599,17 @@ function _solve_knapsack_model(model, n; integer::Bool = true)
618599
end
619600

620601
function test_simplex_iterations()
621-
model = MosekOptimizerWithFallback()
602+
model = Mosek.Optimizer()
603+
MOI.set(model, MOI.Silent(), true)
622604
@test MOI.get(model, MOI.SimplexIterations()) == 0
623605
_solve_knapsack_model(model, 100)
624606
@test MOI.get(model, MOI.SimplexIterations()) >= 0
625607
return
626608
end
627609

628610
function test_barrier_iterations()
629-
model = MosekOptimizerWithFallback()
611+
model = Mosek.Optimizer()
612+
MOI.set(model, MOI.Silent(), true)
630613
MOI.set(
631614
model,
632615
MOI.RawOptimizerAttribute("MSK_IPAR_PRESOLVE_USE"),
@@ -639,15 +622,17 @@ function test_barrier_iterations()
639622
end
640623

641624
function test_node_count()
642-
model = MosekOptimizerWithFallback()
625+
model = Mosek.Optimizer()
626+
MOI.set(model, MOI.Silent(), true)
643627
@test MOI.get(model, MOI.NodeCount()) == 0
644628
_solve_knapsack_model(model, 100)
645629
@test MOI.get(model, MOI.NodeCount()) >= 0
646630
return
647631
end
648632

649633
function test_objective_bound_relative_gap()
650-
model = MosekOptimizerWithFallback()
634+
model = Mosek.Optimizer()
635+
MOI.set(model, MOI.Silent(), true)
651636
@test isnan(MOI.get(model, MOI.ObjectiveBound()))
652637
_solve_knapsack_model(model, 100)
653638
@test isapprox(
@@ -660,7 +645,8 @@ function test_objective_bound_relative_gap()
660645
end
661646

662647
function test_variable_primal_start()
663-
model = MosekOptimizerWithFallback()
648+
model = Mosek.Optimizer()
649+
MOI.set(model, MOI.Silent(), true)
664650
set = MOI.PositiveSemidefiniteConeTriangle(2)
665651
x, _ = MOI.add_constrained_variables(model, set)
666652
MOI.set.(model, MOI.VariablePrimalStart(), x, [1.0, 0.0, 1.0])
@@ -669,7 +655,8 @@ function test_variable_primal_start()
669655
end
670656

671657
function test_raw_status_string()
672-
model = MosekOptimizerWithFallback()
658+
model = Mosek.Optimizer()
659+
MOI.set(model, MOI.Silent(), true)
673660
@test MOI.get(model, MOI.RawStatusString()) == "MOI.OPTIMIZE_NOT_CALLED"
674661
MOI.set(
675662
model,
@@ -704,7 +691,12 @@ function test_show_linked_ints()
704691
end
705692

706693
function test_get_fallback()
707-
model = MosekOptimizerWithFallback()
694+
model = Mosek.Optimizer()
695+
MOI.set(
696+
model,
697+
MOI.RawOptimizerAttribute("fallback"),
698+
"mosek://solve.mosek.com:30080",
699+
)
708700
@test MOI.get(model, MOI.RawOptimizerAttribute("fallback")) ==
709701
"mosek://solve.mosek.com:30080"
710702
return

0 commit comments

Comments
 (0)