Module flavio.test_classes

Classes

class TestClasses (methodName='runTest')
Expand source code
class TestClasses(unittest.TestCase):
    def test_parameter_class(self):
        p = Parameter( 'test_mb' )
        self.assertEqual( p, Parameter.get_instance('test_mb') )
        self.assertEqual( p, Parameter['test_mb'] )
        p.set_description('b quark mass')
        self.assertEqual( p.description, 'b quark mass' )
        # removing dummy instances
        Parameter.del_instance('test_mb')

    def test_constraints_class(self):
        p = Parameter( 'test_mb' )
        self.assertEqual( p, Parameter.get_instance('test_mb') )
        self.assertEqual( p, Parameter['test_mb'] )
        c = ParameterConstraints()
        d = NormalDistribution(4.2, 0.2)
        c.add_constraint( ['test_mb'], d )
        # checking central values
        self.assertEqual( c.get_central('test_mb'), 4.2)
        # checking types and shapes of random values
        self.assertEqual( type(d.get_random()), float)
        self.assertEqual( d.get_random(3).shape, (3,))
        self.assertEqual( d.get_random((4,5)).shape, (4,5))
        test_1derrors_random = c.get_1d_errors_random()
        self.assertAlmostEqual( test_1derrors_random['test_mb'], 0.2, delta=0.5)
        test_1derrors_rightleft = c.get_1d_errors_rightleft()
        self.assertEqual( test_1derrors_rightleft['test_mb'], (0.2, 0.2))
        d = AsymmetricNormalDistribution(4.2, 0.2, 0.1)
        c.add_constraint( ['test_mb'], d )
        test_1derrors_rightleft = c.get_1d_errors_rightleft()
        self.assertEqual( test_1derrors_rightleft['test_mb'], (0.2, 0.1))
        pc = Parameter( 'test_mc' )
        c.add_constraint( ['test_mc', 'test_mb'], MultivariateNormalDistribution([1.2,4.2],[[0.01,0],[0,0.04]]) )
        c.get_logprobability_all(c.get_central_all())
        test_1derrors_random = c.get_1d_errors_random()
        self.assertAlmostEqual( test_1derrors_random['test_mb'], 0.2, delta=0.05)
        self.assertAlmostEqual( test_1derrors_random['test_mc'], 0.1, delta=0.05)
        test_1derrors_rightleft = c.get_1d_errors_rightleft()
        self.assertEqual( test_1derrors_rightleft['test_mb'], (0.2, 0.2))
        self.assertEqual( test_1derrors_rightleft['test_mc'], (0.1, 0.1))
        # removing dummy instances
        # check that they have been removed, using old and new syntax
        c.remove_constraint('test_mb')
        Parameter.del_instance('test_mb')
        with self.assertRaises(KeyError):
            Parameter['test_mb']
        del Parameter['test_mc']
        with self.assertRaises(KeyError):
            Parameter.get_instance('test_mc')

    def test_set_constraint(self):
        p = Parameter( 'test_mb' )
        c = ParameterConstraints()
        c.set_constraint('test_mb', '4.2 +- 0.1 +- 0.2')
        cons = c._parameters['test_mb'][1]
        self.assertIsInstance(cons, NormalDistribution)
        self.assertEqual(cons.central_value, 4.2)
        self.assertEqual(cons.standard_deviation, math.sqrt(0.1**2+0.2**2))
        c.set_constraint('test_mb', '4.3 + 0.3 - 0.4')
        cons = c._parameters['test_mb'][1]
        self.assertIsInstance(cons, AsymmetricNormalDistribution)
        self.assertEqual(cons.central_value, 4.3)
        self.assertEqual(cons.right_deviation, 0.3)
        self.assertEqual(cons.left_deviation, 0.4)
        c.set_constraint('test_mb', 4.4)
        cons = c._parameters['test_mb'][1]
        self.assertIsInstance(cons, DeltaDistribution)
        self.assertEqual(cons.central_value, 4.4)
        cons_dict_1 = {'distribution': 'normal',
                     'central_value': '4.5',
                     'standard_deviation': '0.1'}
        cons_dict_2 = {'distribution': 'normal',
                     'central_value': 4.5,
                     'standard_deviation': 0.2}
        c.set_constraint('test_mb', constraint_dict=cons_dict_1)
        cons = c._parameters['test_mb'][1]
        self.assertIsInstance(cons, NormalDistribution)
        self.assertEqual(cons.central_value, 4.5)
        self.assertEqual(cons.standard_deviation, 0.1)
        c.set_constraint('test_mb', constraint_dict=[cons_dict_1, cons_dict_2])
        cons = c._parameters['test_mb'][1]
        self.assertIsInstance(cons, NormalDistribution)
        self.assertEqual(cons.central_value, 4.5)
        self.assertEqual(cons.standard_deviation, math.sqrt(0.1**2+0.2**2))
        Parameter.del_instance('test_mb')

    def test_observable_class(self):
        o = Observable( 'test_obs' )
        self.assertEqual( o, Observable.get_instance('test_obs') )
        self.assertEqual( o, Observable['test_obs'] )
        o.set_description('some test observables')
        self.assertEqual( o.description, 'some test observables' )
        # removing dummy instances
        Observable.del_instance('test_obs')

    def test_measurement_class(self):
        o = Observable( 'test_obs' )
        d = NormalDistribution(4.2, 0.2)
        m = Measurement( 'measurement of test_obs' )
        m.add_constraint(['test_obs'], d)
        # removing dummy instances
        Observable.del_instance('test_obs')
        Measurement.del_instance('measurement of test_obs')

    def test_prediction_class(self):
        o = Observable( 'test_obs' )
        p = Parameter( 'test_parameter' )
        def f(wc_obj, par_dict):
            return par_dict['test_parameter']*2
        pr  = Prediction( 'test_obs', f )
        wc_obj = None
        c = ParameterConstraints()
        c.add_constraint( ['test_parameter'], NormalDistribution(1.2, 0.1) )
        self.assertEqual( pr.get_central(c, wc_obj), 2.4)
        self.assertEqual( o.prediction_central(c, wc_obj), 2.4)
        # removing dummy instances
        Observable.del_instance('test_obs')
        Parameter.del_instance('test_parameter')

    def test_implementation_class(self):
        a = AuxiliaryQuantity( 'test_aux' )
        p = Parameter( 'test_parameter' )
        def f(wc_obj, par_dict):
            return par_dict['test_parameter']*2
        imp  = Implementation( 'test_imp', 'test_aux', f )
        config['implementation']['test_aux'] = 'test_imp'
        wc_obj = None
        c = ParameterConstraints()
        c.add_constraint( ['test_parameter'], NormalDistribution(1.2, 0.1) )
        self.assertEqual( imp.get_central(c, wc_obj), 2.4)
        self.assertEqual( a.prediction_central(c, wc_obj), 2.4)
        Implementation.show_all()
        # removing dummy instances
        AuxiliaryQuantity.del_instance('test_aux')
        Parameter.del_instance('test_parameter')
        Implementation.del_instance('test_imp')
        del config['implementation']['test_aux']

    def test_constraints_class_exclude(self):
        Parameter( 'test_ma' )
        Parameter( 'test_mb' )
        Parameter( 'test_mc' )
        c2 = np.array([1e-3, 2])
        c3 = np.array([1e-3, 2, 0.4])
        cov22 = np.array([[(0.2e-3)**2, 0.2e-3*0.5*0.3],[0.2e-3*0.5*0.3, 0.5**2]])
        cov33 = np.array([[(0.2e-3)**2, 0.2e-3*0.5*0.3 , 0],[0.2e-3*0.5*0.3, 0.5**2, 0.01], [0, 0.01, 0.1**2]])
        pdf1 = NormalDistribution(2, 0.5)
        pdf2 = MultivariateNormalDistribution(c2, cov22)
        pdf3 = MultivariateNormalDistribution(c3, cov33)
        c1 = ParameterConstraints()
        c2 = ParameterConstraints()
        c3 = ParameterConstraints()
        c1.add_constraint(['test_mb'], pdf1)
        c2.add_constraint(['test_ma', 'test_mb'], pdf2)
        c3.add_constraint(['test_ma', 'test_mb', 'test_mc'], pdf3)
        par_dict = {'test_ma': 1.2e-3, 'test_mb': 2.4, 'test_mc': 0.33}
        self.assertEqual(
            c1.get_logprobability_all(par_dict)[pdf1],
            c2.get_logprobability_all(par_dict, exclude_parameters=['test_ma', 'test_mc'])[pdf2],
        )
        self.assertEqual(
            c1.get_logprobability_all(par_dict)[pdf1],
            c3.get_logprobability_all(par_dict, exclude_parameters=['test_ma', 'test_mc'])[pdf3],
        )
        self.assertEqual(
            c2.get_logprobability_all(par_dict)[pdf2],
            c3.get_logprobability_all(par_dict, exclude_parameters=['test_mc'])[pdf3],
        )
        # remove dummy instances
        Parameter.del_instance('test_ma')
        Parameter.del_instance('test_mb')
        Parameter.del_instance('test_mc')

    def test_logprobability_single(self):
        c_corr = Constraints()
        c_uncorr = Constraints()
        d1 = NormalDistribution(2, 0.3)
        c_corr.add_constraint(['par_1'], d1)
        c_uncorr.add_constraint(['par_1'], d1)
        d23 = MultivariateNormalDistribution([4, 5],
            covariance=[[0.2**2, 0.5*0.2*0.3], [0.5*0.2*0.3, 0.3**2]])
        d2 = NormalDistribution(4, 0.2)
        d3 = NormalDistribution(5, 0.3)
        c_corr.add_constraint(['par_2', 'par_3'], d23)
        d23_uncorr = MultivariateNormalDistribution([4, 5], covariance=[[0.2, 0], [0, 0.3]])
        c_uncorr.add_constraint(['par_2'], d2)
        c_uncorr.add_constraint(['par_3'], d3)
        d = {'par_1': 2.8, 'par_2': 4.9, 'par_3': 4.3}
        # all logprobs for the uncorrelated case
        l_all = c_uncorr.get_logprobability_all(d)
        # the dict should contain the same values as the "single" ones in
        # the correlated case
        for k, v in l_all.items():
            par = dict(c_uncorr._constraints)[k][0]
            self.assertEqual(v,
                             c_corr.get_logprobability_single(par, d[par]),
                             msg="Failed for {}".format(par))

    def test_pdf(self):
        # for the normal dist's, just check that no error is raised
        pd = NormalDistribution(1., 0.2)
        pd.logpdf(0.5)
        pd = MultivariateNormalDistribution([1.,2.], [[0.04,0],[0,0.09]])
        pd.logpdf([1.05,2.08])
        # for the asymmetric dist, more scrutiny needed
        pd = AsymmetricNormalDistribution(1., 0.2, 0.5)
        eps = 1.e-8
        # check that the PDF is continuos
        self.assertAlmostEqual( pd.logpdf(1. - eps), pd.logpdf(1. + eps), places=8)
        # check that the PDF is properly normalized
        self.assertEqual( scipy.integrate.quad(lambda x: math.exp(pd.logpdf(x)), -np.inf, +np.inf)[0], 1)

    def test_observable_from_function(self):
        o1 = Observable('test_obs_1', arguments=['a1'])
        o2 = Observable('test_obs_2', arguments=['a2'])
        with self.assertRaises(ValueError):
            # non-existent obs
            Observable.from_function('test_obs_12',
                                     ['test_obs_x', 'test_obs_2'],
                                     lambda x, y: x-y)
        with self.assertRaises(AssertionError):
            # depend on different arguments
            Observable.from_function('test_obs_12',
                                     ['test_obs_1', 'test_obs_2'],
                                     lambda x, y: x-y)
        o2 = Observable('test_obs_2', arguments=['a1'])
        with self.assertRaises(AssertionError):
            # obs without prediction
            Observable.from_function('test_obs_12',
                                     ['test_obs_1', 'test_obs_2'],
                                     lambda x, y: x-y)
        Prediction('test_obs_1', lambda wc_obj, par: 3)
        Prediction('test_obs_2', lambda wc_obj, par: 7)
        Observable.from_function('test_obs_12',
                                 ['test_obs_1', 'test_obs_2'],
                                 lambda x, y: x-y)
        self.assertEqual(
            Observable['test_obs_12'].prediction_central(flavio.default_parameters, None),
            -4)
        self.assertEqual(Observable['test_obs_12'].arguments, ['a1'])
        # delete dummy instances
        Observable.del_instance('test_obs_1')
        Observable.del_instance('test_obs_2')
        Observable.del_instance('test_obs_12')

    def test_observable_taxonomy(self):
        o1 = Observable( 'test_obs_1' )
        o2 = Observable( 'test_obs_2' )
        o1.add_taxonomy('test 1 :: test 2 :: test 3')
        o2.add_taxonomy('test 1 :: test 2 :: test 3')
        self.assertDictEqual(
            Observable.taxonomy_dict()['test 1'],
            {'test 2': {'test 3': {'test_obs_1' :{}, 'test_obs_2':{}}}}
        )
        # remove test from taxonomy
        Observable.taxonomy.pop('test 1', None)
        # removing dummy instances
        Observable.del_instance('test_obs_1')
        Observable.del_instance('test_obs_2')

    def test_parameter_constraints_yaml(self):
        yaml = flavio.default_parameters.get_yaml()
        pnew = ParameterConstraints.from_yaml(yaml)
        yaml2 = pnew.get_yaml()
        self.assertEqual(yaml, yaml2)

    def test_measurements_yaml(self):
        import json
        for m in Measurement.instances.values():
            if (m.name in ['Belle B->D*lnu hadronic tag 2017',
                           'CLEO D->Kenu 2009',
                           'CLEO D->pienu 2009']
            or 'Pseudo-measurement' in m.name):
                continue  # known failures ...
            yaml = m.get_yaml_dict()
            mnew = Measurement.from_yaml_dict(yaml)
            yaml2 = mnew.get_yaml_dict()
            self.assertEqual(yaml, yaml2, msg="Failed for {}".format(m.name))

    def test_from_yaml_dict(self):
        c = Constraints.from_yaml_dict([
        {'my_par_1': '1 +- 0.3 +- 0.4'},
        {'parameters': ['my_par_2'],
         'values': {
           'distribution': 'normal',
           'central_value': 2,
           'standard_deviation': 0.6,
           }
        },
        {'parameters': ['my_par_3'],
         'values': [{
           'distribution': 'normal',
           'central_value': 7,
           'standard_deviation': 0.3,
           },
           {
           'distribution': 'normal',
           'central_value': 7,
           'standard_deviation': 0.4,
         }]

        }
        ])
        self.assertListEqual(list(c._parameters.keys()), ['my_par_1', 'my_par_2', 'my_par_3'])
        c1 = c._parameters['my_par_1'][1]
        self.assertEqual(type(c1), NormalDistribution)
        self.assertEqual(c1.central_value, 1)
        self.assertEqual(c1.standard_deviation, 0.5)
        c2 = c._parameters['my_par_2'][1]
        self.assertEqual(type(c2), NormalDistribution)
        self.assertEqual(c2.central_value, 2)
        self.assertEqual(c2.standard_deviation, 0.6)
        c3 = c._parameters['my_par_3'][1]
        self.assertEqual(type(c3), NormalDistribution)
        self.assertEqual(c3.central_value, 7)
        self.assertEqual(c3.standard_deviation, 0.5)
        del c

    def test_repr_meas(self):
        mtest = Measurement('repr test')
        self.assertEqual(repr(mtest), "Measurement('repr test')")
        mtest._repr_markdown_()
        mtest.description = "bla"
        self.assertIn("bla", mtest._repr_markdown_())
        mtest.url = "blo"
        self.assertIn("blo", mtest._repr_markdown_())
        del Measurement['repr test']

    def test_repr_obs(self):
        mtest = Observable('repr test')
        self.assertEqual(repr(mtest),
                         "Observable('repr test', arguments=None)")
        mtest._repr_markdown_()
        mtest.description = "bla"
        self.assertIn("bla", mtest._repr_markdown_())
        mtest.tex = "blo"
        self.assertIn("blo", mtest._repr_markdown_())
        mtest.arguments = ["blu"]
        self.assertIn("blu", mtest._repr_markdown_())
        self.assertEqual(repr(mtest),
                         "Observable('repr test', arguments=['blu'])")
        del Observable['repr test']

    def test_repr_par(self):
        ptest = Parameter('repr test')
        self.assertEqual(repr(ptest),
                         "Parameter('repr test')")
        ptest._repr_markdown_()
        ptest.description = "bla"
        self.assertIn("bla", ptest._repr_markdown_())
        ptest.tex = "blo"
        self.assertIn("blo", ptest._repr_markdown_())
        del Parameter['repr test']

    def test_argument_format(self):
        with self.assertRaises(KeyError):
            Observable.argument_format('dont_exist')
        with self.assertRaises(KeyError):
            Observable.argument_format(['dont_exist', 1])
        with self.assertRaises(ValueError):
            Observable.argument_format(['eps_K', 1])
        with self.assertRaises(KeyError):
            Observable.argument_format({'name': 'dBR/dq2(B0->Denu)', 'bla': 1})
        with self.assertRaises(ValueError):
            Observable.argument_format(['dBR/dq2(B0->Denu)'])
        with self.assertRaises(ValueError):
            Observable.argument_format('dBR/dq2(B0->Denu)')
        self.assertTupleEqual(Observable.argument_format({'name': 'dBR/dq2(B0->Denu)', 'q2': 1}, 'tuple'),
                              ('dBR/dq2(B0->Denu)', 1))
        self.assertListEqual(Observable.argument_format({'name': 'dBR/dq2(B0->Denu)', 'q2': 1}, 'list'),
                              ['dBR/dq2(B0->Denu)', 1])
        self.assertDictEqual(Observable.argument_format({'name': 'dBR/dq2(B0->Denu)', 'q2': 1}, 'dict'),
                              {'name': 'dBR/dq2(B0->Denu)', 'q2': 1})
        self.assertEqual(Observable.argument_format('eps_K', 'tuple'),
                              'eps_K')
        self.assertEqual(Observable.argument_format('eps_K', 'list'),
                              'eps_K')
        self.assertDictEqual(Observable.argument_format('eps_K', 'dict'),
                              {'name': 'eps_K'})

    def test_obs_get_meas(self):
        self.assertEqual(
            Observable['eps_K'].get_measurements(),
            ['PDG kaon CPV']
        )
        self.assertEqual(
            sorted(Observable['<BR>(B+->rholnu)'].get_measurements()),
            sorted(['Belle B+->rholnu 2013', 'BaBar B+->rholnu 2010', 'BPR combination B->rholnu 2021'])
        )
        self.assertEqual(
            Observable['FL(B0->K*mumu)'].get_measurements(),
            []
        )

    def test_find(self):
        class TestClass(NamedInstanceClass):
            pass

        TestClass('test word 1')
        TestClass('x test word 2')
        TestClass('test 3')
        self.assertEqual(TestClass.find('word'), ['test word 1', 'x test word 2'])
        self.assertEqual(TestClass.find('^x'), ['x test word 2'])
        self.assertEqual(TestClass.find('s.*3'), ['test 3'])

