Skip to content

Commit 527bcdf

Browse files
committed
Merge pull request #38 from JuliaOpt/bl/moiv0.9
Update to MOI v0.9
1 parent 38f1797 commit 527bcdf

File tree

5 files changed

+70
-63
lines changed

5 files changed

+70
-63
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ Mosek = "6405355b-0ac2-5fba-af84-adbd65488c0e"
99
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
1010

1111
[compat]
12-
MathOptInterface = "~0.8.3"
12+
MathOptInterface = "0.9"
1313
Mosek = "~0.9.11"
1414
julia = "1"
1515

src/MosekTools.jl

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -163,10 +163,7 @@ function MOI.get(m::MosekModel, p::StringParameter)
163163
return str
164164
end
165165

166-
struct Parameter <: MOI.AbstractOptimizerAttribute
167-
name::String
168-
end
169-
function MOI.set(m::MosekModel, p::Parameter, value)
166+
function MOI.set(m::MosekModel, p::MOI.RawParameter, value)
170167
if p.name == "QUIET"
171168
if m.be_quiet != convert(Bool, value)
172169
m.be_quiet = !m.be_quiet
@@ -200,7 +197,7 @@ function MOI.set(m::MosekModel, p::Parameter, value)
200197
end
201198
end
202199

203-
function MOI.get(m::MosekModel, p::Parameter)
200+
function MOI.get(m::MosekModel, p::MOI.RawParameter)
204201
if p.name == "QUIET"
205202
return m.be_quiet
206203
elseif p.name == "fallback"
@@ -219,8 +216,20 @@ function MOI.get(m::MosekModel, p::Parameter)
219216
end
220217
end
221218

219+
MOI.supports(::MosekModel, ::MOI.Silent) = true
222220
function MOI.set(model::MosekModel, ::MOI.Silent, value::Bool)
223-
MOI.set(model, Parameter("QUIET"), value)
221+
MOI.set(model, MOI.RawParameter("QUIET"), value)
222+
end
223+
function MOI.get(model::MosekModel, ::MOI.Silent)
224+
MOI.get(model, MOI.RawParameter("QUIET"))
225+
end
226+
227+
MOI.supports(::MosekModel, ::MOI.TimeLimitSec) = true
228+
function MOI.set(model::MosekModel, ::MOI.TimeLimitSec, value::Real)
229+
MOI.set(model, MOI.RawParameter("MSK_DPAR_OPTIMIZER_MAX_TIME"), value)
230+
end
231+
function MOI.get(model::MosekModel, ::MOI.TimeLimitSec)
232+
return MOI.get(model, MOI.RawParameter("MSK_DPAR_OPTIMIZER_MAX_TIME"))
224233
end
225234

226235
export Mosek
@@ -246,7 +255,7 @@ function Mosek.Optimizer(; kws...)
246255
nothing)
247256
Mosek.putstreamfunc(model.task, Mosek.MSK_STREAM_LOG, m -> print(m))
248257
for (option, value) in kws
249-
MOI.set(model, Parameter(string(option)), value)
258+
MOI.set(model, MOI.RawParameter(string(option)), value)
250259
end
251260
return model
252261
end

src/attributes.jl

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,11 @@ end
6060

6161
#### objective
6262
function MOI.get(m::MosekModel, attr::MOI.ObjectiveValue)
63-
return getprimalobj(m.task, m.solutions[attr.resultindex].whichsol)
63+
return getprimalobj(m.task, m.solutions[attr.result_index].whichsol)
64+
end
65+
function MOI.get(m::MosekModel, attr::MOI.DualObjectiveValue)
66+
return getdualobj(m.task, m.solutions[attr.result_index].whichsol)
6467
end
65-
# For MOI v0.9
66-
#function MOI.get(m::MosekModel, attr::MOI.DualObjectiveValue)
67-
# return getdualobj(m.task, m.solutions[attr.result_index].whichsol)
68-
#end
6968

7069
MOI.get(m::MosekModel,attr::MOI.ObjectiveBound) = getdouinf(m.task,MSK_DINF_MIO_OBJ_BOUND)
7170

src/constraint.jl

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,7 @@ end
491491
_variable(ci::MOI.ConstraintIndex{MOI.SingleVariable}) = MOI.VariableIndex(ci.value)
492492
function MOI.get(m::MosekModel, ::MOI.ConstraintFunction,
493493
ci::MOI.ConstraintIndex{MOI.SingleVariable}) where S <: ScalarLinearDomain
494+
MOI.throw_if_not_valid(m, ci)
494495
return MOI.SingleVariable(_variable(ci))
495496
end
496497
function MOI.get(m::MosekModel, ::MOI.ConstraintSet,
@@ -499,6 +500,7 @@ function MOI.get(m::MosekModel, ::MOI.ConstraintSet,
499500
end
500501
function MOI.get(m::MosekModel, ::MOI.ConstraintSet,
501502
ci::MOI.ConstraintIndex{MOI.SingleVariable, S}) where S <: ScalarLinearDomain
503+
MOI.throw_if_not_valid(m, ci)
502504
sv = MOI.get(m, MOI.ConstraintFunction(), ci)
503505
return get_variable_constraint(m, sv.variable, ci)
504506
end
@@ -604,9 +606,7 @@ function MOI.delete(
604606
m::MosekModel,
605607
cref::MOI.ConstraintIndex{F,D}) where {F <: MOI.ScalarAffineFunction{Float64},
606608
D <: ScalarLinearDomain}
607-
if !MOI.is_valid(m, cref)
608-
throw(MOI.InvalidIndex(cref))
609-
end
609+
MOI.throw_if_not_valid(m, cref)
610610

611611
delete_name(m, cref)
612612

@@ -632,9 +632,7 @@ function MOI.delete(
632632
m::MosekModel,
633633
ci::MOI.ConstraintIndex{MOI.SingleVariable, S}) where S<:Union{ScalarLinearDomain,
634634
ScalarIntegerDomain}
635-
if !MOI.is_valid(m, ci)
636-
throw(MOI.InvalidIndex(ci))
637-
end
635+
MOI.throw_if_not_valid(m, ci)
638636
delete_name(m, ci)
639637
vi = _variable(ci)
640638
unset_flag(m, vi, S)

test/runtests.jl

Lines changed: 45 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -25,31 +25,31 @@ end
2525
@testset "Parameters" begin
2626
optimizer = Mosek.Optimizer(fallback = FALLBACK_URL)
2727
@testset "Double Parameter" begin
28-
MOI.set(optimizer, MosekTools.Parameter("INTPNT_CO_TOL_DFEAS"), 1e-7)
29-
@test MOI.get(optimizer, MosekTools.Parameter("MSK_DPAR_INTPNT_CO_TOL_DFEAS")) == 1e-7
30-
MOI.set(optimizer, MosekTools.Parameter("MSK_DPAR_INTPNT_CO_TOL_DFEAS"), 1e-8)
31-
@test MOI.get(optimizer, MosekTools.Parameter("MSK_DPAR_INTPNT_CO_TOL_DFEAS")) == 1e-8
28+
MOI.set(optimizer, MOI.RawParameter("INTPNT_CO_TOL_DFEAS"), 1e-7)
29+
@test MOI.get(optimizer, MOI.RawParameter("MSK_DPAR_INTPNT_CO_TOL_DFEAS")) == 1e-7
30+
MOI.set(optimizer, MOI.RawParameter("MSK_DPAR_INTPNT_CO_TOL_DFEAS"), 1e-8)
31+
@test MOI.get(optimizer, MOI.RawParameter("MSK_DPAR_INTPNT_CO_TOL_DFEAS")) == 1e-8
3232
@testset "with integer value" begin
33-
MOI.set(optimizer, MosekTools.Parameter("MSK_DPAR_INTPNT_CO_TOL_DFEAS"), 1)
34-
@test MOI.get(optimizer, MosekTools.Parameter("MSK_DPAR_INTPNT_CO_TOL_DFEAS")) == 1
33+
MOI.set(optimizer, MOI.RawParameter("MSK_DPAR_INTPNT_CO_TOL_DFEAS"), 1)
34+
@test MOI.get(optimizer, MOI.RawParameter("MSK_DPAR_INTPNT_CO_TOL_DFEAS")) == 1
3535
end
3636
end
3737
@testset "Integer Parameter" begin
38-
MOI.set(optimizer, MosekTools.Parameter("MSK_IPAR_INTPNT_MAX_ITERATIONS"), 100)
39-
@test MOI.get(optimizer, MosekTools.Parameter("MSK_IPAR_INTPNT_MAX_ITERATIONS")) == 100
40-
MOI.set(optimizer, MosekTools.Parameter("INTPNT_MAX_ITERATIONS"), 200)
41-
@test MOI.get(optimizer, MosekTools.Parameter("MSK_IPAR_INTPNT_MAX_ITERATIONS")) == 200
38+
MOI.set(optimizer, MOI.RawParameter("MSK_IPAR_INTPNT_MAX_ITERATIONS"), 100)
39+
@test MOI.get(optimizer, MOI.RawParameter("MSK_IPAR_INTPNT_MAX_ITERATIONS")) == 100
40+
MOI.set(optimizer, MOI.RawParameter("INTPNT_MAX_ITERATIONS"), 200)
41+
@test MOI.get(optimizer, MOI.RawParameter("MSK_IPAR_INTPNT_MAX_ITERATIONS")) == 200
4242
@testset "with enum value" begin
43-
MOI.set(optimizer, MosekTools.Parameter("MSK_IPAR_OPTIMIZER"), MosekTools.Mosek.MSK_OPTIMIZER_DUAL_SIMPLEX)
44-
@test MOI.get(optimizer, MosekTools.Parameter("MSK_IPAR_OPTIMIZER")) == convert(Int32, MosekTools.Mosek.MSK_OPTIMIZER_DUAL_SIMPLEX)
43+
MOI.set(optimizer, MOI.RawParameter("MSK_IPAR_OPTIMIZER"), MosekTools.Mosek.MSK_OPTIMIZER_DUAL_SIMPLEX)
44+
@test MOI.get(optimizer, MOI.RawParameter("MSK_IPAR_OPTIMIZER")) == convert(Int32, MosekTools.Mosek.MSK_OPTIMIZER_DUAL_SIMPLEX)
4545
end
4646
end
4747
@testset "String Parameter" begin
48-
MOI.set(optimizer, MosekTools.Parameter("PARAM_WRITE_FILE_NAME"), "foo.txt")
48+
MOI.set(optimizer, MOI.RawParameter("PARAM_WRITE_FILE_NAME"), "foo.txt")
4949
# Needs https://github.com/JuliaOpt/Mosek.jl/pull/174
50-
#@test MOI.get(optimizer, MosekTools.Parameter("MSK_SPAR_PARAM_WRITE_FILE_NAME")) == "foo.txt"
51-
MOI.set(optimizer, MosekTools.Parameter("MSK_SPAR_PARAM_WRITE_FILE_NAME"), "bar.txt")
52-
#@test MOI.get(optimizer, MosekTools.Parameter("MSK_SPAR_PARAM_WRITE_FILE_NAME")) == "bar.txt"
50+
#@test MOI.get(optimizer, MOI.RawParameter("MSK_SPAR_PARAM_WRITE_FILE_NAME")) == "foo.txt"
51+
MOI.set(optimizer, MOI.RawParameter("MSK_SPAR_PARAM_WRITE_FILE_NAME"), "bar.txt")
52+
#@test MOI.get(optimizer, MOI.RawParameter("MSK_SPAR_PARAM_WRITE_FILE_NAME")) == "bar.txt"
5353
end
5454
end
5555

@@ -58,11 +58,6 @@ end
5858
@test MOIU.supports_default_copy_to(optimizer, true)
5959
end
6060

61-
@testset "Name" begin
62-
MOIT.nametest(optimizer)
63-
MOI.empty!(optimizer)
64-
end
65-
6661
const config = MOIT.TestConfig(atol=1e-3, rtol=1e-3)
6762

6863
@testset "Basic" begin
@@ -82,39 +77,45 @@ const config = MOIT.TestConfig(atol=1e-3, rtol=1e-3)
8277
(MOI.ScalarAffineFunction{Float64}, MOI.Interval{Float64})
8378
])
8479
end
85-
# @testset "Conic" begin
86-
# # Doesn't work, see https://github.com/JuliaOpt/MathOptInterface.jl/pull/703
87-
# MOIT.basic_constraint_tests(
88-
# optimizer, config,
89-
# delete = false, # TODO
90-
# get_constraint_function = false, # TODO
91-
# get_constraint_set = false, # TODO
92-
# include=[
93-
# (MOI.VectorOfVariables, MOI.SecondOrderCone),
94-
# (MOI.VectorOfVariables, MOI.RotatedSecondOrderCone)
95-
# ])
96-
# end
80+
@testset "Conic" begin
81+
MOIT.basic_constraint_tests(
82+
optimizer, config,
83+
delete = false, # TODO
84+
get_constraint_function = false, # TODO
85+
get_constraint_set = false, # TODO
86+
include=[
87+
(MOI.VectorOfVariables, MOI.SecondOrderCone),
88+
(MOI.VectorOfVariables, MOI.RotatedSecondOrderCone)
89+
])
90+
end
9791
end
9892

