Example #1
0
def test_analytic_integral():
    class DistFunc3(zbasepdf.BasePDF):
        def _unnormalized_pdf(self, x, norm_range=False):
            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=(-infinity, infinity), norm_range=False)
    normal_integral_infs = normal_params1.integrate(limits=(-infinity, infinity), norm_range=False)

    DistFunc3.register_analytic_integral(func=func3_2deps_fully_integrated,
                                         limits=Space.from_axes(limits=limits3, axes=(0, 1)))

    dist_func3 = DistFunc3(obs=['obs1', 'obs2'])
    gauss_integral_infs = zfit.run(gauss_integral_infs)
    normal_integral_infs = zfit.run(normal_integral_infs)
    func3_integrated = zfit.run(
        ztf.convert_to_tensor(
            dist_func3.integrate(limits=Space.from_axes(limits=limits3, axes=(0, 1)), norm_range=False),
            dtype=tf.float64))
    assert func3_integrated == func3_2deps_fully_integrated(limits=Space.from_axes(limits=limits3, axes=(0, 1)))
    assert gauss_integral_infs == pytest.approx(np.sqrt(np.pi * 2.) * sigma_true, rel=0.0001)
    assert normal_integral_infs == pytest.approx(1, rel=0.0001)
Example #2
0
def test_mc_integration(chunksize):
    # simpel example
    zfit.run.chunking.active = True
    zfit.run.chunking.max_n_points = chunksize
    num_integral = zintegrate.mc_integrate(func=func1_5deps,
                                           limits=Space.from_axes(
                                               limits=limits_simple_5deps,
                                               axes=tuple(range(5))),
                                           n_axes=5)
    num_integral2 = zintegrate.mc_integrate(func=func2_1deps,
                                            limits=Space.from_axes(
                                                limits=limits2,
                                                axes=tuple(range(1))),
                                            n_axes=1)
    num_integral3 = zintegrate.mc_integrate(func=func3_2deps,
                                            limits=Space.from_axes(
                                                limits=limits3,
                                                axes=tuple(range(2))),
                                            n_axes=2)

    integral = num_integral.numpy()
    integral2 = num_integral2.numpy()
    integral3 = num_integral3.numpy()

    assert not hasattr(integral, "__len__")
    assert not hasattr(integral2, "__len__")
    assert not hasattr(integral3, "__len__")
    assert func1_5deps_fully_integrated(limits_simple_5deps) == pytest.approx(
        integral, rel=0.1)
    assert func2_1deps_fully_integrated(limits2) == pytest.approx(integral2,
                                                                  rel=0.03)
    assert func3_2deps_fully_integrated(
        Space.from_axes(limits=limits3,
                        axes=(0, 1))).numpy() == pytest.approx(integral3,
                                                               rel=0.03)
Example #3
0
def test_mc_integration():
    # simpel example
    num_integral = zintegrate.mc_integrate(func=func1_5deps,
                                           limits=Space.from_axes(limits=limits_simple_5deps,
                                                                  axes=tuple(range(5))),
                                           n_axes=5)
    num_integral2 = zintegrate.mc_integrate(func=func2_1deps,
                                            limits=Space.from_axes(limits=limits2,
                                                                   axes=tuple(range(1))),
                                            n_axes=1)
    num_integral3 = zintegrate.mc_integrate(func=func3_2deps,
                                            limits=Space.from_axes(limits=limits3,
                                                                   axes=tuple(range(2))),
                                            n_axes=2)

    integral = zfit.run(num_integral)
    integral2 = zfit.run(num_integral2)
    integral3 = zfit.run(num_integral3)

    assert not hasattr(integral, "__len__")
    assert not hasattr(integral2, "__len__")
    assert not hasattr(integral3, "__len__")
    assert func1_5deps_fully_integrated(limits_simple_5deps) == pytest.approx(integral,
                                                                              rel=0.1)
    assert func2_1deps_fully_integrated(limits2) == pytest.approx(integral2, rel=0.03)
    assert func3_2deps_fully_integrated(
        Space.from_axes(limits=limits3, axes=(0, 1))) == pytest.approx(integral3, rel=0.03)
Example #4
0
def test_multiple_limits():
    gauss_params1 = create_gauss1()
    dims = (0, )
    simple_limits = (-3.2, 9.1)
    multiple_limits_lower = ((-3.2, ), (1.1, ), (2.1, ))
    multiple_limits_upper = ((1.1, ), (2.1, ), (9.1, ))
    multiple_limits_range = Space.from_axes(limits=(multiple_limits_lower,
                                                    multiple_limits_upper),
                                            axes=dims)
    integral_simp = gauss_params1.integrate(limits=simple_limits,
                                            norm_range=False)
    integral_mult = gauss_params1.integrate(limits=multiple_limits_range,
                                            norm_range=False)
    integral_simp_num = gauss_params1.numeric_integrate(limits=simple_limits,
                                                        norm_range=False)
    integral_mult_num = gauss_params1.numeric_integrate(
        limits=multiple_limits_range, norm_range=False)

    integral_simp, integral_mult = zfit.run([integral_simp, integral_mult])
    integral_simp_num, integral_mult_num = zfit.run(
        [integral_simp_num, integral_mult_num])
    assert integral_simp == pytest.approx(
        integral_mult, rel=1e-2)  # big tolerance as mc is used
    assert integral_simp == pytest.approx(
        integral_simp_num, rel=1e-2)  # big tolerance as mc is used
    assert integral_simp_num == pytest.approx(
        integral_mult_num, rel=1e-2)  # big tolerance as mc is used
Example #5
0
def test_sub_space():
    sub_space2_true_axes = Space.from_axes(axes=sub_limit2_axes, limits=sub_limit2)
    assert sub_space2_true_axes == space2_subbed_axes

    sub_space2_true = Space(obs=sub_limit2_obs, limits=sub_limit2)
    space2_subbed = space2_obs.get_subspace(obs=sub_limit2_obs)
    assert space2_subbed == sub_space2_true
Example #6
0
def test_analytic_integral_selection():
    class DistFuncInts(zbasepdf.BasePDF):
        def _unnormalized_pdf(self, x, norm_range=False):
            return x ** 2

    int1 = lambda x: 1  # on purpose wrong signature but irrelevant (not called, only test bookkeeping)
    int2 = lambda x: 2
    int22 = lambda x: 22
    int3 = lambda x: 3
    int4 = lambda x: 4
    int5 = lambda x: 5
    limits1 = (-1, 5)
    dims1 = (1,)
    limits1 = Space.from_axes(axes=dims1, limits=limits1)
    limits2 = (Space.ANY_LOWER, 5)
    dims2 = (1,)
    limits2 = Space.from_axes(axes=dims2, limits=limits2)
    limits3 = ((Space.ANY_LOWER, 1),), ((Space.ANY_UPPER, 5),)
    dims3 = (0, 1)
    limits3 = Space.from_axes(axes=dims3, limits=limits3)
    limits4 = (((Space.ANY_LOWER, 0, Space.ANY_LOWER),), ((Space.ANY_UPPER, 5, 42),))
    dims4 = (0, 1, 2)
    limits4 = Space.from_axes(axes=dims4, limits=limits4)
    limits5 = (((Space.ANY_LOWER, 1),), ((10, Space.ANY_UPPER),))
    dims5 = (1, 2)
    limits5 = Space.from_axes(axes=dims5, limits=limits5)
    DistFuncInts.register_analytic_integral(int1, limits=limits1)
    DistFuncInts.register_analytic_integral(int2, limits=limits2)
    DistFuncInts.register_analytic_integral(int22, limits=limits2, priority=60)
    DistFuncInts.register_analytic_integral(int3, limits=limits3)
    DistFuncInts.register_analytic_integral(int4, limits=limits4)
    DistFuncInts.register_analytic_integral(int5, limits=limits5)
    dims = DistFuncInts._analytic_integral.get_max_axes(limits=Space.from_axes(limits=(((-5, 1),), ((1, 5),)),
                                                                               axes=dims3))
    assert dims3 == dims
Example #7
0
def test_analytic_sampling():
    class SampleGauss(TestGaussian):
        pass

    SampleGauss.register_analytic_integral(func=lambda limits, params, model: 2 * limits.upper[0][0],
                                           limits=Space.from_axes(limits=(-float("inf"), ANY_UPPER),
                                                                  axes=(0,)))  # DUMMY!
    SampleGauss.register_inverse_analytic_integral(func=lambda x, params: x + 1000.)

    gauss1 = SampleGauss(obs=obs1)
    sample = gauss1.sample(n=10000, limits=(2., 5.))

    sample = zfit.run(sample)

    assert 1004. <= min(sample[0])
    assert 10010. >= max(sample[0])
Example #8
0
def test_analytic_sampling():
    class SampleGauss(TestGaussian):
        pass

    SampleGauss.register_analytic_integral(
        func=lambda limits, params, model: 2 * limits.upper[0][0],
        limits=Space.from_axes(limits=(-float("inf"), ANY_UPPER),
                               axes=(0, )))  # DUMMY!
    SampleGauss.register_inverse_analytic_integral(
        func=lambda x, params: x + 1000.)

    mu, sigma = create_mu_sigma_true_params()
    gauss1 = SampleGauss(obs=obs1, mu=mu, sigma=sigma)
    sample = gauss1.sample(n=10000, limits=(2., 5.))
    sample.set_data_range((1002, 1005))

    sample = sample.numpy()

    assert 1004. <= min(sample[0])
    assert 10010. >= max(sample[0])
