예제 #1
0
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)
예제 #2
0
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
예제 #3
0
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)
예제 #4
0
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
예제 #5
0
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
예제 #6
0
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
예제 #7
0
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)
예제 #8
0
파일: test_pdfs.py 프로젝트: zfit/zfit
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)
예제 #9
0
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)
예제 #10
0
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
예제 #11
0
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
예제 #12
0
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
예제 #13
0
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
예제 #14
0
파일: test_loss.py 프로젝트: olantwin/zfit
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")
예제 #15
0
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)
예제 #16
0
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()