---------------------------------------------------------------------------
KeyboardInterrupt Traceback (most recent call last)
Cell In[11], line 8
1 pyhf.set_backend("numpy", "scipy")
3 mu_tests = np.linspace(15, 25, 10)
4 (
5 obs_limit,
6 exp_limit_and_bands,
7 (poi_tests, tests),
----> 8 ) = pyhf.infer.intervals.upper_limits.upper_limit(
9 data, model, scan=mu_tests, level=0.05, return_results=True
10 )
File /usr/local/venv/lib/python3.10/site-packages/pyhf/infer/intervals/upper_limits.py:252, in upper_limit(data, model, scan, level, return_results, **hypotest_kwargs)
210 """
211 Calculate an upper limit interval ``(0, poi_up)`` for a single Parameter of
212 Interest (POI) using root-finding or a linear scan through POI-space.
(...)
249 .. versionadded:: 0.7.0
250 """
251 if scan is not None:
--> 252 return linear_grid_scan(
253 data, model, scan, level, return_results, **hypotest_kwargs
254 )
255 # else:
256 bounds = model.config.suggested_bounds()[
257 model.config.par_slice(model.config.poi_name).start
258 ]
File /usr/local/venv/lib/python3.10/site-packages/pyhf/infer/intervals/upper_limits.py:189, in linear_grid_scan(data, model, scan, level, return_results, **hypotest_kwargs)
146 """
147 Calculate an upper limit interval ``(0, poi_up)`` for a single
148 Parameter of Interest (POI) using a linear scan through POI-space.
(...)
186 .. versionadded:: 0.7.0
187 """
188 tb, _ = get_backend()
--> 189 results = [
190 hypotest(mu, data, model, return_expected_set=True, **hypotest_kwargs)
191 for mu in scan
192 ]
193 obs = tb.astensor([[r[0]] for r in results])
194 exp = tb.astensor([[r[1][idx] for idx in range(5)] for r in results])
File /usr/local/venv/lib/python3.10/site-packages/pyhf/infer/intervals/upper_limits.py:190, in <listcomp>(.0)
146 """
147 Calculate an upper limit interval ``(0, poi_up)`` for a single
148 Parameter of Interest (POI) using a linear scan through POI-space.
(...)
186 .. versionadded:: 0.7.0
187 """
188 tb, _ = get_backend()
189 results = [
--> 190 hypotest(mu, data, model, return_expected_set=True, **hypotest_kwargs)
191 for mu in scan
192 ]
193 obs = tb.astensor([[r[0]] for r in results])
194 exp = tb.astensor([[r[1][idx] for idx in range(5)] for r in results])
File /usr/local/venv/lib/python3.10/site-packages/pyhf/infer/__init__.py:169, in hypotest(poi_test, data, pdf, init_pars, par_bounds, fixed_params, calctype, return_tail_probs, return_expected, return_expected_set, return_calculator, **kwargs)
157 _check_hypotest_prerequisites(pdf, data, init_pars, par_bounds, fixed_params)
159 calc = utils.create_calculator(
160 calctype,
161 data,
(...)
166 **kwargs,
167 )
--> 169 teststat = calc.teststatistic(poi_test)
170 sig_plus_bkg_distribution, bkg_only_distribution = calc.distributions(poi_test)
172 tb, _ = get_backend()
File /usr/local/venv/lib/python3.10/site-packages/pyhf/infer/calculators.py:389, in AsymptoticCalculator.teststatistic(self, poi_test)
378 asimov_mu = 1.0 if self.test_stat == 'q0' else 0.0
380 asimov_data, asimov_mubhathat = generate_asimov_data(
381 asimov_mu,
382 self.data,
(...)
387 return_fitted_pars=True,
388 )
--> 389 qmuA_v, (mubhathat_A, muhatbhat_A) = teststat_func(
390 poi_test,
391 asimov_data,
392 self.pdf,
393 self.init_pars,
394 self.par_bounds,
395 self.fixed_params,
396 return_fitted_pars=True,
397 )
398 self.sqrtqmuA_v = tensorlib.sqrt(qmuA_v)
399 self.fitted_pars = HypoTestFitResults(
400 asimov_pars=asimov_mubhathat,
401 free_fit_to_data=muhatbhat,
(...)
404 fixed_poi_fit_to_asimov=mubhathat_A,
405 )
File /usr/local/venv/lib/python3.10/site-packages/pyhf/infer/test_statistics.py:234, in qmu_tilde(mu, data, pdf, init_pars, par_bounds, fixed_params, return_fitted_pars)
229 if par_bounds[pdf.config.poi_index][0] != 0:
230 log.warning(
231 'qmu_tilde test statistic used for fit configuration with POI not bounded at zero.\n'
232 + 'Use the qmu test statistic (pyhf.infer.test_statistics.qmu) instead.'
233 )
--> 234 return _qmu_like(
235 mu,
236 data,
237 pdf,
238 init_pars,
239 par_bounds,
240 fixed_params,
241 return_fitted_pars=return_fitted_pars,
242 )
File /usr/local/venv/lib/python3.10/site-packages/pyhf/infer/test_statistics.py:27, in _qmu_like(mu, data, pdf, init_pars, par_bounds, fixed_params, return_fitted_pars)
19 """
20 Clipped version of _tmu_like where the returned test statistic
21 is 0 if muhat > 0 else tmu_like_stat.
(...)
24 qmu_tilde. Otherwise this is qmu (no tilde).
25 """
26 tensorlib, optimizer = get_backend()
---> 27 tmu_like_stat, (mubhathat, muhatbhat) = _tmu_like(
28 mu, data, pdf, init_pars, par_bounds, fixed_params, return_fitted_pars=True
29 )
30 qmu_like_stat = tensorlib.where(
31 muhatbhat[pdf.config.poi_index] > mu, tensorlib.astensor(0.0), tmu_like_stat
32 )
33 if return_fitted_pars:
File /usr/local/venv/lib/python3.10/site-packages/pyhf/infer/test_statistics.py:51, in _tmu_like(mu, data, pdf, init_pars, par_bounds, fixed_params, return_fitted_pars)
47 tensorlib, optimizer = get_backend()
48 mubhathat, fixed_poi_fit_lhood_val = fixed_poi_fit(
49 mu, data, pdf, init_pars, par_bounds, fixed_params, return_fitted_val=True
50 )
---> 51 muhatbhat, unconstrained_fit_lhood_val = fit(
52 data, pdf, init_pars, par_bounds, fixed_params, return_fitted_val=True
53 )
54 log_likelihood_ratio = fixed_poi_fit_lhood_val - unconstrained_fit_lhood_val
55 tmu_like_stat = tensorlib.astensor(
56 tensorlib.clip(log_likelihood_ratio, 0.0, max_value=None)
57 )
File /usr/local/venv/lib/python3.10/site-packages/pyhf/infer/mle.py:131, in fit(data, pdf, init_pars, par_bounds, fixed_params, **kwargs)
124 # get fixed vals from the model
125 fixed_vals = [
126 (index, init)
127 for index, (init, is_fixed) in enumerate(zip(init_pars, fixed_params))
128 if is_fixed
129 ]
--> 131 return opt.minimize(
132 twice_nll, data, pdf, init_pars, par_bounds, fixed_vals, **kwargs
133 )
File /usr/local/venv/lib/python3.10/site-packages/pyhf/optimize/mixins.py:193, in OptimizerMixin.minimize(self, objective, data, pdf, init_pars, par_bounds, fixed_vals, return_fitted_val, return_result_obj, return_uncertainties, return_correlations, do_grad, do_stitch, **kwargs)
190 par_names[index] = None
191 par_names = [name for name in par_names if name]
--> 193 result = self._internal_minimize(
194 **minimizer_kwargs, options=kwargs, par_names=par_names
195 )
196 result = self._internal_postprocess(
197 result, stitch_pars, return_uncertainties=return_uncertainties
198 )
200 _returns = [result.x]
File /usr/local/venv/lib/python3.10/site-packages/pyhf/optimize/mixins.py:52, in OptimizerMixin._internal_minimize(self, func, x0, do_grad, bounds, fixed_vals, options, par_names)
34 def _internal_minimize(
35 self,
36 func,
(...)
42 par_names=None,
43 ):
44 minimizer = self._get_minimizer(
45 func,
46 x0,
(...)
50 par_names=par_names,
51 )
---> 52 result = self._minimize(
53 minimizer,
54 func,
55 x0,
56 do_grad=do_grad,
57 bounds=bounds,
58 fixed_vals=fixed_vals,
59 options=options,
60 )
62 try:
63 assert result.success
File /usr/local/venv/lib/python3.10/site-packages/pyhf/optimize/opt_scipy.py:93, in scipy_optimizer._minimize(self, minimizer, func, x0, do_grad, bounds, fixed_vals, options)
90 else:
91 constraints = []
---> 93 return minimizer(
94 func,
95 x0,
96 method=method,
97 jac=do_grad,
98 bounds=bounds,
99 constraints=constraints,
100 tol=tolerance,
101 options=dict(maxiter=maxiter, disp=bool(verbose), **solver_options),
102 )
File /usr/local/venv/lib/python3.10/site-packages/scipy/optimize/_minimize.py:705, in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options)
702 res = _minimize_cobyla(fun, x0, args, constraints, callback=callback,
703 **options)
704 elif meth == 'slsqp':
--> 705 res = _minimize_slsqp(fun, x0, args, jac, bounds,
706 constraints, callback=callback, **options)
707 elif meth == 'trust-constr':
708 res = _minimize_trustregion_constr(fun, x0, args, jac, hess, hessp,
709 bounds, constraints,
710 callback=callback, **options)
File /usr/local/venv/lib/python3.10/site-packages/scipy/optimize/_slsqp_py.py:432, in _minimize_slsqp(func, x0, args, jac, bounds, constraints, maxiter, ftol, iprint, disp, eps, callback, finite_diff_rel_step, **unknown_options)
429 c = _eval_constraint(x, cons)
431 if mode == -1: # gradient evaluation required
--> 432 g = append(wrapped_grad(x), 0.0)
433 a = _eval_con_normals(x, cons, la, n, m, meq, mieq)
435 if majiter > majiter_prev:
436 # call callback if major iteration has incremented
File /usr/local/venv/lib/python3.10/site-packages/scipy/optimize/_optimize.py:346, in _clip_x_for_func.<locals>.eval(x)
344 def eval(x):
345 x = _check_clip_x(x, bounds)
--> 346 return func(x)
File /usr/local/venv/lib/python3.10/site-packages/scipy/optimize/_differentiable_functions.py:273, in ScalarFunction.grad(self, x)
271 if not np.array_equal(x, self.x):
272 self._update_x_impl(x)
--> 273 self._update_grad()
274 return self.g
File /usr/local/venv/lib/python3.10/site-packages/scipy/optimize/_differentiable_functions.py:256, in ScalarFunction._update_grad(self)
254 def _update_grad(self):
255 if not self.g_updated:
--> 256 self._update_grad_impl()
257 self.g_updated = True
File /usr/local/venv/lib/python3.10/site-packages/scipy/optimize/_differentiable_functions.py:173, in ScalarFunction.__init__.<locals>.update_grad()
171 self._update_fun()
172 self.ngev += 1
--> 173 self.g = approx_derivative(fun_wrapped, self.x, f0=self.f,
174 **finite_diff_options)
File /usr/local/venv/lib/python3.10/site-packages/scipy/optimize/_numdiff.py:505, in approx_derivative(fun, x0, method, rel_step, abs_step, f0, bounds, sparsity, as_linear_operator, args, kwargs)
502 use_one_sided = False
504 if sparsity is None:
--> 505 return _dense_difference(fun_wrapped, x0, f0, h,
506 use_one_sided, method)
507 else:
508 if not issparse(sparsity) and len(sparsity) == 2:
File /usr/local/venv/lib/python3.10/site-packages/scipy/optimize/_numdiff.py:576, in _dense_difference(fun, x0, f0, h, use_one_sided, method)
574 x = x0 + h_vecs[i]
575 dx = x[i] - x0[i] # Recompute dx as exactly representable number.
--> 576 df = fun(x) - f0
577 elif method == '3-point' and use_one_sided[i]:
578 x1 = x0 + h_vecs[i]
File /usr/local/venv/lib/python3.10/site-packages/scipy/optimize/_numdiff.py:456, in approx_derivative.<locals>.fun_wrapped(x)
455 def fun_wrapped(x):
--> 456 f = np.atleast_1d(fun(x, *args, **kwargs))
457 if f.ndim > 1:
458 raise RuntimeError("`fun` return value has "
459 "more than 1 dimension.")
File /usr/local/venv/lib/python3.10/site-packages/scipy/optimize/_differentiable_functions.py:137, in ScalarFunction.__init__.<locals>.fun_wrapped(x)
133 self.nfev += 1
134 # Send a copy because the user may overwrite it.
135 # Overwriting results in undefined behaviour because
136 # fun(self.x) will change self.x, with the two no longer linked.
--> 137 fx = fun(np.copy(x), *args)
138 # Make sure the function returns a true scalar
139 if not np.isscalar(fx):
File /usr/local/venv/lib/python3.10/site-packages/pyhf/optimize/opt_numpy.py:30, in wrap_objective.<locals>.func(pars)
28 pars = tensorlib.astensor(pars)
29 constrained_pars = stitch_pars(pars)
---> 30 return objective(constrained_pars, data, pdf)[0]
File /usr/local/venv/lib/python3.10/site-packages/pyhf/infer/mle.py:53, in twice_nll(pars, data, pdf)
12 def twice_nll(pars, data, pdf):
13 r"""
14 Two times the negative log-likelihood of the model parameters, :math:`\left(\mu, \boldsymbol{\theta}\right)`, given the observed data.
15 It is used in the calculation of the test statistic, :math:`t_{\mu}`, as defined in Equation (8) in :xref:`arXiv:1007.1727`
(...)
51 Tensor: Two times the negative log-likelihood, :math:`-2\ln L\left(\mu, \boldsymbol{\theta}\right)`
52 """
---> 53 return -2 * pdf.logpdf(pars, data)
File /usr/local/venv/lib/python3.10/site-packages/pyhf/pdf.py:945, in Model.logpdf(self, pars, data)
938 if data.shape[-1] != self.nominal_rates.shape[-1] + len(
939 self.config.auxdata
940 ):
941 raise exceptions.InvalidPdfData(
942 f'eval failed as data has len {data.shape[-1]} but {self.config.nmaindata + self.config.nauxdata} was expected'
943 )
--> 945 result = self.make_pdf(pars).log_prob(data)
947 if (
948 not self.batch_size
949 ): # force to be not scalar, should we changed with #522
950 return tensorlib.reshape(result, (1,))
File /usr/local/venv/lib/python3.10/site-packages/pyhf/pdf.py:907, in Model.make_pdf(self, pars)
896 """
897 Construct a pdf object for a given set of parameter values.
898
(...)
904
905 """
906 pdfobjs = []
--> 907 mainpdf = self.main_model.make_pdf(pars)
908 if mainpdf:
909 pdfobjs.append(mainpdf)
File /usr/local/venv/lib/python3.10/site-packages/pyhf/pdf.py:636, in _MainModel.make_pdf(self, pars)
635 def make_pdf(self, pars):
--> 636 lambdas_data = self.expected_data(pars)
637 return prob.Independent(prob.Poisson(lambdas_data))
File /usr/local/venv/lib/python3.10/site-packages/pyhf/pdf.py:698, in _MainModel.expected_data(self, pars, return_by_sample)
696 tensorlib, _ = get_backend()
697 pars = tensorlib.astensor(pars)
--> 698 deltas, factors = self._modifications(pars)
700 allsum = tensorlib.concatenate(deltas + [self.nominal_rates])
702 nom_plus_delta = tensorlib.sum(allsum, axis=0)
File /usr/local/venv/lib/python3.10/site-packages/pyhf/pdf.py:657, in _MainModel._modifications(self, pars)
653 def _modifications(self, pars):
654 deltas = list(
655 filter(
656 lambda x: x is not None,
--> 657 [self.modifiers_appliers[k].apply(pars) for k in self._delta_mods],
658 )
659 )
660 factors = list(
661 filter(
662 lambda x: x is not None,
663 [self.modifiers_appliers[k].apply(pars) for k in self._factor_mods],
664 )
665 )
667 return deltas, factors
File /usr/local/venv/lib/python3.10/site-packages/pyhf/pdf.py:657, in <listcomp>(.0)
653 def _modifications(self, pars):
654 deltas = list(
655 filter(
656 lambda x: x is not None,
--> 657 [self.modifiers_appliers[k].apply(pars) for k in self._delta_mods],
658 )
659 )
660 factors = list(
661 filter(
662 lambda x: x is not None,
663 [self.modifiers_appliers[k].apply(pars) for k in self._factor_mods],
664 )
665 )
667 return deltas, factors
File /usr/local/venv/lib/python3.10/site-packages/pyhf/modifiers/histosys.py:169, in histosys_combined.apply(self, pars)
166 else:
167 histosys_alphaset = self.param_viewer.get(pars)
--> 169 results_histo = self.interpolator(histosys_alphaset)
170 # either rely on numerical no-op or force with line below
171 results_histo = tensorlib.where(
172 self.histosys_mask, results_histo, self.histosys_default
173 )
File /usr/local/venv/lib/python3.10/site-packages/pyhf/interpolators/code4p.py:85, in code4p.__call__(self, alphasets)
80 alphas_times_deltas_dn = tensorlib.einsum(
81 'sa,shb->shab', alphasets, self.deltas_dn
82 )
84 # for |a| < 1
---> 85 asquare = tensorlib.power(alphasets, 2)
86 tmp1 = asquare * 3.0 - 10.0
87 tmp2 = asquare * tmp1 + 15.0
File /usr/local/venv/lib/python3.10/site-packages/pyhf/tensor/numpy_backend.py:287, in numpy_backend.power(self, tensor_in_1, tensor_in_2)
286 def power(self, tensor_in_1: Tensor[T], tensor_in_2: Tensor[T]) -> ArrayLike:
--> 287 return np.power(tensor_in_1, tensor_in_2)
KeyboardInterrupt: