Skip to content

Commit 3d87b85

Browse files
authored
Add support for MOI.TimeLimitSec (#280)
1 parent 64fe61f commit 3d87b85

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

src/MOI_wrapper/MOI_wrapper.jl

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,29 @@ end
172172

173173
MOI.get(optimizer::Optimizer, ::MOI.Silent) = optimizer.silent
174174

175+
###
176+
### MOI.TimeLimitSec
177+
###
178+
179+
MOI.supports(::Optimizer, ::MOI.TimeLimitSec) = true
180+
181+
function MOI.set(optimizer::Optimizer, ::MOI.TimeLimitSec, time_limit::Real)
182+
optimizer.options[:time_limit_secs] = convert(Float64, time_limit)
183+
return
184+
end
185+
186+
function MOI.set(optimizer::Optimizer, ::MOI.TimeLimitSec, ::Nothing)
187+
delete!(optimizer.options, :time_limit_secs)
188+
return
189+
end
190+
191+
function MOI.get(optimizer::Optimizer, attr::MOI.TimeLimitSec)
192+
if !haskey(optimizer.options, :time_limit_secs)
193+
throw(MOI.GetAttributeNotAllowed(attr))
194+
end
195+
return optimizer.options[:time_limit_secs]
196+
end
197+
175198
###
176199
### MOI.AbstractModelAttribute
177200
###
@@ -482,7 +505,13 @@ function MOI.get(optimizer::Optimizer, ::MOI.TerminationStatus)
482505
elseif s == -6
483506
return MOI.ALMOST_DUAL_INFEASIBLE
484507
elseif s == 2
485-
return MOI.ALMOST_OPTIMAL
508+
if occursin("reached time_limit_secs", optimizer.sol.raw_status)
509+
return MOI.TIME_LIMIT
510+
elseif occursin("reached max_iters", optimizer.sol.raw_status)
511+
return MOI.ITERATION_LIMIT
512+
else
513+
return MOI.ALMOST_OPTIMAL
514+
end
486515
elseif s == -5
487516
return MOI.INTERRUPTED
488517
elseif s == -4

test/MOI_wrapper.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,16 @@ function test_redirect_stdout()
249249
return
250250
end
251251

252+
function test_time_limit()
253+
model = SCS.Optimizer()
254+
@test_throws MOI.GetAttributeNotAllowed MOI.get(model, MOI.TimeLimitSec())
255+
MOI.set(model, MOI.TimeLimitSec(), 1)
256+
@test MOI.get(model, MOI.TimeLimitSec()) === 1.0
257+
MOI.set(model, MOI.TimeLimitSec(), nothing)
258+
@test_throws MOI.GetAttributeNotAllowed MOI.get(model, MOI.TimeLimitSec())
259+
return
260+
end
261+
252262
end # module
253263

254264
TestSCS.runtests()

0 commit comments

Comments
 (0)