From 190ae320b5e00395d88136ad1ba590bd1e27b654 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Thu, 8 Jul 2021 11:07:26 +1200 Subject: [PATCH] Implement MOI.SolveTime (#144) * Implement MOI.SolveTime * Update MOI_wrapper.jl --- Project.toml | 2 +- src/AmplNLWriter.jl | 7 +++++++ test/MOI_wrapper.jl | 20 ++++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index bb586a2..6864ea6 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "AmplNLWriter" uuid = "7c4d4715-977e-5154-bfe0-e096adeac482" -version = "0.7.1" +version = "0.7.2" [deps] MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" diff --git a/src/AmplNLWriter.jl b/src/AmplNLWriter.jl index 61c1001..6563d2c 100644 --- a/src/AmplNLWriter.jl +++ b/src/AmplNLWriter.jl @@ -198,6 +198,7 @@ mutable struct Optimizer <: MOI.AbstractOptimizer stdin::Any stdout::Any results::_NLResults + solve_time::Float64 # Store MOI.Name(). name::String # The objective expression. @@ -295,6 +296,7 @@ function Optimizer( Dict{MOI.VariableIndex,Float64}(), Dict{MOI.VariableIndex,Float64}(), ), + NaN, "", _NLExpr(false, _NLTerm[], Dict{MOI.VariableIndex,Float64}(), 0.0), MOI.FEASIBILITY_SENSE, @@ -328,6 +330,7 @@ function MOI.empty!(model::Optimizer) Dict{MOI.VariableIndex,Float64}(), Dict{MOI.VariableIndex,Float64}(), ) + model.solve_time = NaN model.f = _NLExpr(false, _NLTerm[], Dict{MOI.VariableIndex,Float64}(), 0.0) empty!(model.g) model.nlpblock_dim = 0 @@ -1130,6 +1133,7 @@ function _read_sol(io::IO, model::Optimizer) end function MOI.optimize!(model::Optimizer) + start_time = time() temp_dir = mktempdir() nl_file = joinpath(temp_dir, "model.nl") open(io -> write(io, model), nl_file, "w") @@ -1155,6 +1159,7 @@ function MOI.optimize!(model::Optimizer) Dict{MOI.VariableIndex,Float64}(), ) end + model.solve_time = time() - start_time return end @@ -1172,6 +1177,8 @@ function MOI.get( return model.results.primal_solution[x] end +MOI.get(model::Optimizer, ::MOI.SolveTime) = model.solve_time + function MOI.get(model::Optimizer, ::MOI.TerminationStatus) return model.results.termination_status end diff --git a/test/MOI_wrapper.jl b/test/MOI_wrapper.jl index 0bb2669..63e51ff 100644 --- a/test/MOI_wrapper.jl +++ b/test/MOI_wrapper.jl @@ -228,6 +228,26 @@ function test_AbstractSolverCommand(path) @test model.solver_command === cmd end +function test_solve_time(path) + model = optimizer(path) + @test isnan(MOI.get(model, MOI.SolveTime())) + v = MOI.add_variables(model, 4) + l = [1.1, 1.2, 1.3, 1.4] + u = [5.1, 5.2, 5.3, 5.4] + start = [2.1, 2.2, 2.3, 2.4] + MOI.add_constraint.(model, MOI.SingleVariable.(v), MOI.GreaterThan.(l)) + MOI.add_constraint.(model, MOI.SingleVariable.(v), MOI.LessThan.(u)) + MOI.set.(model, MOI.VariablePrimalStart(), v, start) + lb, ub = [25.0, 40.0], [Inf, 40.0] + evaluator = MOI.Test.HS071(true) + block_data = MOI.NLPBlockData(MOI.NLPBoundsPair.(lb, ub), evaluator, true) + MOI.set(model, MOI.NLPBlock(), block_data) + MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE) + MOI.optimize!(model) + @test MOI.get(model, MOI.SolveTime()) > 0.0 + return +end + function runtests(path) for name in names(@__MODULE__; all = true) if !startswith("$(name)", "test_")