PyCMA.jl

PyCMA is a Python implementation of CMA-ES and a few related numerical optimization tools. OptimizationPyCMA.jl gives access to the CMA-ES optimizer through the unified Optimization.jl interface just like any native Julia optimizer.

OptimizationPyCMA.jl relies on PythonCall. A minimal Python distribution containing PyCMA will be installed automatically on first use, so no manual Python set-up is required.

Installation: OptimizationPyCMA.jl

import Pkg
Pkg.add("OptimizationPyCMA")

Methods

PyCMAOpt supports the usual keyword arguments maxiters, maxtime, abstol, reltol, callback in addition to any PyCMA-specific options (passed verbatim via keyword arguments to solve).

Example

using OptimizationPyCMA

rosenbrock(x, p) = (p[1] - x[1])^2 + p[2] * (x[2] - x[1]^2)^2
x0 = zeros(2)
_p = [1.0, 100.0]
l1 = rosenbrock(x0, _p)
f = OptimizationFunction(rosenbrock)
prob = OptimizationProblem(f, x0, _p, lb = [-1.0, -1.0], ub = [0.8, 0.8])
sol = solve(prob, PyCMAOpt())
retcode: Success
u: 2-element Vector{Float64}:
 0.7999999999999994
 0.6400000002251608

Passing solver-specific options

Any keyword that Optimization.jl does not interpret is forwarded directly to PyCMA.

In the event an Optimization.jl keyword overlaps with a PyCMA keyword, the Optimization.jl keyword takes precedence.

An exhaustive list of keyword arguments can be found by running the following python script:

import cma
options = cma.CMAOptions()
print(options)

An example passing the PyCMA keywords "verbose" and "seed":

sol = solve(prob, PyCMA(), verbose = -9, seed = 42)

Troubleshooting

The original Python result object is attached to the solution in the original field:

sol = solve(prob, PyCMAOpt())
println(sol.original)

Contributing

Bug reports and feature requests are welcome in the Optimization.jl issue tracker. Pull requests that improve either the Julia wrapper or the documentation are highly appreciated.