1- abstract type AbstractOptimizationSolution end # experimental; comments welcome
2- mutable struct OptimizationSolution{O, Tx, Tf, Tls, Tsb} <: AbstractOptimizationSolution
3- method:: O
4- initial_x:: Tx
5- minimizer:: Tx
6- minimum:: Tf
7- iterations:: Int
8- iteration_converged:: Bool
9- ls_success:: Tls
10- time_run:: Float64
11- stopped_by:: Tsb
12- end
13-
14- function Base. show (io:: IO , r:: AbstractOptimizationSolution )
15- take = Iterators. take
16- failure_string = " failure"
17- if isa (r. ls_success, Bool) && ! r. ls_success
18- failure_string *= " (line search failed)"
19- end
20-
21- @printf io " * Status: %s\n\n " r. iteration_converged ? " success" : failure_string
22- @printf io " * Candidate solution\n "
23- fmt = " Final objective value: %e " * repeat (" , %e " ,length (r. minimum)- 1 )* " \n "
24- @eval @printf ($ io, $ fmt, $ r. minimum... )
25- # @printf io " Final objective value: %e\n" r.minimum
26- @printf io " \n "
27- @printf io " * Found with\n "
28- @printf io " Algorithm: %s\n " r. method
29- return
30- end
31-
321struct NullData end
332const DEFAULT_DATA = Iterators. cycle ((NullData (),))
343Base. iterate (:: NullData , i= 1 ) = nothing
@@ -38,14 +7,6 @@ get_maxiters(data) = Iterators.IteratorSize(typeof(DEFAULT_DATA)) isa Iterators.
387 Iterators. IteratorSize (typeof (DEFAULT_DATA)) isa Iterators. SizeUnknown ?
398 typemax (Int) : length (data)
409
41- struct EnsembleOptimizationProblem
42- prob:: Array{T, 1} where T<: OptimizationProblem
43- end
44-
45- function DiffEqBase. solve (prob:: Union{OptimizationProblem,EnsembleOptimizationProblem} , opt, args... ;kwargs... )
46- __solve (prob, opt, args... ; kwargs... )
47- end
48-
4910#=
5011function update!(x::AbstractArray, x̄::AbstractArray{<:ForwardDiff.Dual})
5112 x .-= x̄
@@ -159,15 +120,8 @@ function __solve(prob::OptimizationProblem, opt, data = DEFAULT_DATA;
159120
160121 _time = time ()
161122
162- OptimizationSolution (opt,
163- prob. u0,# initial_x,
164- θ, # pick_best_x(f_incr_pick, state),
165- save_best ? first (min_err) : first (x), # pick_best_f(f_incr_pick, state, d),
166- maxiters, # iteration,
167- maxiters >= maxiters, # iteration == options.iterations,
168- true ,
169- _time- t0,
170- NamedTuple ())
123+ SciMLBase. build_solution (prob, opt, θ, x[1 ])
124+ # here should be build_solution to create the output message
171125end
172126
173127
@@ -225,8 +179,16 @@ function __solve(prob::OptimizationProblem, opt::Optim.AbstractOptimizer,
225179 optim_f = TwiceDifferentiable (_loss, (G, θ) -> f. grad (G, θ, cur... ), fg!, (H,θ) -> f. hess (H,θ,cur... ), prob. u0)
226180 end
227181
228- Optim. optimize (optim_f, prob. u0, opt, ! (isnothing (maxiters)) ? Optim. Options (;extended_trace = true , callback = _cb, iterations = maxiters, kwargs... )
229- : Optim. Options (;extended_trace = true , callback = _cb, kwargs... ))
182+ original = Optim. optimize (optim_f, prob. u0, opt,
183+ ! (isnothing (maxiters)) ?
184+ Optim. Options (;extended_trace = true ,
185+ callback = _cb,
186+ iterations = maxiters,
187+ kwargs... ) :
188+ Optim. Options (;extended_trace = true ,
189+ callback = _cb, kwargs... ))
190+ SciMLBase. build_solution (prob, opt, original. minimizer,
191+ original. minimum; original= original)
230192end
231193
232194function __solve (prob:: OptimizationProblem , opt:: Union{Optim.Fminbox,Optim.SAMIN} ,
@@ -276,8 +238,14 @@ function __solve(prob::OptimizationProblem, opt::Union{Optim.Fminbox,Optim.SAMIN
276238 end
277239 optim_f = OnceDifferentiable (_loss, f. grad, fg!, prob. u0)
278240
279- Optim. optimize (optim_f, prob. lb, prob. ub, prob. u0, opt, ! (isnothing (maxiters)) ? Optim. Options (;extended_trace = true , callback = _cb, iterations = maxiters, kwargs... )
280- : Optim. Options (;extended_trace = true , callback = _cb, kwargs... ))
241+ original = Optim. optimize (optim_f, prob. lb, prob. ub, prob. u0, opt,
242+ ! (isnothing (maxiters)) ? Optim. Options (;
243+ extended_trace = true , callback = _cb,
244+ iterations = maxiters, kwargs... ) :
245+ Optim. Options (;extended_trace = true ,
246+ callback = _cb, kwargs... ))
247+ SciMLBase. build_solution (prob, opt, original. minimizer,
248+ original. minimum; original= original)
281249end
282250
283251
@@ -345,8 +313,14 @@ function __solve(prob::OptimizationProblem, opt::Optim.ConstrainedOptimizer,
345313 ub = prob. ub === nothing ? [] : prob. ub
346314 optim_fc = TwiceDifferentiableConstraints (cons!, cons_j!, cons_hl!, lb, ub, prob. lcons, prob. ucons)
347315
348- Optim. optimize (optim_f, optim_fc, prob. u0, opt, ! (isnothing (maxiters)) ? Optim. Options (;extended_trace = true , callback = _cb, iterations = maxiters, kwargs... )
349- : Optim. Options (;extended_trace = true , callback = _cb, kwargs... ))
316+ original = Optim. optimize (optim_f, optim_fc, prob. u0, opt,
317+ ! (isnothing (maxiters)) ? Optim. Options (;
318+ extended_trace = true , callback = _cb,
319+ iterations = maxiters, kwargs... ) :
320+ Optim. Options (;extended_trace = true ,
321+ callback = _cb, kwargs... ))
322+ SciMLBase. build_solution (prob, opt, original. minimizer,
323+ original. minimum; original= original)
350324end
351325
352326
@@ -399,17 +373,8 @@ function __init__()
399373
400374 bboptre = ! (isnothing (maxiters)) ? BlackBoxOptim. bboptimize (_loss;Method = opt. method, SearchRange = [(prob. lb[i], prob. ub[i]) for i in 1 : length (prob. lb)], MaxSteps = maxiters, CallbackFunction = _cb, CallbackInterval = 0.0 , kwargs... ) : BlackBoxOptim. bboptimize (_loss;Method = opt. method, SearchRange = [(prob. lb[i], prob. ub[i]) for i in 1 : length (prob. lb)], CallbackFunction = _cb, CallbackInterval = 0.0 , kwargs... )
401375
402-
403- OptimizationSolution (opt. method,
404- [NaN ],# initial_x,
405- BlackBoxOptim. best_candidate (bboptre), # pick_best_x(f_incr_pick, state),
406- BlackBoxOptim. best_fitness (bboptre), # pick_best_f(f_incr_pick, state, d),
407- bboptre. iterations, # iteration,
408- ! (isnothing (maxiters)) ? bboptre. iterations >= maxiters : true , # iteration == options.iterations,
409- true ,
410- bboptre. elapsed_time,
411- NamedTuple ())
412-
376+ SciMLBase. build_solution (prob, opt, BlackBoxOptim. best_candidate (bboptre),
377+ BlackBoxOptim. best_fitness (bboptre); original= bboptre)
413378 end
414379
415380 function __solve (prob:: EnsembleOptimizationProblem , opt:: BBO , data = DEFAULT_DATA;
@@ -447,7 +412,7 @@ function __init__()
447412 end
448413
449414 _loss = function (θ)
450- x = ntuple (i-> first (prob. prob[i]. f (θ, prob. prob[i]. p, cur... )),length (prob. prob))
415+ x = ntuple (i-> first (prob. prob[i]. f (θ, prob. prob[i]. p, cur... )),length (prob. prob))
451416 return x
452417 end
453418
@@ -464,17 +429,8 @@ function __init__()
464429
465430 bboptre = ! (isnothing (maxiters)) ? BlackBoxOptim. bboptimize (_loss;Method = opt. method, SearchRange = [(multi_bounds. lb[i], multi_bounds. ub[i]) for i in 1 : length (multi_bounds. lb)], MaxSteps = maxiters, CallbackFunction = _cb, CallbackInterval = 0.0 , FitnessScheme= FitnessScheme, kwargs... ) : BlackBoxOptim. bboptimize (_loss;Method = opt. method, SearchRange = [(multi_bounds. lb[i], multi_bounds. ub[i]) for i in 1 : length (multi_bounds. lb)], CallbackFunction = _cb, CallbackInterval = 0.0 , FitnessScheme= FitnessScheme, kwargs... )
466431
467-
468- OptimizationSolution (opt. method,
469- [NaN ],# initial_x,
470- BlackBoxOptim. best_candidate (bboptre), # pick_best_x(f_incr_pick, state),
471- BlackBoxOptim. best_fitness (bboptre), # pick_best_f(f_incr_pick, state, d),
472- bboptre. iterations, # iteration,
473- ! (isnothing (maxiters)) ? bboptre. iterations >= maxiters : true , # iteration == options.iterations,
474- true ,
475- bboptre. elapsed_time,
476- NamedTuple ())
477-
432+ SciMLBase. build_solution (prob, opt, BlackBoxOptim. best_candidate (bboptre),
433+ BlackBoxOptim. best_fitness (bboptre); original= bboptre)
478434 end
479435 end
480436
@@ -528,15 +484,7 @@ function __init__()
528484 (minf,minx,ret) = NLopt. optimize (opt, prob. u0)
529485 _time = time ()
530486
531- OptimizationSolution (opt. algorithm,
532- prob. u0,# initial_x,
533- minx, # pick_best_x(f_incr_pick, state),
534- minf, # pick_best_f(f_incr_pick, state, d),
535- Int (opt. numevals), # iteration,
536- ! (isnothing (maxiters)) ? opt. numevals >= maxiters : true , # iteration == options.iterations,
537- ret,
538- _time- t0,
539- NamedTuple ())
487+ SciMLBase. build_solution (prob, opt, minx, minf; original= nothing )
540488 end
541489 end
542490
@@ -570,15 +518,7 @@ function __init__()
570518
571519 t1 = time ()
572520
573- OptimizationSolution (opt,
574- [NaN ],# initial_x,
575- p. location, # pick_best_x(f_incr_pick, state),
576- p. value, # pick_best_f(f_incr_pick, state, d),
577- local_maxiters,
578- local_maxiters>= opt. maxeval, # not sure if that's correct
579- true ,
580- t1 - t0,
581- NamedTuple ())
521+ SciMLBase. build_solution (prob, opt, p. location, p. value; original= p)
582522 end
583523 end
584524
@@ -613,15 +553,7 @@ function __init__()
613553 box = minimum (root)
614554 t1 = time ()
615555
616- OptimizationSolution (opt,
617- [NaN ],# initial_x,
618- QuadDIRECT. position (box, x0), # pick_best_x(f_incr_pick, state),
619- QuadDIRECT. value (box), # pick_best_f(f_incr_pick, state, d),
620- ! (isnothing (maxiters)) ? maxiters : 0 ,
621- box. qnconverged, # not sure if that's correct
622- true ,
623- t1 - t0,
624- NamedTuple ())
556+ SciMLBase. build_solution (prob, opt, QuadDIRECT. position (box, x0), QuadDIRECT. value (box); original= root)
625557 end
626558 end
627559
@@ -669,15 +601,7 @@ function __init__()
669601 : Evolutionary. Options (;callback = _cb, kwargs... ))
670602 t1 = time ()
671603
672- OptimizationSolution (summary (result),
673- prob. u0, # initial_x
674- Evolutionary. minimizer (result), # pick_best_x
675- minimum (result), # pick_best_f
676- Evolutionary. iterations (result), # iteration
677- Evolutionary. converged (result), # convergence status
678- true ,
679- t1 - t0,
680- NamedTuple ())
604+ SciMLBase. build_solution (prob, opt, Evolutionary. minimizer (result), Evolutionary. minimum (result); original= result)
681605 end
682606 end
683607 @require CMAEvolutionStrategy= " 8d3b24bd-414e-49e0-94fb-163cc3a3e411" begin
@@ -726,15 +650,7 @@ function __init__()
726650 criterion = false
727651 end
728652
729- OptimizationSolution (opt,
730- prob. u0,# initial_x,
731- result. logger. xbest[end ], # pick_best_x(f_incr_pick, state),
732- result. logger. fbest[end ], # pick_best_f(f_incr_pick, state, d),
733- length (result. logger. fbest),
734- criterion,
735- true ,
736- result. logger. times[end ] - result. logger. times[1 ],
737- NamedTuple ())
653+ SciMLBase. build_solution (prob, opt, result. logger. xbest[end ], result. logger. fbest[end ]; original= result)
738654 end
739655 end
740656end
0 commit comments