Optim.jl
Optim.jl copied to clipboard
Fminbox incompatible with ParticleSwarm and SimulatedAnnealing
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
is any solution for Optim.jl actually doesn't work at v1.7