Source code for pyhf.optimize.opt_scipy

"""scipy.optimize-based Optimizer using finite differences."""

from scipy.optimize import minimize
import logging

log = logging.getLogger(__name__)


[docs]class scipy_optimizer(object): """scipy.optimize-based Optimizer using finite differences."""
[docs] def __init__(self, **kwargs): """Create scipy.optimize-based Optimizer.""" self.maxiter = kwargs.get('maxiter', 100000)
[docs] def minimize( self, objective, data, pdf, init_pars, par_bounds, fixed_vals=None, return_fitted_val=False, ): """ Find Function Parameters that minimize the Objective. Returns: bestfit parameters """ fixed_vals = fixed_vals or [] indices = [i for i, _ in fixed_vals] values = [v for _, v in fixed_vals] constraints = [{'type': 'eq', 'fun': lambda v: v[indices] - values}] result = minimize( objective, init_pars, constraints=constraints, method='SLSQP', args=(data, pdf), bounds=par_bounds, options=dict(maxiter=self.maxiter), ) try: assert result.success except AssertionError: log.error(result) raise if return_fitted_val: return result.x, result.fun return result.x