Example #9
0
def test_exception():
    invalid_obs = (1, 4)
    with pytest.raises(ValueError):
        Space(obs=invalid_obs)
    with pytest.raises(ObsNotSpecifiedError):
        Space(obs=None, limits=limit2)
    with pytest.raises(AxesNotSpecifiedError):
        Space.from_axes(axes=None, limits=limit2)
    with pytest.raises(ValueError):  # one obs only, but two dims
        Space(obs='obs1', limits=(((1, 2),), ((2, 3),)))
    with pytest.raises(ValueError):  # two obs but only 1 dim
        Space(obs=['obs1', 'obs2'], limits=(((1,),), ((2,),)))
    with pytest.raises(ValueError):  # one axis but two dims
        Space.from_axes(axes=(1,), limits=(((1, 2),), ((2, 3),)))
    with pytest.raises(ValueError):  # two axes but only 1 dim
        Space.from_axes(axes=(1, 2), limits=(((1,),), ((2,),)))
    with pytest.raises(ValueError):  # two obs, two limits but each one only 1 dim
        Space(obs=['obs1', 'obs2'], limits=(((1,), (2,)), ((2,), (3,))))
Example #10
0
def test_dimensions():
    lower1, lower2 = 1, 2
    upper1, upper2 = 2, 3
    space = Space(obs=['obs1', 'obs2'],
                  limits=(((lower1, lower2), ), ((upper1, upper2), )))
    assert space.n_obs == 2
    assert space.n_limits == 1
    low1, low2, up1, up2 = space.limit2d
    assert low1 == lower1
    assert low2 == lower2
    assert up1 == upper1
    assert up2 == upper2

    with pytest.raises(RuntimeError):
        space.limit1d

    space = Space(obs='obs1', limits=(((1, ), (2, )), ((2, ), (3, ))))
    assert space.n_obs == 1
    assert space.n_limits == 2
    with pytest.raises(RuntimeError):
        space.limit2d

    space = Space(obs=['obs1', 'obs2'],
                  limits=(((1, 5), (2, 4)), ((2, 3), (3, 2))))
    assert space.n_obs == 2
    assert space.n_limits == 2
    with pytest.raises(RuntimeError):
        space.limit2d
        space.limits1d

    space = Space(obs='obs1', limits=(((1, ), ), ((2, ), )))
    assert space.n_obs == 1
    assert space.n_limits == 1

    space = Space(obs=['obs1', 'obs2'],
                  limits=(((1, 5), (2, 4), (1, 5), (2, 4)), ((2, 3), (3, 2),
                                                             (1, 5), (2, 4))))
    assert space.n_obs == 2
    assert space.n_limits == 4

    space = Space(obs=['obs1', 'obs2', 'obs3', 'obs4'],
                  limits=(((1, 5, 2, 4), (1, 5, 2, 4)), ((2, 3, 3, 2),
                                                         (1, 5, 2, 4))))
    assert space.n_obs == 4
    assert space.n_limits == 2

    lower1, lower2, upper1, upper2 = 1, 2, 2, 3
    space = Space.from_axes(axes=(1, ),
                            limits=(((lower1, ), (lower2, )), ((upper1, ),
                                                               (upper2, ))))
    assert space.n_obs == 1
    assert space.n_limits == 2
    low1, low2, up1, up2 = space.limits1d
    with pytest.raises(RuntimeError):
        space.limit1d

    space = Space.from_axes(axes=(1, 2),
                            limits=(((1, 5), (2, 4)), ((2, 3), (3, 2))))
    assert space.n_obs == 2
    assert space.n_limits == 2
    with pytest.raises(RuntimeError):
        space.limit1d

    lower1 = 1
    upper1 = 2
    space = Space.from_axes(axes=(1, ),
                            limits=(((lower1, ), ), ((upper1, ), )))
    assert space.n_obs == 1
    assert space.n_limits == 1
    lower, upper = space.limit1d
    assert lower == lower1
    assert upper == upper1

    space = Space.from_axes(axes=(1, 2, 4, 5),
                            limits=(((1, 5, 2, 4), (1, 5, 2, 4)),
                                    ((2, 3, 3, 2), (1, 5, 2, 4))))
    assert space.n_obs == 4
    assert space.n_limits == 2
Example #11
0
import pytest

from zfit.core.limits import Space, convert_to_space
# noinspection PyUnresolvedReferences
from zfit.core.testing import setup_function, teardown_function, tester
from zfit.util.exception import ObsNotSpecifiedError, AxesNotSpecifiedError, LimitsUnderdefinedError

lower1 = (1, ), (4, )
upper1 = (3, ), (7, )
limit1 = lower1, upper1
limit1_true = copy.deepcopy(limit1)
limit1_areas = (2, 3)
limit1_axes = (1, )
limit1_obs = ("obs1", )
limit1_axes_true = limit1_axes
space1 = Space.from_axes(limits=limit1, axes=limit1_axes)
space1_obs = Space(obs=limit1_obs, limits=limit1)
arguments1 = (space1, lower1, upper1, limit1_true, limit1_axes, limit1_areas,
              2)

lower2 = (1, 2, 3), (-4, -5, 5)
upper2 = (2, 4, 6), (-1, 5, 5.6)
sub_lower2 = (1, 3), (-4, 5)
sub_upper2 = (2, 6), (-1, 5.6)
limit2 = lower2, upper2
sub_limit2 = sub_lower2, sub_upper2
limit2_areas = (6, 18)
sub_limit2_areas = (3, 1.8)
limit2_axes = (1, 5, 6)
sub_limit2_axes = (1, 6)
limit2_obs = ('obs1', 'obs2', 'obs3')