A class whose instances are single test cases.

By default, the test code itself should be placed in a method named 'runTest'.

If the fixture may be used for many test cases, create as many test methods as are needed. When instantiating such a TestCase subclass, specify in the constructor arguments the name of the test method that the instance is to execute.

Test authors should subclass TestCase for their own tests. Construction and deconstruction of the test's environment ('fixture') can be implemented by overriding the 'setUp' and 'tearDown' methods respectively.

If it is necessary to override the init method, the base class init method must always be called. It is important that subclasses should not change the signature of their init method, since instances of the classes are instantiated automatically by parts of the framework in order to be run.

When subclassing TestCase, you can set these attributes: * failureException: determines which exception will be raised when the instance's assertion methods fail; test methods raising this exception will be deemed to have 'failed' rather than 'errored'. * longMessage: determines whether long messages (including repr of objects used in assert methods) will be printed on failure in addition to any explicit message passed. * maxDiff: sets the maximum length of a diff in failure messages by assert methods using difflib. It is looked up as an instance attribute so can be configured by individual tests if required.

Create an instance of the class that will use the named test method when executed. Raises a ValueError if the instance does not have a method with the specified name.

Ancestors

  • unittest.case.TestCase

Methods

def test_argument_format(self)
Expand source code
def test_argument_format(self):
    with self.assertRaises(KeyError):
        Observable.argument_format('dont_exist')
    with self.assertRaises(KeyError):
        Observable.argument_format(['dont_exist', 1])
    with self.assertRaises(ValueError):
        Observable.argument_format(['eps_K', 1])
    with self.assertRaises(KeyError):
        Observable.argument_format({'name': 'dBR/dq2(B0->Denu)', 'bla': 1})
    with self.assertRaises(ValueError):
        Observable.argument_format(['dBR/dq2(B0->Denu)'])
    with self.assertRaises(ValueError):
        Observable.argument_format('dBR/dq2(B0->Denu)')
    self.assertTupleEqual(Observable.argument_format({'name': 'dBR/dq2(B0->Denu)', 'q2': 1}, 'tuple'),
                          ('dBR/dq2(B0->Denu)', 1))
    self.assertListEqual(Observable.argument_format({'name': 'dBR/dq2(B0->Denu)', 'q2': 1}, 'list'),
                          ['dBR/dq2(B0->Denu)', 1])
    self.assertDictEqual(Observable.argument_format({'name': 'dBR/dq2(B0->Denu)', 'q2': 1}, 'dict'),
                          {'name': 'dBR/dq2(B0->Denu)', 'q2': 1})
    self.assertEqual(Observable.argument_format('eps_K', 'tuple'),
                          'eps_K')
    self.assertEqual(Observable.argument_format('eps_K', 'list'),
                          'eps_K')
    self.assertDictEqual(Observable.argument_format('eps_K', 'dict'),
                          {'name': 'eps_K'})
