@@ -172,6 +172,7 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
172172 termination_status:: MOI.TerminationStatusCode
173173 silent:: Bool
174174 time_limit_sec:: Union{Nothing,Float64}
175+ start_time:: Float64
175176 solve_time:: Float64
176177 ideal_point:: Vector{Float64}
177178 compute_ideal_point:: Bool
@@ -192,6 +193,7 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
192193 false ,
193194 nothing ,
194195 NaN ,
196+ NaN ,
195197 Float64[],
196198 _default (ComputeIdealPoint ()),
197199 0 ,
@@ -206,6 +208,7 @@ function MOI.empty!(model::Optimizer)
206208 empty! (model. solutions)
207209 model. termination_status = MOI. OPTIMIZE_NOT_CALLED
208210 model. solve_time = NaN
211+ model. start_time = NaN
209212 empty! (model. ideal_point)
210213 model. subproblem_count = 0
211214 return
@@ -665,24 +668,56 @@ function optimize_inner!(model::Optimizer)
665668 return
666669end
667670
671+ """
672+ _log_solution(model::Optimizer, variables::Vector{MOI.VariableIndex})
673+
674+ Log the solution. We don't have a pre-computed point, so compute one from the
675+ variable values.
676+ """
677+ function _log_solution (model:: Optimizer , variables:: Vector{MOI.VariableIndex} )
678+ if ! model. silent
679+ _, Y = _compute_point (model, variables, model. f)
680+ _log_solution (model, Y)
681+ end
682+ return
683+ end
684+
685+ """
686+ _log_solution(model::Optimizer, variables::Vector{MOI.VariableIndex})
687+
688+ Log the solution. We have a pre-computed point.
689+ """
668690function _log_solution (model:: Optimizer , Y)
669- if model. silent
670- return
691+ if ! model. silent
692+ print (_format (model. subproblem_count))
693+ for y in Y
694+ print (" " , _format (y))
695+ end
696+ println (" " , _format (time () - model. start_time))
671697 end
672- print (_format (model. subproblem_count))
673- for y in Y
674- print (" " , _format (y))
698+ return
699+ end
700+ """
701+ _log_solution(model::Optimizer, msg::String)
702+
703+ Log the solution. Assume the subproblem failed to solve.
704+ """
705+ function _log_solution (model:: Optimizer , msg:: String )
706+ if ! model. silent
707+ print (_format (model. subproblem_count), " " )
708+ print (rpad (msg, 13 * MOI. output_dimension (model. f) - 3 ))
709+ println (" " , _format (time () - model. start_time))
675710 end
676- println ()
677711 return
678712end
713+
679714_format (x:: Int ) = Printf. @sprintf (" %5d" , x)
680715_format (x:: Float64 ) = Printf. @sprintf (" % .5e" , x)
681716_format (:: Nothing ) = " "
682717
683- function _compute_ideal_point (model:: Optimizer , start_time )
718+ function _compute_ideal_point (model:: Optimizer )
684719 for (i, f) in enumerate (MOI. Utilities. eachscalar (model. f))
685- if _check_premature_termination (model, start_time ) != = nothing
720+ if _check_premature_termination (model) != = nothing
686721 return
687722 end
688723 if ! isnan (model. ideal_point[i])
@@ -767,11 +802,11 @@ function _check_interrupt(f)
767802 end
768803end
769804
770- function _check_premature_termination (model:: Optimizer , start_time :: Float64 )
805+ function _check_premature_termination (model:: Optimizer )
771806 return _check_interrupt () do
772807 time_limit = MOI. get (model, MOI. TimeLimitSec ())
773808 if time_limit != = nothing
774- time_remaining = time_limit - (time () - start_time)
809+ time_remaining = time_limit - (time () - model . start_time)
775810 if time_remaining <= 0
776811 return MOI. TIME_LIMIT
777812 end
@@ -789,7 +824,7 @@ function MOI.optimize!(model::Optimizer)
789824end
790825
791826function _optimize! (model:: Optimizer )
792- start_time = time ()
827+ model . start_time = time ()
793828 empty! (model. solutions)
794829 model. termination_status = MOI. OPTIMIZE_NOT_CALLED
795830 model. subproblem_count = 0
@@ -801,9 +836,9 @@ function _optimize!(model::Optimizer)
801836 if ! model. silent
802837 print (" Iter." )
803838 for i in 1 : MOI. output_dimension (model. f)
804- print (lpad (" Obj. $i " , 13 ))
839+ print (lpad (" Obj. $i " , 13 ))
805840 end
806- println ()
841+ println (" Time " )
807842 end
808843 # We need to clear the ideal point prior to starting the solve. Algorithms
809844 # may update this during the solve, otherwise we will update it at the end.
@@ -819,12 +854,12 @@ function _optimize!(model::Optimizer)
819854 println (" Found $(length (model. solutions)) solutions" )
820855 end
821856 if MOI. get (model, ComputeIdealPoint ())
822- _compute_ideal_point (model, start_time )
857+ _compute_ideal_point (model)
823858 end
824859 if MOI. supports (model. inner, MOI. TimeLimitSec ())
825860 MOI. set (model. inner, MOI. TimeLimitSec (), nothing )
826861 end
827- model. solve_time = time () - start_time
862+ model. solve_time = time () - model . start_time
828863 return
829864end
830865
0 commit comments