using Optim
using BenchmarkTools
rosenbrock(x) = (1.0 - x[1])^2 + 100.0 * (x[2] - x[1]^2)^2
x0 = zeros(2)
method = BFGS()
@btime optimize($rosenbrock, $x0, $method)
method = NelderMead()
@btime optimize($rosenbrock, $x0, $method)
@btime optimize(rosenbrock, zeros(2), LBFGS())
@btime optimize(rosenbrock, zeros(2), LBFGS(); autodiff = :forward)
# inplace function, which mutates an array passed by Optim
function rosenbrock_gradient!(G, x)
G[1] = -2.0 * (1.0 - x[1]) - 400.0 * (x[2] - x[1]^2) * x[1]
G[2] = 200.0 * (x[2] - x[1]^2)
end
# check allocations
@btime optimize(rosenbrock, rosenbrock_gradient!, zeros(2))
# this function allocates
function rosenbrock_gradient(x)
G = similar(x)
G[1] = -2.0 * (1.0 - x[1]) - 400.0 * (x[2] - x[1]^2) * x[1]
G[2] = 200.0 * (x[2] - x[1]^2)
end
# this version should have more allocations
@btime optimize(rosenbrock, rosenbrock_gradient, zeros(2); inplace = false)
versioninfo()
println(now())
for i in 1:1000
optimize(rosenbrock, zeros(2), NelderMead())
end
println(now())
Pkg.status("Optim")