def test_constraints_class(self)
Expand source code
def test_constraints_class(self):
    p = Parameter( 'test_mb' )
    self.assertEqual( p, Parameter.get_instance('test_mb') )
    self.assertEqual( p, Parameter['test_mb'] )
    c = ParameterConstraints()
    d = NormalDistribution(4.2, 0.2)
    c.add_constraint( ['test_mb'], d )
    # checking central values
    self.assertEqual( c.get_central('test_mb'), 4.2)
    # checking types and shapes of random values
    self.assertEqual( type(d.get_random()), float)
    self.assertEqual( d.get_random(3).shape, (3,))
    self.assertEqual( d.get_random((4,5)).shape, (4,5))
    test_1derrors_random = c.get_1d_errors_random()
    self.assertAlmostEqual( test_1derrors_random['test_mb'], 0.2, delta=0.5)
    test_1derrors_rightleft = c.get_1d_errors_rightleft()
    self.assertEqual( test_1derrors_rightleft['test_mb'], (0.2, 0.2))
    d = AsymmetricNormalDistribution(4.2, 0.2, 0.1)
    c.add_constraint( ['test_mb'], d )
    test_1derrors_rightleft = c.get_1d_errors_rightleft()
    self.assertEqual( test_1derrors_rightleft['test_mb'], (0.2, 0.1))
    pc = Parameter( 'test_mc' )
    c.add_constraint( ['test_mc', 'test_mb'], MultivariateNormalDistribution([1.2,4.2],[[0.01,0],[0,0.04]]) )
    c.get_logprobability_all(c.get_central_all())
    test_1derrors_random = c.get_1d_errors_random()
    self.assertAlmostEqual( test_1derrors_random['test_mb'], 0.2, delta=0.05)
    self.assertAlmostEqual( test_1derrors_random['test_mc'], 0.1, delta=0.05)
    test_1derrors_rightleft = c.get_1d_errors_rightleft()
    self.assertEqual( test_1derrors_rightleft['test_mb'], (0.2, 0.2))
    self.assertEqual( test_1derrors_rightleft['test_mc'], (0.1, 0.1))
    # removing dummy instances
    # check that they have been removed, using old and new syntax
    c.remove_constraint('test_mb')
    Parameter.del_instance('test_mb')
    with self.assertRaises(KeyError):
        Parameter['test_mb']
    del Parameter['test_mc']
    with self.assertRaises(KeyError):
        Parameter.get_instance('test_mc')
