def test_analytic_integral(): class DistFunc3(zbasepdf.BasePDF): def _unnormalized_pdf(self, x): return func3_2deps(x) mu_true = 1.4 sigma_true = 1.8 limits = -4.3, 1.9 mu = Parameter("mu_1414", mu_true, mu_true - 2., mu_true + 7.) sigma = Parameter("sigma_1414", sigma_true, sigma_true - 10., sigma_true + 5.) gauss_params1 = CustomGaussOLD(mu=mu, sigma=sigma, obs=obs1, name="gauss_params1") normal_params1 = Gauss(mu=mu, sigma=sigma, obs=obs1, name="gauss_params1") try: infinity = mt.inf except AttributeError: # py34 infinity = float('inf') gauss_integral_infs = gauss_params1.integrate(limits=(-8 * sigma_true, 8 * sigma_true), norm_range=False) normal_integral_infs = normal_params1.integrate(limits=(-8 * sigma_true, 8 * sigma_true), norm_range=False) DistFunc3.register_analytic_integral(func=func3_2deps_fully_integrated, limits=Space(limits=limits3, axes=(0, 1))) dist_func3 = DistFunc3(obs=['obs1', 'obs2']) normal_integral_infs = normal_integral_infs func3_integrated = dist_func3.integrate(limits=Space(limits=limits3, axes=(0, 1)), norm_range=False).numpy() assert func3_integrated == pytest.approx( func3_2deps_fully_integrated(limits=Space(limits=limits3, axes=(0, 1))).numpy()) assert gauss_integral_infs.numpy() == pytest.approx(np.sqrt(np.pi * 2.) * sigma_true, rel=0.0001) assert normal_integral_infs.numpy() == pytest.approx(1, rel=0.0001)
def create_gauss1(nameadd=""): mu = Parameter("mu" + nameadd, mu_true, mu_true - 2., mu_true + 7.) sigma = Parameter("sigma" + nameadd, sigma_true, sigma_true - 10., sigma_true + 5.) gauss_params1 = Gauss(mu=mu, sigma=sigma, obs=obs1, name="gauss_params1") return gauss_params1
def test_gradients(chunksize): zfit.run.chunking.active = True zfit.run._chunksize = chunksize param1 = Parameter("param111", 1.) param2 = Parameter("param222", 2.) gauss1 = Gauss(param1, 4, obs=obs1) gauss1.set_norm_range((-5, 5)) gauss2 = Gauss(param2, 5, obs=obs1) gauss2.set_norm_range((-5, 5)) data1 = zfit.data.Data.from_tensor(obs=obs1, tensor=ztf.constant(1., shape=(100,))) data1.set_data_range((-5, 5)) data2 = zfit.data.Data.from_tensor(obs=obs1, tensor=ztf.constant(1., shape=(100,))) data2.set_data_range((-5, 5)) nll = UnbinnedNLL(model=[gauss1, gauss2], data=[data1, data2]) gradient1 = nll.gradients(params=param1) assert zfit.run(gradient1) == zfit.run(tf.gradients(nll.value(), param1)) gradient2 = nll.gradients(params=[param2, param1]) both_gradients_true = zfit.run(tf.gradients(nll.value(), [param2, param1])) assert zfit.run(gradient2) == both_gradients_true gradient3 = nll.gradients() assert frozenset(zfit.run(gradient3)) == frozenset(both_gradients_true)
def create_params2(nameadd=""): mu2 = Parameter("mu25" + nameadd, ztf.to_real(mu_true) - 0.2, mu_true - 1., mu_true + 1.) sigma2 = Parameter("sigma25" + nameadd, ztf.to_real(sigma_true) - 0.3, sigma_true - 2., sigma_true + 2.) return mu2, sigma2
def create_params1(nameadd=""): mu1 = Parameter("mu1" + nameadd, ztf.to_real(mu_true) - 0.2, mu_true - 1., mu_true + 1.) sigma1 = Parameter("sigma1" + nameadd, ztf.to_real(sigma_true) - 0.3, sigma_true - 2., sigma_true + 2.) return mu1, sigma1
def create_params3(nameadd=""): mu3 = Parameter("mu35" + nameadd, ztf.to_real(mu_true) - 0.2, mu_true - 1., mu_true + 1.) sigma3 = Parameter("sigma35" + nameadd, ztf.to_real(sigma_true) - 0.3, sigma_true - 2., sigma_true + 2.) yield3 = Parameter("yield35" + nameadd, yield_true + 300, 0, yield_true + 20000) return mu3, sigma3, yield3
def test_add(): param1 = Parameter("param1", 1.) param2 = Parameter("param2", 2.) pdfs = [0] * 4 pdfs[0] = Gauss(param1, 4, obs=obs1) pdfs[1] = Gauss(param2, 5, obs=obs1) pdfs[2] = Gauss(3, 6, obs=obs1) pdfs[3] = Gauss(4, 7, obs=obs1) datas = [0] * 4 datas[0] = ztf.constant(1.) datas[1] = ztf.constant(2.) datas[2] = ztf.constant(3.) datas[3] = ztf.constant(4.) ranges = [0] * 4 ranges[0] = (1, 4) ranges[1] = Space(limits=(2, 5), obs=obs1) ranges[2] = Space(limits=(3, 6), obs=obs1) ranges[3] = Space(limits=(4, 7), obs=obs1) constraint1 = zfit.constraint.nll_gaussian(params=param1, mu=1, sigma=0.5) constraint2 = zfit.constraint.nll_gaussian(params=param1, mu=2, sigma=0.25) merged_contraints = [constraint1, constraint2] nll1 = UnbinnedNLL(model=pdfs[0], data=datas[0], fit_range=ranges[0], constraints=constraint1) nll2 = UnbinnedNLL(model=pdfs[1], data=datas[1], fit_range=ranges[1], constraints=constraint2) nll3 = UnbinnedNLL(model=[pdfs[2], pdfs[3]], data=[datas[2], datas[3]], fit_range=[ranges[2], ranges[3]]) simult_nll = nll1 + nll2 + nll3 assert simult_nll.model == pdfs assert simult_nll.data == datas ranges[0] = Space._from_any( limits=ranges[0], obs=obs1, axes=(0, )) # for comparison, Space can only compare with Space ranges[1]._axes = (0, ) ranges[2]._axes = (0, ) ranges[3]._axes = (0, ) assert simult_nll.fit_range == ranges def eval_constraint(constraints): return zfit.run(ztf.reduce_sum([c.value() for c in constraints])) assert eval_constraint( simult_nll.constraints) == eval_constraint(merged_contraints)
def test_extended_gauss(): mu1 = Parameter("mu11", 1.0) mu2 = Parameter("mu21", 12.0) mu3 = Parameter("mu31", 3.0) sigma1 = Parameter("sigma11", 1.0) sigma2 = Parameter("sigma21", 12.0) sigma3 = Parameter("sigma31", 33.0) yield1 = Parameter("yield11", 150.0) yield2 = Parameter("yield21", 550.0) yield3 = Parameter("yield31", 2500.0) gauss1 = Gauss(mu=mu1, sigma=sigma1, obs=obs1, name="gauss11") gauss2 = Gauss(mu=mu2, sigma=sigma2, obs=obs1, name="gauss21") gauss3 = Gauss(mu=mu3, sigma=sigma3, obs=obs1, name="gauss31") gauss1 = gauss1.create_extended(yield1) gauss2 = gauss2.create_extended(yield2) gauss3 = gauss3.create_extended(yield3) gauss_dists = [gauss1, gauss2, gauss3] sum_gauss = SumPDF(pdfs=gauss_dists) integral_true = (sum_gauss.integrate((-1, 5), ) * sum_gauss.get_yield()) assert zfit.run(integral_true) == pytest.approx( zfit.run(sum_gauss.ext_integrate((-1, 5), ))) normalization_testing(pdf=sum_gauss, limits=obs1)
def test_extended_gauss(): with tf.name_scope("gauss_params2"): mu1 = Parameter("mu11", 1.) mu2 = Parameter("mu21", 12.) mu3 = Parameter("mu31", 3.) sigma1 = Parameter("sigma11", 1.) sigma2 = Parameter("sigma21", 12.) sigma3 = Parameter("sigma31", 33.) yield1 = Parameter("yield11", 150.) yield2 = Parameter("yield21", 550.) yield3 = Parameter("yield31", 2500.) sum_yields = 150 + 550 + 2500 gauss1 = Gauss(mu=mu1, sigma=sigma1, obs=obs1, name="gauss11") gauss2 = Gauss(mu=mu2, sigma=sigma2, obs=obs1, name="gauss21") gauss3 = Gauss(mu=mu3, sigma=sigma3, obs=obs1, name="gauss31") gauss1 = gauss1.create_extended(yield1) gauss2 = gauss2.create_extended(yield2) gauss3 = gauss3.create_extended(yield3) gauss_dists = [gauss1, gauss2, gauss3] sum_gauss = SumPDF( pdfs=gauss_dists, obs=obs1, ) normalization_testing(pdf=sum_gauss, normalization_value=sum_yields)
def sum_prod_gauss(): # define parameters mu1 = Parameter("mu1a123", mu1_true) mu2 = Parameter("mu2a123", mu2_true) mu3 = Parameter("mu3a123", mu3_true) sigma1 = Parameter("sigma1a123", sigma1_true) sigma2 = Parameter("sigma2a123", sigma2_true) sigma3 = Parameter("sigma3a123", sigma3_true) # Gauss for sum, same axes gauss1 = Gauss(mu=mu1, sigma=sigma1, obs=obs1, name="gauss1asum") gauss2 = Gauss(mu=mu2, sigma=sigma2, obs=obs1, name="gauss2asum") gauss3 = Gauss(mu=mu3, sigma=sigma3, obs=obs1, name="gauss3asum") gauss_dists = [gauss1, gauss2, gauss3] sum_gauss = SumPDF(pdfs=gauss_dists, fracs=fracs, obs=obs1) prod_gauss = ProductPDF(pdfs=gauss_dists, obs=obs1) # Gauss for product, independent gauss13 = Gauss(mu=mu1, sigma=sigma1, obs='a', name="gauss1a") gauss23 = Gauss(mu=mu2, sigma=sigma2, obs='b', name="gauss2a") gauss33 = Gauss(mu=mu3, sigma=sigma3, obs='c', name="gauss3a") gauss_dists3 = [gauss13, gauss23, gauss33] prod_gauss_3d = ProductPDF(pdfs=gauss_dists3, obs=['a', 'b', 'c']) # prod_gauss_3d.update_integration_options(draws_per_dim=33) gauss12 = Gauss(mu=mu1, sigma=sigma1, obs='d', name="gauss12a") gauss22 = Gauss(mu=mu2, sigma=sigma2, obs='a', name="gauss22a") gauss32 = Gauss(mu=mu3, sigma=sigma3, obs='c', name="gauss32a") gauss_dists2 = [gauss12, gauss22, gauss32] prod_gauss_4d = ProductPDF(pdfs=gauss_dists2 + [prod_gauss_3d], obs=['a', 'b', 'c', 'd']) # prod_gauss_4d.update_integration_options(draws_per_dim=33) return sum_gauss, prod_gauss, prod_gauss_3d, prod_gauss_4d, gauss_dists3, gauss_dists2, gauss_dists
def create_params(name_add=""): mu1 = Parameter("mu1" + name_add, mu1_true) mu2 = Parameter("mu2" + name_add, mu2_true) mu3 = Parameter("mu3" + name_add, mu3_true) sigma1 = Parameter("sigma1" + name_add, sigma1_true) sigma2 = Parameter("sigma2" + name_add, sigma2_true) sigma3 = Parameter("sigma3" + name_add, sigma3_true) return mu1, mu2, mu3, sigma1, sigma2, sigma3
def create_mu_sigma_2(nameadd=""): mu2 = Parameter("mu2" + nameadd, mu_true, mu_true - 2., mu_true + 7.) sigma2 = Parameter("sigma2" + nameadd, sigma_true, sigma_true - 10., sigma_true + 5.) return mu2, sigma2
def create_gauss3(nameadd=""): mu3 = Parameter("mu3" + nameadd, mu_true, mu_true - 2., mu_true + 7.) sigma3 = Parameter("sigma3" + nameadd, sigma_true, sigma_true - 10., sigma_true + 5.) gauss3 = zfit.pdf.Gauss(mu=mu3, sigma=sigma3, obs=obs1) return gauss3
from zfit.core.parameter import Parameter import zfit.settings from zfit.core.loss import _unbinned_nll_tf, UnbinnedNLL from zfit.util.exception import IntentionNotUnambiguousError mu_true = 1.2 sigma_true = 4.1 mu_true2 = 1.01 sigma_true2 = 3.5 yield_true = 3000 test_values_np = np.random.normal(loc=mu_true, scale=sigma_true, size=(yield_true, 1)) test_values_np2 = np.random.normal(loc=mu_true2, scale=sigma_true2, size=yield_true) low, high = -24.3, 28.6 mu1 = Parameter("mu1", ztf.to_real(mu_true) - 0.2, mu_true - 1., mu_true + 1.) sigma1 = Parameter("sigma1", ztf.to_real(sigma_true) - 0.3, sigma_true - 2., sigma_true + 2.) mu2 = Parameter("mu25", ztf.to_real(mu_true) - 0.2, mu_true - 1., mu_true + 1.) sigma2 = Parameter("sigma25", ztf.to_real(sigma_true) - 0.3, sigma_true - 2., sigma_true + 2.) mu3 = Parameter("mu35", ztf.to_real(mu_true) - 0.2, mu_true - 1., mu_true + 1.) sigma3 = Parameter("sigma35", ztf.to_real(sigma_true) - 0.3, sigma_true - 2., sigma_true + 2.) yield3 = Parameter("yield35", yield_true + 300, 0, yield_true + 20000) obs1 = 'obs1' mu_constr = [1.6, 0.2] # mu, sigma sigma_constr = [3.8, 0.2] gaussian1 = Gauss(mu1, sigma1, obs=obs1, name="gaussian1") gaussian2 = Gauss(mu2, sigma2, obs=obs1, name="gaussian2") gaussian3 = Gauss(mu3, sigma3, obs=obs1, name="gaussian3")
def test_analytic_integral(): class DistFunc3(BasePDF): def _unnormalized_pdf(self, x): return func3_2deps(x) class CustomGaussOLD(BasePDF): def __init__(self, mu, sigma, obs, name="Gauss"): super().__init__(name=name, obs=obs, params=dict(mu=mu, sigma=sigma)) def _unnormalized_pdf(self, x): x = x.unstack_x() mu = self.params["mu"] sigma = self.params["sigma"] gauss = znp.exp(-0.5 * tf.square((x - mu) / sigma)) return gauss def _gauss_integral_from_inf_to_inf(limits, params, model): return tf.sqrt(2 * znp.pi) * params["sigma"] CustomGaussOLD.register_analytic_integral( func=_gauss_integral_from_inf_to_inf, limits=Space(limits=(-np.inf, np.inf), axes=(0, )), ) mu_true = 1.4 sigma_true = 1.8 mu = Parameter("mu_1414", mu_true, mu_true - 2.0, mu_true + 7.0) sigma = Parameter("sigma_1414", sigma_true, sigma_true - 10.0, sigma_true + 5.0) gauss_params1 = CustomGaussOLD(mu=mu, sigma=sigma, obs=obs1, name="gauss_params1") normal_params1 = Gauss(mu=mu, sigma=sigma, obs=obs1, name="gauss_params1") gauss_integral_infs = gauss_params1.integrate(limits=(-8 * sigma_true, 8 * sigma_true), norm=False) normal_integral_infs = normal_params1.integrate( limits=(-8 * sigma_true, 8 * sigma_true), norm=False, ) DistFunc3.register_analytic_integral(func=func3_2deps_fully_integrated, limits=Space(limits=limits3, axes=(0, 1))) dist_func3 = DistFunc3(obs=["obs1", "obs2"]) normal_integral_infs = normal_integral_infs func3_integrated = dist_func3.integrate( limits=Space(limits=limits3, axes=(0, 1)), norm=False, ).numpy() assert func3_integrated == pytest.approx( func3_2deps_fully_integrated( limits=Space(limits=limits3, axes=(0, 1))).numpy()) assert gauss_integral_infs.numpy() == pytest.approx(np.sqrt(np.pi * 2.0) * sigma_true, rel=0.0001) assert normal_integral_infs.numpy() == pytest.approx(1, rel=0.0001)
from zfit.core.limits import Space, ANY_UPPER import zfit.models.dist_tfp from zfit.models.dist_tfp import Gauss from zfit.core.parameter import Parameter from zfit.models.functor import ProductPDF from zfit.models.special import SimplePDF import zfit.settings from zfit import ztf # from zfit.ztf import test_values = np.array([3., 11.3, -0.2, -7.82]) mu_true = 1.4 sigma_true = 1.8 low, high = -4.3, 1.9 mu = Parameter("mu", mu_true, mu_true - 2., mu_true + 7.) sigma = Parameter("sigma", sigma_true, sigma_true - 10., sigma_true + 5.) obs1 = 'obs1' gauss_params1 = Gauss(mu=mu, sigma=sigma, obs=obs1, name="gauss_params1") mu_true_param = zfit.Parameter('mu_true123', mu_true) sigma_true_param = zfit.Parameter('sigma_true123', sigma_true) class TestGaussian(zfit.pdf.BasePDF): def _unnormalized_pdf(self, x, norm_range=False): x = x.unstack_x()