Skip to content

Commit 311d5d2

Browse files
authored
Support MOI.SolveTimeSec (#56)
1 parent aa7bb35 commit 311d5d2

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

src/MultiObjectiveAlgorithms.jl

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
109109
solutions::Vector{SolutionPoint}
110110
termination_status::MOI.TerminationStatusCode
111111
time_limit_sec::Union{Nothing,Float64}
112+
solve_time::Float64
112113

113114
function Optimizer(optimizer_factory)
114115
return new(
@@ -118,6 +119,7 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
118119
SolutionPoint[],
119120
MOI.OPTIMIZE_NOT_CALLED,
120121
nothing,
122+
NaN,
121123
)
122124
end
123125
end
@@ -127,14 +129,16 @@ function MOI.empty!(model::Optimizer)
127129
model.f = nothing
128130
model.solutions = SolutionPoint[]
129131
model.termination_status = MOI.OPTIMIZE_NOT_CALLED
132+
model.solve_time = NaN
130133
return
131134
end
132135

133136
function MOI.is_empty(model::Optimizer)
134137
return MOI.is_empty(model.inner) &&
135138
model.f === nothing &&
136139
isempty(model.solutions) &&
137-
model.termination_status == MOI.OPTIMIZE_NOT_CALLED
140+
model.termination_status == MOI.OPTIMIZE_NOT_CALLED &&
141+
isnan(model.solve_time)
138142
end
139143

140144
MOI.supports_incremental_interface(::Optimizer) = true
@@ -176,6 +180,12 @@ function _time_limit_exceeded(model::Optimizer, start_time::Float64)
176180
return false
177181
end
178182

183+
### SolveTimeSec
184+
185+
function MOI.get(model::Optimizer, ::MOI.SolveTimeSec)
186+
return model.solve_time
187+
end
188+
179189
### ObjectiveFunction
180190

181191
function MOI.supports(
@@ -493,6 +503,7 @@ function MOI.delete(model::Optimizer, ci::MOI.ConstraintIndex)
493503
end
494504

495505
function MOI.optimize!(model::Optimizer)
506+
start_time = time()
496507
empty!(model.solutions)
497508
model.termination_status = MOI.OPTIMIZE_NOT_CALLED
498509
if model.f === nothing
@@ -508,6 +519,7 @@ function MOI.optimize!(model::Optimizer)
508519
if MOI.supports(model.inner, MOI.TimeLimitSec())
509520
MOI.set(model.inner, MOI.TimeLimitSec(), nothing)
510521
end
522+
model.solve_time = time() - start_time
511523
return
512524
end
513525

test/test_model.jl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,20 @@ function test_time_limit()
8888
return
8989
end
9090

91+
function test_solve_time()
92+
model = MOA.Optimizer(HiGHS.Optimizer)
93+
MOI.set(model, MOI.Silent(), true)
94+
x = MOI.add_variables(model, 2)
95+
MOI.add_constraint.(model, x, MOI.GreaterThan(0.0))
96+
f = MOI.Utilities.operate(vcat, Float64, 1.0 .* x...)
97+
MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f)
98+
MOI.set(model, MOI.ObjectiveSense(), MOI.MAX_SENSE)
99+
@test isnan(MOI.get(model, MOI.SolveTimeSec()))
100+
MOI.optimize!(model)
101+
@test MOI.get(model, MOI.SolveTimeSec()) >= 0
102+
return
103+
end
104+
91105
end
92106

93107
TestModel.run_tests()

0 commit comments

Comments
 (0)