def test_constraints_class_exclude(self)
Expand source code
def test_constraints_class_exclude(self):
    Parameter( 'test_ma' )
    Parameter( 'test_mb' )
    Parameter( 'test_mc' )
    c2 = np.array([1e-3, 2])
    c3 = np.array([1e-3, 2, 0.4])
    cov22 = np.array([[(0.2e-3)**2, 0.2e-3*0.5*0.3],[0.2e-3*0.5*0.3, 0.5**2]])
    cov33 = np.array([[(0.2e-3)**2, 0.2e-3*0.5*0.3 , 0],[0.2e-3*0.5*0.3, 0.5**2, 0.01], [0, 0.01, 0.1**2]])
    pdf1 = NormalDistribution(2, 0.5)
    pdf2 = MultivariateNormalDistribution(c2, cov22)
    pdf3 = MultivariateNormalDistribution(c3, cov33)
    c1 = ParameterConstraints()
    c2 = ParameterConstraints()
    c3 = ParameterConstraints()
    c1.add_constraint(['test_mb'], pdf1)
    c2.add_constraint(['test_ma', 'test_mb'], pdf2)
    c3.add_constraint(['test_ma', 'test_mb', 'test_mc'], pdf3)
    par_dict = {'test_ma': 1.2e-3, 'test_mb': 2.4, 'test_mc': 0.33}
    self.assertEqual(
        c1.get_logprobability_all(par_dict)[pdf1],
        c2.get_logprobability_all(par_dict, exclude_parameters=['test_ma', 'test_mc'])[pdf2],
    )
    self.assertEqual(
        c1.get_logprobability_all(par_dict)[pdf1],
        c3.get_logprobability_all(par_dict, exclude_parameters=['test_ma', 'test_mc'])[pdf3],
    )
    self.assertEqual(
        c2.get_logprobability_all(par_dict)[pdf2],
        c3.get_logprobability_all(par_dict, exclude_parameters=['test_mc'])[pdf3],
    )
    # remove dummy instances
    Parameter.del_instance('test_ma')
    Parameter.del_instance('test_mb')
    Parameter.del_instance('test_mc')
