Optim.jl icon indicating copy to clipboard operation
Optim.jl copied to clipboard

Fminbox incompatible with ParticleSwarm and SimulatedAnnealing

Open ValentinKaisermayer opened this issue 4 years ago • 1 comments

The documentation does not state that not all optimzers are valid inner optimizers for Fminbox: https://julianlsolvers.github.io/Optim.jl/stable/#user/minimization/#box-constrained-optimization

using Optim

f(x) = (1.0 - x[1])^2 + 100.0 * (x[2] - x[1]^2)^2
lower = [1.25, -2.1]
upper = [Inf, Inf]
initial_x = [2.0, 2.0]

However, at least for ParticleSwarm and SimulatedAnnealing it does not work.

julia> sol = optimize(f, lower, upper, initial_x, Fminbox(ParticleSwarm()))
ERROR: MethodError: no method matching reset!(::ParticleSwarm{Any}, ::Optim.ParticleSwarmState{Vector{Float64}, Float64}, ::Optim.BarrierWrapper{OnceDifferentiable{Float64, Vector{Float64}, Vector{Float64}}, Optim.BoxBarrier{Vector{Float64}, Vector{Float64}}, Float64, Float64, Vector{Float64}}, ::Vector{Float64})
Closest candidates are:
  reset!(::Any, ::Optim.GradientDescentState, ::Any, ::Any) at .julia\packages\Optim\3K7JI\src\multivariate\solvers\first_order\gradient_descent.jl:46
  reset!(::Any, ::Optim.BFGSState, ::Any, ::Any) at .julia\packages\Optim\3K7JI\src\multivariate\solvers\first_order\bfgs.jl:69
  reset!(::Any, ::Optim.LBFGSState, ::Any, ::Any) at .julia\packages\Optim\3K7JI\src\multivariate\solvers\first_order\l_bfgs.jl:151
  ...
Stacktrace:
 [1] optimize(df::OnceDifferentiable{Float64, Vector{Float64}, Vector{Float64}}, l::Vector{Float64}, u::Vector{Float64}, initial_x::Vector{Float64}, F::Fminbox{ParticleSwarm{Any}, Float64, Optim.var"#47#49"}, options::Optim.Options{Float64, Nothing})
   @ Optim .julia\packages\Optim\3K7JI\src\multivariate\solvers\constrained\fminbox.jl:388
 [2] optimize(f::Function, l::Vector{Float64}, u::Vector{Float64}, initial_x::Vector{Float64}, F::Fminbox{ParticleSwarm{Any}, Float64, Optim.var"#47#49"}, options::Optim.Options{Float64, Nothing}; inplace::Bool, autodiff::Symbol)
   @ Optim .julia\packages\Optim\3K7JI\src\multivariate\solvers\constrained\fminbox.jl:269
 [3] optimize(f::Function, l::Vector{Float64}, u::Vector{Float64}, initial_x::Vector{Float64}, F::Fminbox{ParticleSwarm{Any}, Float64, Optim.var"#47#49"}, options::Optim.Options{Float64, Nothing}) (repeats 2 times)
   @ Optim .julia\packages\Optim\3K7JI\src\multivariate\solvers\constrained\fminbox.jl:265
 [4] top-level scope
   @ REPL[6]:1
julia> sol = optimize(f, lower, upper, initial_x, Fminbox(SimulatedAnnealing()))
ERROR: MethodError: no method matching reset!(::SimulatedAnnealing{typeof(Optim.default_neighbor!), typeof(Optim.log_temperature)}, ::Optim.SimulatedAnnealingState{Vector{Float64}, Float64}, ::Optim.BarrierWrapper{OnceDifferentiable{Float64, Vector{Float64}, Vector{Float64}}, Optim.BoxBarrier{Vector{Float64}, Vector{Float64}}, Float64, Float64, Vector{Float64}}, ::Vector{Float64})
Closest candidates are:
  reset!(::Any, ::Optim.GradientDescentState, ::Any, ::Any) at .julia\packages\Optim\3K7JI\src\multivariate\solvers\first_order\gradient_descent.jl:46
  reset!(::Any, ::Optim.BFGSState, ::Any, ::Any) at .julia\packages\Optim\3K7JI\src\multivariate\solvers\first_order\bfgs.jl:69
  reset!(::Any, ::Optim.LBFGSState, ::Any, ::Any) at .julia\packages\Optim\3K7JI\src\multivariate\solvers\first_order\l_bfgs.jl:151
  ...
Stacktrace:
 [1] optimize(df::OnceDifferentiable{Float64, Vector{Float64}, Vector{Float64}}, l::Vector{Float64}, u::Vector{Float64}, initial_x::Vector{Float64}, F::Fminbox{SimulatedAnnealing{typeof(Optim.default_neighbor!), typeof(Optim.log_temperature)}, Float64, Optim.var"#47#49"}, options::Optim.Options{Float64, Nothing})
   @ Optim .julia\packages\Optim\3K7JI\src\multivariate\solvers\constrained\fminbox.jl:388
 [2] optimize(f::Function, l::Vector{Float64}, u::Vector{Float64}, initial_x::Vector{Float64}, F::Fminbox{SimulatedAnnealing{typeof(Optim.default_neighbor!), typeof(Optim.log_temperature)}, Float64, Optim.var"#47#49"}, 
options::Optim.Options{Float64, Nothing}; inplace::Bool, autodiff::Symbol)
   @ Optim .julia\packages\Optim\3K7JI\src\multivariate\solvers\constrained\fminbox.jl:269
 [3] optimize(f::Function, l::Vector{Float64}, u::Vector{Float64}, initial_x::Vector{Float64}, F::Fminbox{SimulatedAnnealing{typeof(Optim.default_neighbor!), typeof(Optim.log_temperature)}, Float64, Optim.var"#47#49"}, 
options::Optim.Options{Float64, Nothing}) (repeats 2 times)
   @ Optim .julia\packages\Optim\3K7JI\src\multivariate\solvers\constrained\fminbox.jl:265
 [4] top-level scope
   @ REPL[10]:1

ValentinKaisermayer avatar Oct 19 '21 12:10 ValentinKaisermayer

is any solution for Optim.jl actually doesn't work at v1.7

PharmCat avatar Jun 29 '22 13:06 PharmCat