Source code for pyadjoint_utils.minimize

from pyadjoint import minimize as pyadjoint_minimize
from .callback import Callback, FileLoggerCallback, CallbackCombiner
from typing import Sequence, Callable, Union, Optional


class _default:
    pass


[docs]def minimize( rf, method="L-BFGS-B", scale=1.0, callbacks=_default(), **kwargs, ): """CRIKit's wrapper around `pyadjoint`'s `minimize` function that itself calls `scipy`'s minimization routines. See pyadjoint's documentation for information on `kwargs`, which are passed through to pyadjoint's `minimize` function. :param rf: The functional to optimize :type rf: ReducedFunctional :param method: The optimization method used, defaults to `'L-BFGS-B'` :type method: str :param scale: Scale the loss functional by this amount, defaults to `1.0` :type scale: float :param callbacks: A list or tuple of callback functions or classes to combine into one callback, or a single such callback function, or None if no callback is desired. Defaults to a {class}`FileLoggerCallback` with default arguments :type callbacks: Optional[Sequence[Union[Callable, Callback]]] """ if isinstance(callbacks, _default): if "callback" in kwargs: callbacks = kwargs["callback"] else: callbacks = FileLoggerCallback(rf=rf) if isinstance(callbacks, (list, tuple)): callback = CallbackCombiner(callbacks) elif callable(callbacks): if isinstance(callbacks, FileLoggerCallback): # in the default case, make sure the callback has acccess to # the rf being minimized. If the user has passed # `write_params=False` to its ctor, this will have no effect if callbacks.rf is None: callbacks.rf = rf callback = callbacks else: callback = callbacks kwargs["callback"] = callback return pyadjoint_minimize(rf, method=method, scale=scale, **kwargs)