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)
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)
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)
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
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
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
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])
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])
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,))))
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
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')