diff --git a/Project.toml b/Project.toml index c40cee12..cfc9b4eb 100644 --- a/Project.toml +++ b/Project.toml @@ -21,7 +21,7 @@ MINLPTests = "~0.5" MadNLPTests = "~0.3" MathOptInterface = "1" NLPModels = "~0.17.2, 0.18, 0.19" -SolverCore = "~0.1,~0.2" +SolverCore = "~0.3" julia = "1.6" [extras] diff --git a/src/IPM/solver.jl b/src/IPM/solver.jl index 458c3716..40f2d6ee 100644 --- a/src/IPM/solver.jl +++ b/src/IPM/solver.jl @@ -4,25 +4,13 @@ function madnlp(model::AbstractNLPModel; kwargs...) return solve!(solver) end -function solve!( - model::AbstractNLPModel, - solver::MadNLPSolver, - nlp::AbstractNLPModel; - x = get_x0(nlp), - y = get_y0(nlp), - zl= nothing, - zu= nothing, +solve!(nlp::AbstractNLPModel, solver::AbstractMadNLPSolver; kwargs...) = solve!( + nlp, solver, MadNLPExecutionStats(solver); + kwargs...) +solve!(solver::AbstractMadNLPSolver; kwargs...) = solve!( + solver.nlp, solver; kwargs...) - @assert solver.nlp == nlp - - solve!( - solver; - x = x, y = y, - zl = zl, zu = zu, - kwargs... - ) -end function initialize!(solver::AbstractMadNLPSolver{T}) where T # initializing slack variables @@ -110,23 +98,25 @@ end # major loops --------------------------------------------------------- function solve!( - solver::AbstractMadNLPSolver; + nlp::AbstractNLPModel, + solver::AbstractMadNLPSolver, + stats::MadNLPExecutionStats; x = nothing, y = nothing, zl = nothing, zu = nothing, kwargs... ) - + if x != nothing - solver.x[1:get_nvar(solver.nlp)] .= x + solver.x[1:get_nvar(nlp)] .= x end if y != nothing - solver.y[1:get_ncon(solver.nlp)] .= y + solver.y[1:get_ncon(nlp)] .= y end if zl != nothing - solver.zl[1:get_nvar(solver.nlp)] .= zl + solver.zl[1:get_nvar(nlp)] .= zl end if zu != nothing - solver.zu[1:get_nvar(solver.nlp)] .= zu + solver.zu[1:get_nvar(nlp)] .= zu end if !isempty(kwargs) @@ -184,8 +174,12 @@ function solve!( solver.opt.disable_garbage_collector && (GC.enable(true); @warn(solver.logger,"Julia garbage collector is turned back on")) finalize(solver.logger) + + update!(stats,solver) end - return MadNLPExecutionStats(solver) + + + return stats end diff --git a/src/IPM/utils.jl b/src/IPM/utils.jl index 6f9fc20a..d3075f70 100644 --- a/src/IPM/utils.jl +++ b/src/IPM/utils.jl @@ -1,4 +1,4 @@ -struct MadNLPExecutionStats{T} <: AbstractExecutionStats +mutable struct MadNLPExecutionStats{T} <: AbstractExecutionStats status::Status solution::Vector{T} objective::T @@ -13,11 +13,6 @@ struct MadNLPExecutionStats{T} <: AbstractExecutionStats elapsed_time::Real end -struct InvalidNumberException <: Exception - callback::Symbol -end -struct NotEnoughDegreesOfFreedomException <: Exception end - MadNLPExecutionStats(solver::MadNLPSolver) =MadNLPExecutionStats( solver.status, _madnlp_unsafe_wrap(solver.x, get_nvar(solver.nlp)), @@ -29,10 +24,26 @@ MadNLPExecutionStats(solver::MadNLPSolver) =MadNLPExecutionStats( solver.cnt.k, get_counters(solver.nlp),solver.cnt.total_time ) +function update!(stats::MadNLPExecutionStats, solver::MadNLPSolver) + stats.status = solver.status + stats.objective = solver.obj_val + stats.dual_feas = solver.inf_du + stats.primal_feas = solver.inf_pr + stats.iter = solver.cnt.k + stats.elapsed_time = solver.cnt.total_time + return stats +end + get_counters(nlp::NLPModels.AbstractNLPModel) = nlp.counters get_counters(nlp::NLPModels.AbstractNLSModel) = nlp.counters.counters getStatus(result::MadNLPExecutionStats) = STATUS_OUTPUT_DICT[result.status] +# Exceptions +struct InvalidNumberException <: Exception + callback::Symbol +end +struct NotEnoughDegreesOfFreedomException <: Exception end + # Utilities has_constraints(solver) = solver.m != 0 @@ -181,4 +192,3 @@ function string(solver::AbstractMadNLPSolver) end print(io::IO,solver::AbstractMadNLPSolver) = print(io, string(solver)) show(io::IO,solver::AbstractMadNLPSolver) = print(io,solver) - diff --git a/src/MadNLP.jl b/src/MadNLP.jl index d7df8f0f..255b6adc 100644 --- a/src/MadNLP.jl +++ b/src/MadNLP.jl @@ -14,7 +14,7 @@ import Base: string, show, print, size, getindex, copyto!, @kwdef import SuiteSparse: UMFPACK import NLPModels import NLPModels: finalize, AbstractNLPModel, obj, grad!, cons!, jac_coord!, hess_coord!, hess_structure!, jac_structure!, NLPModelMeta, get_nvar, get_ncon, get_minimize, get_x0, get_y0, get_nnzj, get_nnzh, get_lvar, get_uvar, get_lcon, get_ucon, Counters as _Counters # get_zl,get_zu -import SolverCore: AbstractExecutionStats, getStatus +import SolverCore: solve!, getStatus, AbstractOptimizationSolver, AbstractExecutionStats const MOI = MathOptInterface const MOIU = MathOptInterface.Utilities