66 lines
3.0 KiB
Python
66 lines
3.0 KiB
Python
from ._trustregion import (_minimize_trust_region)
|
|
from ._trlib import (get_trlib_quadratic_subproblem)
|
|
|
|
__all__ = ['_minimize_trust_krylov']
|
|
|
|
def _minimize_trust_krylov(fun, x0, args=(), jac=None, hess=None, hessp=None,
|
|
inexact=True, **trust_region_options):
|
|
"""
|
|
Minimization of a scalar function of one or more variables using
|
|
a nearly exact trust-region algorithm that only requires matrix
|
|
vector products with the hessian matrix.
|
|
|
|
.. versionadded:: 1.0.0
|
|
|
|
Options
|
|
-------
|
|
inexact : bool, optional
|
|
Accuracy to solve subproblems. If True requires less nonlinear
|
|
iterations, but more vector products.
|
|
"""
|
|
|
|
if jac is None:
|
|
raise ValueError('Jacobian is required for trust region ',
|
|
'exact minimization.')
|
|
if hess is None and hessp is None:
|
|
raise ValueError('Either the Hessian or the Hessian-vector product '
|
|
'is required for Krylov trust-region minimization')
|
|
|
|
# tol_rel specifies the termination tolerance relative to the initial
|
|
# gradient norm in the Krylov subspace iteration.
|
|
|
|
# - tol_rel_i specifies the tolerance for interior convergence.
|
|
# - tol_rel_b specifies the tolerance for boundary convergence.
|
|
# in nonlinear programming applications it is not necessary to solve
|
|
# the boundary case as exact as the interior case.
|
|
|
|
# - setting tol_rel_i=-2 leads to a forcing sequence in the Krylov
|
|
# subspace iteration leading to quadratic convergence if eventually
|
|
# the trust region stays inactive.
|
|
# - setting tol_rel_b=-3 leads to a forcing sequence in the Krylov
|
|
# subspace iteration leading to superlinear convergence as long
|
|
# as the iterates hit the trust region boundary.
|
|
|
|
# For details consult the documentation of trlib_krylov_min
|
|
# in _trlib/trlib_krylov.h
|
|
#
|
|
# Optimality of this choice of parameters among a range of possibilities
|
|
# has been tested on the unconstrained subset of the CUTEst library.
|
|
|
|
if inexact:
|
|
return _minimize_trust_region(fun, x0, args=args, jac=jac,
|
|
hess=hess, hessp=hessp,
|
|
subproblem=get_trlib_quadratic_subproblem(
|
|
tol_rel_i=-2.0, tol_rel_b=-3.0,
|
|
disp=trust_region_options.get('disp', False)
|
|
),
|
|
**trust_region_options)
|
|
else:
|
|
return _minimize_trust_region(fun, x0, args=args, jac=jac,
|
|
hess=hess, hessp=hessp,
|
|
subproblem=get_trlib_quadratic_subproblem(
|
|
tol_rel_i=1e-8, tol_rel_b=1e-6,
|
|
disp=trust_region_options.get('disp', False)
|
|
),
|
|
**trust_region_options)
|