9993
const bridged = MOIB.full_bridge_optimizer(optimizer, Float64)
10094

95+
# Mosek errors during `MOI.set` instead of `MOI.get` when there are duplicates.
96+
#@testset "Name" begin
97+
# MOIT.nametest(bridged)
98+
#end
99+
101100
@testset "Copy" begin
102101
model = MOIB.full_bridge_optimizer(Mosek.Optimizer(), Float64)
103102
MOIT.copytest(bridged, model)
104103
end
105104

106105
@testset "Unit" begin
107106
# Mosek does not support names
108-
MOIT.unittest(bridged,
109-
config,
110-
[# Does not support quadratic objective yet, needs
111-
# https://github.com/JuliaOpt/MathOptInterface.jl/issues/529
112-
"solve_qp_edge_cases",
113-
# Find objective bound of 0.0 which is lower than 4.0
114-
"solve_objbound_edge_cases",
115-
# Cannot put multiple bound sets of the same type on a variable
116-
"solve_integer_edge_cases"
117-
])
107+
MOIT.unittest(bridged, config, [
108+
# Does not support quadratic objective yet, needs
109+
# https://github.com/JuliaOpt/MathOptInterface.jl/issues/529
110+
"solve_qp_edge_cases",
111+
# Find objective bound of 0.0 which is lower than 4.0
112+
"solve_objbound_edge_cases",
113+
# Cannot put multiple bound sets of the same type on a variable
114+
"solve_integer_edge_cases",
115+
# Cannot mix `ZeroOne` with `GreaterThan`/`LessThan`
116+
"solve_zero_one_with_bounds_1",
117+
"solve_zero_one_with_bounds_2",
118+
"solve_zero_one_with_bounds_3"])
118119
end
119120

120121
@testset "Continuous Linear" begin
@@ -130,7 +131,7 @@ end
130131
end
131132

132133
@testset "Integer Linear" begin
133-
MOIT.intlineartest(optimizer, config, ["int2"])
134+
MOIT.intlineartest(optimizer, config, ["int2", "indicator1", "indicator2", "indicator3"])
134135
end
135136

136137
# Test that objective and constraint data are copied over correctly when

0 commit comments

Comments
 (0)