def test_find(self)
Expand source code
def test_find(self):
    class TestClass(NamedInstanceClass):
        pass

    TestClass('test word 1')
    TestClass('x test word 2')
    TestClass('test 3')
    self.assertEqual(TestClass.find('word'), ['test word 1', 'x test word 2'])
    self.assertEqual(TestClass.find('^x'), ['x test word 2'])
    self.assertEqual(TestClass.find('s.*3'), ['test 3'])
def test_from_yaml_dict(self)
Expand source code
def test_from_yaml_dict(self):
    c = Constraints.from_yaml_dict([
    {'my_par_1': '1 +- 0.3 +- 0.4'},
    {'parameters': ['my_par_2'],
     'values': {
       'distribution': 'normal',
       'central_value': 2,
       'standard_deviation': 0.6,
       }
    },
    {'parameters': ['my_par_3'],
     'values': [{
       'distribution': 'normal',
       'central_value': 7,
       'standard_deviation': 0.3,
       },
       {
       'distribution': 'normal',
       'central_value': 7,
       'standard_deviation': 0.4,
     }]

    }
    ])
    self.assertListEqual(list(c._parameters.keys()), ['my_par_1', 'my_par_2', 'my_par_3'])
    c1 = c._parameters['my_par_1'][1]
    self.assertEqual(type(c1), NormalDistribution)
    self.assertEqual(c1.central_value, 1)
    self.assertEqual(c1.standard_deviation, 0.5)
    c2 = c._parameters['my_par_2'][1]
    self.assertEqual(type(c2), NormalDistribution)
    self.assertEqual(c2.central_value, 2)
    self.assertEqual(c2.standard_deviation, 0.6)
    c3 = c._parameters['my_par_3'][1]
    self.assertEqual(type(c3), NormalDistribution)
    self.assertEqual(c3.central_value, 7)
    self.assertEqual(c3.standard_deviation, 0.5)
    del c
