From e9af3482a6370476b729bae0815878328e07e346 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Wed, 8 Apr 2026 10:22:19 +1200 Subject: [PATCH] Add MOA.SolveTimeSecInner --- README.md | 4 +++- src/MultiObjectiveAlgorithms.jl | 21 +++++++++++++++++---- test/test_model.jl | 8 ++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 82f3154..c7e6c91 100644 --- a/README.md +++ b/README.md @@ -93,8 +93,10 @@ the solution process. * `MOA.SolutionLimit()` * `MOI.TimeLimitSec()` -Query the number of scalar subproblems that were solved using +There are also the following result attributes that can be queried after the +solve: + * `MOA.SolveTimeInner()` * `MOA.SubproblemCount()` For example: diff --git a/src/MultiObjectiveAlgorithms.jl b/src/MultiObjectiveAlgorithms.jl index 736145d..d023741 100644 --- a/src/MultiObjectiveAlgorithms.jl +++ b/src/MultiObjectiveAlgorithms.jl @@ -224,7 +224,7 @@ mutable struct Optimizer <: MOI.AbstractOptimizer Float64[], _default(ComputeIdealPoint()), 0, - 0.0, + NaN, optimizer_factory, ) end @@ -239,6 +239,7 @@ function MOI.empty!(model::Optimizer) model.start_time = NaN empty!(model.ideal_point) model.subproblem_count = 0 + model.solve_time_inner = NaN return end @@ -343,9 +344,21 @@ end ### SolveTimeSec -function MOI.get(model::Optimizer, ::MOI.SolveTimeSec) - return model.solve_time -end +MOI.get(model::Optimizer, ::MOI.SolveTimeSec) = model.solve_time + +### SolveTimeSecInner + +""" + SolveTimeSecInner <: AbstractModelAttribute -> Float64 + +A result attribute for querying the total solve time of subproblem solves by an +algorithm. +""" +struct SolveTimeSecInner <: MOI.AbstractModelAttribute end + +MOI.is_set_by_optimize(::SolveTimeSecInner) = true + +MOI.get(model::Optimizer, ::SolveTimeSecInner) = model.solve_time_inner ### ObjectiveFunction diff --git a/test/test_model.jl b/test/test_model.jl index 61adb1f..6c11ec0 100644 --- a/test/test_model.jl +++ b/test/test_model.jl @@ -94,8 +94,16 @@ function test_solve_time() MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f) MOI.set(model, MOI.ObjectiveSense(), MOI.MAX_SENSE) @test isnan(MOI.get(model, MOI.SolveTimeSec())) + @test MOI.is_set_by_optimize(MOA.SolveTimeSecInner()) + @test isnan(MOI.get(model, MOA.SolveTimeSecInner())) MOI.optimize!(model) @test MOI.get(model, MOI.SolveTimeSec()) >= 0 + @test MOI.get(model, MOA.SolveTimeSecInner()) >= 0 + @test MOI.get(model, MOI.SolveTimeSec()) == model.solve_time + @test MOI.get(model, MOA.SolveTimeSecInner()) == model.solve_time_inner + MOI.empty!(model) + @test isnan(MOI.get(model, MOI.SolveTimeSec())) + @test isnan(MOI.get(model, MOA.SolveTimeSecInner())) return end