@@ -170,6 +170,7 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
170170 f:: Union{Nothing,MOI.AbstractVectorFunction}
171171 solutions:: Vector{SolutionPoint}
172172 termination_status:: MOI.TerminationStatusCode
173+ silent:: Bool
173174 time_limit_sec:: Union{Nothing,Float64}
174175 solve_time:: Float64
175176 ideal_point:: Vector{Float64}
@@ -178,12 +179,17 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
178179 optimizer_factory:: Any
179180
180181 function Optimizer (optimizer_factory)
182+ inner = MOI. instantiate (optimizer_factory; with_cache_type = Float64)
183+ if MOI. supports (inner, MOI. Silent ())
184+ MOI. set (inner, MOI. Silent (), true )
185+ end
181186 return new (
182- MOI . instantiate (optimizer_factory; with_cache_type = Float64) ,
187+ inner ,
183188 nothing ,
184189 nothing ,
185190 SolutionPoint[],
186191 MOI. OPTIMIZE_NOT_CALLED,
192+ false ,
187193 nothing ,
188194 NaN ,
189195 Float64[],
@@ -220,6 +226,17 @@ function MOI.copy_to(dest::Optimizer, src::MOI.ModelLike)
220226 return MOI. Utilities. default_copy_to (dest, src)
221227end
222228
229+ # ## Silent
230+
231+ MOI. supports (:: Optimizer , :: MOI.Silent ) = true
232+
233+ MOI. get (model:: Optimizer , :: MOI.Silent ) = model. silent
234+
235+ function MOI. set (model:: Optimizer , :: MOI.Silent , value:: Bool )
236+ model. silent = value
237+ return
238+ end
239+
223240# ## TimeLimitSec
224241
225242function MOI. supports (model:: Optimizer , attr:: MOI.TimeLimitSec )
@@ -628,6 +645,8 @@ function MOI.delete(model::Optimizer, ci::MOI.ConstraintIndex)
628645 return
629646end
630647
648+ import Printf
649+
631650"""
632651 optimize_inner!(model::Optimizer)
633652
@@ -646,6 +665,21 @@ function optimize_inner!(model::Optimizer)
646665 return
647666end
648667
668+ function _log_solution (model:: Optimizer , Y)
669+ if model. silent
670+ return
671+ end
672+ print (_format (model. subproblem_count))
673+ for y in Y
674+ print (" " , _format (y))
675+ end
676+ println ()
677+ return
678+ end
679+ _format (x:: Int ) = Printf. @sprintf (" %5d" , x)
680+ _format (x:: Float64 ) = Printf. @sprintf (" % .5e" , x)
681+ _format (:: Nothing ) = " "
682+
649683function _compute_ideal_point (model:: Optimizer , start_time)
650684 for (i, f) in enumerate (MOI. Utilities. eachscalar (model. f))
651685 if _check_premature_termination (model, start_time) != = nothing
@@ -764,6 +798,13 @@ function _optimize!(model::Optimizer)
764798 empty! (model. ideal_point)
765799 return
766800 end
801+ if ! model. silent
802+ print (" Iter." )
803+ for i in 1 : MOI. output_dimension (model. f)
804+ print (lpad (" Obj. $i " , 13 ))
805+ end
806+ println ()
807+ end
767808 # We need to clear the ideal point prior to starting the solve. Algorithms
768809 # may update this during the solve, otherwise we will update it at the end.
769810 model. ideal_point = fill (NaN , MOI. output_dimension (model. f))
@@ -774,6 +815,9 @@ function _optimize!(model::Optimizer)
774815 model. solutions = solutions
775816 _sort! (model. solutions, MOI. get (model, MOI. ObjectiveSense ()))
776817 end
818+ if ! model. silent
819+ println (" Found $(length (model. solutions)) solutions" )
820+ end
777821 if MOI. get (model, ComputeIdealPoint ())
778822 _compute_ideal_point (model, start_time)
779823 end
0 commit comments