def test_implementation_class(self)
Expand source code
def test_implementation_class(self):
    a = AuxiliaryQuantity( 'test_aux' )
    p = Parameter( 'test_parameter' )
    def f(wc_obj, par_dict):
        return par_dict['test_parameter']*2
    imp  = Implementation( 'test_imp', 'test_aux', f )
    config['implementation']['test_aux'] = 'test_imp'
    wc_obj = None
    c = ParameterConstraints()
    c.add_constraint( ['test_parameter'], NormalDistribution(1.2, 0.1) )
    self.assertEqual( imp.get_central(c, wc_obj), 2.4)
    self.assertEqual( a.prediction_central(c, wc_obj), 2.4)
    Implementation.show_all()
    # removing dummy instances
    AuxiliaryQuantity.del_instance('test_aux')
    Parameter.del_instance('test_parameter')
    Implementation.del_instance('test_imp')
    del config['implementation']['test_aux']
def test_logprobability_single(self)
Expand source code
def test_logprobability_single(self):
    c_corr = Constraints()
    c_uncorr = Constraints()
    d1 = NormalDistribution(2, 0.3)
    c_corr.add_constraint(['par_1'], d1)
    c_uncorr.add_constraint(['par_1'], d1)
    d23 = MultivariateNormalDistribution([4, 5],
        covariance=[[0.2**2, 0.5*0.2*0.3], [0.5*0.2*0.3, 0.3**2]])
    d2 = NormalDistribution(4, 0.2)
    d3 = NormalDistribution(5, 0.3)
    c_corr.add_constraint(['par_2', 'par_3'], d23)
    d23_uncorr = MultivariateNormalDistribution([4, 5], covariance=[[0.2, 0], [0, 0.3]])
    c_uncorr.add_constraint(['par_2'], d2)
    c_uncorr.add_constraint(['par_3'], d3)
    d = {'par_1': 2.8, 'par_2': 4.9, 'par_3': 4.3}
    # all logprobs for the uncorrelated case
    l_all = c_uncorr.get_logprobability_all(d)
    # the dict should contain the same values as the "single" ones in
    # the correlated case
    for k, v in l_all.items():
        par = dict(c_uncorr._constraints)[k][0]
        self.assertEqual(v,
                         c_corr.get_logprobability_single(par, d[par]),
                         msg="Failed for {}".format(par))
