Source code for geomfum.numerics.optimization
"""Optimization routines."""
import logging
import geomstats.backend as gs
import scipy
from geomstats.numerics._common import result_to_backend_type
# TODO: homogenize with geomstats
[docs]
class ScipyMinimize:
"""Wrapper for scipy.optimize.minimize."""
def __init__(
self,
method="L-BFGS-B",
bounds=None,
constraints=(),
tol=None,
callback=None,
options=None,
save_result=False,
):
self.method = method
self.bounds = bounds
self.constraints = constraints
self.tol = tol
self.callback = callback
self.options = options
self.save_result = save_result
self.result_ = None
[docs]
def minimize(self, fun, x0, fun_jac=None, fun_hess=None, hessp=None):
"""Minimize objective function.
Parameters
----------
fun : callable
The objective function to be minimized.
x0 : array-like
Initial guess.
fun_jac : callable
Jacobian of fun.
fun_hess : callable
Hessian of fun.
hessp : callable
"""
fun_ = lambda x: fun(gs.from_numpy(x))
fun_jac_ = lambda x: fun_jac(gs.from_numpy(x))
if x0.ndim > 1:
# TODO: consider value_and_jac
# TODO: consider hessian
shape = x0.shape
fun_ = lambda x: fun(gs.reshape(gs.from_numpy(x), shape))
fun_jac_ = lambda x: fun_jac(gs.from_numpy(x).reshape(shape)).flatten()
x0 = x0.flatten()
result = scipy.optimize.minimize(
fun_,
x0,
method=self.method,
jac=fun_jac_,
hess=fun_hess,
hessp=hessp,
bounds=self.bounds,
tol=self.tol,
constraints=self.constraints,
callback=self.callback,
options=self.options,
)
result = result_to_backend_type(result)
if not result.success:
logging.warning(result.message)
if self.save_result:
self.result_ = result
return result