def test_measurement_class(self)
Expand source code
def test_measurement_class(self):
    o = Observable( 'test_obs' )
    d = NormalDistribution(4.2, 0.2)
    m = Measurement( 'measurement of test_obs' )
    m.add_constraint(['test_obs'], d)
    # removing dummy instances
    Observable.del_instance('test_obs')
    Measurement.del_instance('measurement of test_obs')
def test_measurements_yaml(self)
Expand source code
def test_measurements_yaml(self):
    import json
    for m in Measurement.instances.values():
        if (m.name in ['Belle B->D*lnu hadronic tag 2017',
                       'CLEO D->Kenu 2009',
                       'CLEO D->pienu 2009']
        or 'Pseudo-measurement' in m.name):
            continue  # known failures ...
        yaml = m.get_yaml_dict()
        mnew = Measurement.from_yaml_dict(yaml)
        yaml2 = mnew.get_yaml_dict()
        self.assertEqual(yaml, yaml2, msg="Failed for {}".format(m.name))
def test_obs_get_meas(self)
Expand source code
def test_obs_get_meas(self):
    self.assertEqual(
        Observable['eps_K'].get_measurements(),
        ['PDG kaon CPV']
    )
    self.assertEqual(
        sorted(Observable['<BR>(B+->rholnu)'].get_measurements()),
        sorted(['Belle B+->rholnu 2013', 'BaBar B+->rholnu 2010', 'BPR combination B->rholnu 2021'])
    )
    self.assertEqual(
        Observable['FL(B0->K*mumu)'].get_measurements(),
        []
    )
def test_observable_class(self)
Expand source code
def test_observable_class(self):
    o = Observable( 'test_obs' )
    self.assertEqual( o, Observable.get_instance('test_obs') )
    self.assertEqual( o, Observable['test_obs'] )
    o.set_description('some test observables')
    self.assertEqual( o.description, 'some test observables' )
    # removing dummy instances
    Observable.del_instance('test_obs')
def test_observable_from_function(self)
Expand source code
def test_observable_from_function(self):
    o1 = Observable('test_obs_1', arguments=['a1'])
    o2 = Observable('test_obs_2', arguments=['a2'])
    with self.assertRaises(ValueError):
        # non-existent obs
        Observable.from_function('test_obs_12',
                                 ['test_obs_x', 'test_obs_2'],
                                 lambda x, y: x-y)
    with self.assertRaises(AssertionError):
        # depend on different arguments
        Observable.from_function('test_obs_12',
                                 ['test_obs_1', 'test_obs_2'],
                                 lambda x, y: x-y)
    o2 = Observable('test_obs_2', arguments=['a1'])
    with self.assertRaises(AssertionError):
        # obs without prediction
        Observable.from_function('test_obs_12',
                                 ['test_obs_1', 'test_obs_2'],
                                 lambda x, y: x-y)
    Prediction('test_obs_1', lambda wc_obj, par: 3)
    Prediction('test_obs_2', lambda wc_obj, par: 7)
    Observable.from_function('test_obs_12',
                             ['test_obs_1', 'test_obs_2'],
                             lambda x, y: x-y)
    self.assertEqual(
        Observable['test_obs_12'].prediction_central(flavio.default_parameters, None),
        -4)
    self.assertEqual(Observable['test_obs_12'].arguments, ['a1'])
    # delete dummy instances
    Observable.del_instance('test_obs_1')
    Observable.del_instance('test_obs_2')
    Observable.del_instance('test_obs_12')
def test_observable_taxonomy(self)
Expand source code
def test_observable_taxonomy(self):
    o1 = Observable( 'test_obs_1' )
    o2 = Observable( 'test_obs_2' )
    o1.add_taxonomy('test 1 :: test 2 :: test 3')
    o2.add_taxonomy('test 1 :: test 2 :: test 3')
    self.assertDictEqual(
        Observable.taxonomy_dict()['test 1'],
        {'test 2': {'test 3': {'test_obs_1' :{}, 'test_obs_2':{}}}}
    )
    # remove test from taxonomy
    Observable.taxonomy.pop('test 1', None)
    # removing dummy instances
    Observable.del_instance('test_obs_1')
    Observable.del_instance('test_obs_2')
def test_parameter_class(self)
Expand source code
def test_parameter_class(self):
    p = Parameter( 'test_mb' )
    self.assertEqual( p, Parameter.get_instance('test_mb') )
    self.assertEqual( p, Parameter['test_mb'] )
    p.set_description('b quark mass')
    self.assertEqual( p.description, 'b quark mass' )
    # removing dummy instances
    Parameter.del_instance('test_mb')
def test_parameter_constraints_yaml(self)
Expand source code
def test_parameter_constraints_yaml(self):
    yaml = flavio.default_parameters.get_yaml()
    pnew = ParameterConstraints.from_yaml(yaml)
    yaml2 = pnew.get_yaml()
    self.assertEqual(yaml, yaml2)
def test_pdf(self)
Expand source code
def test_pdf(self):
    # for the normal dist's, just check that no error is raised
    pd = NormalDistribution(1., 0.2)
    pd.logpdf(0.5)
    pd = MultivariateNormalDistribution([1.,2.], [[0.04,0],[0,0.09]])
    pd.logpdf([1.05,2.08])
    # for the asymmetric dist, more scrutiny needed
    pd = AsymmetricNormalDistribution(1., 0.2, 0.5)
    eps = 1.e-8
    # check that the PDF is continuos
    self.assertAlmostEqual( pd.logpdf(1. - eps), pd.logpdf(1. + eps), places=8)
    # check that the PDF is properly normalized
    self.assertEqual( scipy.integrate.quad(lambda x: math.exp(pd.logpdf(x)), -np.inf, +np.inf)[0], 1)
def test_prediction_class(self)
Expand source code
def test_prediction_class(self):
    o = Observable( 'test_obs' )
    p = Parameter( 'test_parameter' )
    def f(wc_obj, par_dict):
        return par_dict['test_parameter']*2
    pr  = Prediction( 'test_obs', f )
    wc_obj = None
    c = ParameterConstraints()
    c.add_constraint( ['test_parameter'], NormalDistribution(1.2, 0.1) )
    self.assertEqual( pr.get_central(c, wc_obj), 2.4)
    self.assertEqual( o.prediction_central(c, wc_obj), 2.4)
    # removing dummy instances
    Observable.del_instance('test_obs')
    Parameter.del_instance('test_parameter')
def test_repr_meas(self)
Expand source code
def test_repr_meas(self):
    mtest = Measurement('repr test')
    self.assertEqual(repr(mtest), "Measurement('repr test')")
    mtest._repr_markdown_()
    mtest.description = "bla"
    self.assertIn("bla", mtest._repr_markdown_())
    mtest.url = "blo"
    self.assertIn("blo", mtest._repr_markdown_())
    del Measurement['repr test']
def test_repr_obs(self)
Expand source code
def test_repr_obs(self):
    mtest = Observable('repr test')
    self.assertEqual(repr(mtest),
                     "Observable('repr test', arguments=None)")
    mtest._repr_markdown_()
    mtest.description = "bla"
    self.assertIn("bla", mtest._repr_markdown_())
    mtest.tex = "blo"
    self.assertIn("blo", mtest._repr_markdown_())
    mtest.arguments = ["blu"]
    self.assertIn("blu", mtest._repr_markdown_())
    self.assertEqual(repr(mtest),
                     "Observable('repr test', arguments=['blu'])")
    del Observable['repr test']
def test_repr_par(self)
Expand source code
def test_repr_par(self):
    ptest = Parameter('repr test')
    self.assertEqual(repr(ptest),
                     "Parameter('repr test')")
    ptest._repr_markdown_()
    ptest.description = "bla"
    self.assertIn("bla", ptest._repr_markdown_())
    ptest.tex = "blo"
    self.assertIn("blo", ptest._repr_markdown_())
    del Parameter['repr test']
def test_set_constraint(self)
Expand source code
def test_set_constraint(self):
    p = Parameter( 'test_mb' )
    c = ParameterConstraints()
    c.set_constraint('test_mb', '4.2 +- 0.1 +- 0.2')
    cons = c._parameters['test_mb'][1]
    self.assertIsInstance(cons, NormalDistribution)
    self.assertEqual(cons.central_value, 4.2)
    self.assertEqual(cons.standard_deviation, math.sqrt(0.1**2+0.2**2))
    c.set_constraint('test_mb', '4.3 + 0.3 - 0.4')
    cons = c._parameters['test_mb'][1]
    self.assertIsInstance(cons, AsymmetricNormalDistribution)
    self.assertEqual(cons.central_value, 4.3)
    self.assertEqual(cons.right_deviation, 0.3)
    self.assertEqual(cons.left_deviation, 0.4)
    c.set_constraint('test_mb', 4.4)
    cons = c._parameters['test_mb'][1]
    self.assertIsInstance(cons, DeltaDistribution)
    self.assertEqual(cons.central_value, 4.4)
    cons_dict_1 = {'distribution': 'normal',
                 'central_value': '4.5',
                 'standard_deviation': '0.1'}
    cons_dict_2 = {'distribution': 'normal',
                 'central_value': 4.5,
                 'standard_deviation': 0.2}
    c.set_constraint('test_mb', constraint_dict=cons_dict_1)
    cons = c._parameters['test_mb'][1]
    self.assertIsInstance(cons, NormalDistribution)
    self.assertEqual(cons.central_value, 4.5)
    self.assertEqual(cons.standard_deviation, 0.1)
    c.set_constraint('test_mb', constraint_dict=[cons_dict_1, cons_dict_2])
    cons = c._parameters['test_mb'][1]
    self.assertIsInstance(cons, NormalDistribution)
    self.assertEqual(cons.central_value, 4.5)
    self.assertEqual(cons.standard_deviation, math.sqrt(0.1**2+0.2**2))
    Parameter.del_instance('test_mb')