diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index afb3a5cbb4c6be452a01f304d30808ffc639548a..e9a72a2c56d4d62655f4a4c0d1510e0426f18a40 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -157,3 +157,18 @@ deploy_release: - twine upload dist/* only: - tags + + +precommits-py3.7: + stage: test + image: bilbydev/v2-dockerfile-test-suite-python37 + script: + - source activate python37 + - mkdir -p .pip37 + - pip install --upgrade pip + - pip --cache-dir=.pip37 install --upgrade bilby + - pip --cache-dir=.pip37 install . + - pip --cache-dir=.pip37 install pre-commit + + # Run precommits (flake8, spellcheck, isort, no merge conflicts, etc) + - pre-commit run --all-files --verbose --show-diff-on-failure diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..584f8a6395f249eb1ea039ff8fff466e968b99ef --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,22 @@ +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v2.3.0 + hooks: + - id: check-merge-conflict # prevent committing files with merge conflicts + - id: flake8 # checks for flake8 errors +#- repo: https://github.com/codespell-project/codespell +# rev: v1.16.0 +# hooks: +# - id: codespell # Spellchecker +# args: [-L, nd, --skip, "*.ipynb,*.html", --ignore-words=.dictionary.txt] +# exclude: ^examples/tutorials/ +#- repo: https://github.com/asottile/seed-isort-config +# rev: v1.3.0 +# hooks: +# - id: seed-isort-config +# args: [--application-directories, 'bilby/'] +#- repo: https://github.com/pre-commit/mirrors-isort +# rev: v4.3.21 +# hooks: +# - id: isort # sort imports alphabetically and separates import into sections +# args: [-w=88, -m=3, -tc, -sp=setup.cfg ] diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7f06615b5cea7b69218515d600424d1990f5ce83..fad47cfea4302f734ed66a0783471444a1edc0b8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -49,6 +49,33 @@ def my_new_function(x, y, print=False): 5. Don't repeat yourself. If code is repeated in multiple places, wrap it up into a function. 6. Add tests. The C.I. is there to do the work of "checking" the code, both now and into the future. Use it. +## Automated code checking + +In order to automate checking of the code quality, we use +[pre-commit](https://pre-commit.com/). For more details, see the documentation, +here we will give a quick-start guide: +1. Install and configure: +```console +$ pip install pre-commit # install the pre-commit package +$ cd bilby +$ pre-commit install +``` +2. Now, when you run `$ git commit`, there will be a pre-commit check. + This is going to search for issues in your code: spelling, formatting, etc. + In some cases, it will automatically fix the code, in other cases, it will + print a warning. If it automatically fixed the code, you'll need to add the + changes to the index (`$ git add FILE.py`) and run `$ git commit` again. If + it didn't automatically fix the code, but still failed, it will have printed + a message as to why the commit failed. Read the message, fix the issues, + then recommit. +3. The pre-commit checks are done to avoid pushing and then failing. But, you + can skip them by running `$ git commit --no-verify`, but note that the C.I. + still does the check so you won't be able to merge until the issues are + resolved. +If you experience any issues with pre-commit, please ask for support on the +usual help channels. + + ## Code relevance The bilby code base is intended to be highly modular and flexible. We encourage diff --git a/docs/conf.py b/docs/conf.py index 0a8f39f461a3b222c902d1cb18b48c74b2534bc0..3f7baa1e30c05be5d907b00a6c97abcb248f3597 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -173,5 +173,3 @@ texinfo_documents = [ ] numpydoc_show_class_members = False - - diff --git a/setup.cfg b/setup.cfg index ad60888c125af2650afb6c2b495a3cbf720123e0..3be0c12d81dd02e9544e2bf520941df0ccd68546 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,7 +1,7 @@ [flake8] exclude = .git,docs,build,dist,test,*__init__.py max-line-length = 120 -ignore = E129 W503 W504 W605 E203 +ignore = E129 W503 W504 W605 E203 E402 [tool:pytest] addopts = diff --git a/test/calibration_test.py b/test/calibration_test.py index 48f0544a0e376e6be5acc1984466288f0739221b..3b0fd708bd07395f0aecffae26971a6e5c9cc8f6 100644 --- a/test/calibration_test.py +++ b/test/calibration_test.py @@ -4,7 +4,6 @@ import numpy as np class TestBaseClass(unittest.TestCase): - def setUp(self): self.model = calibration.Recalibrate() @@ -12,7 +11,7 @@ class TestBaseClass(unittest.TestCase): del self.model def test_repr(self): - expected = 'Recalibrate(prefix={})'.format('\'recalib_\'') + expected = "Recalibrate(prefix={})".format("'recalib_'") actual = repr(self.model) self.assertEqual(expected, actual) @@ -23,18 +22,22 @@ class TestBaseClass(unittest.TestCase): class TestCubicSpline(unittest.TestCase): - def setUp(self): - self.prefix = 'recalib_' + self.prefix = "recalib_" self.minimum_frequency = 20 self.maximum_frequency = 1024 self.n_points = 5 self.model = calibration.CubicSpline( - prefix=self.prefix, minimum_frequency=self.minimum_frequency, - maximum_frequency=self.maximum_frequency, n_points=self.n_points) - self.parameters = {'recalib_{}_{}'.format(param, ii): 0.0 - for ii in range(5) - for param in ['amplitude', 'phase']} + prefix=self.prefix, + minimum_frequency=self.minimum_frequency, + maximum_frequency=self.maximum_frequency, + n_points=self.n_points, + ) + self.parameters = { + "recalib_{}_{}".format(param, ii): 0.0 + for ii in range(5) + for param in ["amplitude", "phase"] + } def tearDown(self): del self.prefix @@ -46,27 +49,28 @@ class TestCubicSpline(unittest.TestCase): def test_calibration_factor(self): frequency_array = np.linspace(20, 1024, 1000) - cal_factor = self.model.get_calibration_factor(frequency_array, - **self.parameters) + cal_factor = self.model.get_calibration_factor( + frequency_array, **self.parameters + ) assert np.alltrue(cal_factor.real == np.ones_like(frequency_array)) def test_repr(self): - expected = 'CubicSpline(prefix=\'{}\', minimum_frequency={}, maximum_frequency={}, n_points={})'\ - .format(self.prefix, self.minimum_frequency, self.maximum_frequency, self.n_points) + expected = "CubicSpline(prefix='{}', minimum_frequency={}, maximum_frequency={}, n_points={})".format( + self.prefix, self.minimum_frequency, self.maximum_frequency, self.n_points + ) actual = repr(self.model) self.assertEqual(expected, actual) class TestCubicSplineRequiresFourNodes(unittest.TestCase): - def test_cannot_instantiate_with_too_few_nodes(self): for ii in range(6): if ii < 4: with self.assertRaises(ValueError): - calibration.CubicSpline('test', 1, 10, ii) + calibration.CubicSpline("test", 1, 10, ii) else: - calibration.CubicSpline('test', 1, 10, ii) + calibration.CubicSpline("test", 1, 10, ii) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/test/context.py b/test/context.py index 51b34ed4ebce1df271dab84d0392090fd702dcbc..ed1eb85ae53420d4f127f29b3ed05f89fdf6de0a 100644 --- a/test/context.py +++ b/test/context.py @@ -1,5 +1,6 @@ import os import sys -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) -import bilby +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) + +import bilby # noqa diff --git a/test/conversion_test.py b/test/conversion_test.py index a9729099faeca2cbfac63da4ee900b7143d11987..fcd0443523d9a377e2e8e41cb68a15979b89e946 100644 --- a/test/conversion_test.py +++ b/test/conversion_test.py @@ -1,6 +1,5 @@ from __future__ import division, absolute_import import unittest -import mock import numpy as np @@ -9,36 +8,55 @@ from bilby.gw import conversion class TestBasicConversions(unittest.TestCase): - def setUp(self): self.mass_1 = 1.4 self.mass_2 = 1.3 - self.mass_ratio = 13/14 + self.mass_ratio = 13 / 14 self.total_mass = 2.7 - self.chirp_mass = (1.4 * 1.3)**0.6 / 2.7**0.2 - self.symmetric_mass_ratio = (1.4 * 1.3) / 2.7**2 + self.chirp_mass = (1.4 * 1.3) ** 0.6 / 2.7 ** 0.2 + self.symmetric_mass_ratio = (1.4 * 1.3) / 2.7 ** 2 self.cos_angle = -1 self.angle = np.pi self.lambda_1 = 300 - self.lambda_2 = 300 * (14 / 13)**5 - self.lambda_tilde = 8 / 13 * ( - (1 + 7 * self.symmetric_mass_ratio - - 31 * self.symmetric_mass_ratio**2) - * (self.lambda_1 + self.lambda_2) - + (1 - 4 * self.symmetric_mass_ratio)**0.5 - * (1 + 9 * self.symmetric_mass_ratio - - 11 * self.symmetric_mass_ratio**2) - * (self.lambda_1 - self.lambda_2) + self.lambda_2 = 300 * (14 / 13) ** 5 + self.lambda_tilde = ( + 8 + / 13 + * ( + ( + 1 + + 7 * self.symmetric_mass_ratio + - 31 * self.symmetric_mass_ratio ** 2 + ) + * (self.lambda_1 + self.lambda_2) + + (1 - 4 * self.symmetric_mass_ratio) ** 0.5 + * ( + 1 + + 9 * self.symmetric_mass_ratio + - 11 * self.symmetric_mass_ratio ** 2 + ) + * (self.lambda_1 - self.lambda_2) + ) ) - self.delta_lambda_tilde = 1 / 2 * ( - (1 - 4 * self.symmetric_mass_ratio)**0.5 - * (1 - 13272 / 1319 * self.symmetric_mass_ratio - + 8944 / 1319 * self.symmetric_mass_ratio**2) + self.delta_lambda_tilde = ( + 1 + / 2 + * ( + (1 - 4 * self.symmetric_mass_ratio) ** 0.5 + * ( + 1 + - 13272 / 1319 * self.symmetric_mass_ratio + + 8944 / 1319 * self.symmetric_mass_ratio ** 2 + ) * (self.lambda_1 + self.lambda_2) - + (1 - 15910 / 1319 * self.symmetric_mass_ratio - + 32850 / 1319 * self.symmetric_mass_ratio**2 - + 3380 / 1319 * self.symmetric_mass_ratio**3) + + ( + 1 + - 15910 / 1319 * self.symmetric_mass_ratio + + 32850 / 1319 * self.symmetric_mass_ratio ** 2 + + 3380 / 1319 * self.symmetric_mass_ratio ** 3 + ) * (self.lambda_1 - self.lambda_2) + ) ) def tearDown(self): @@ -50,25 +68,35 @@ class TestBasicConversions(unittest.TestCase): del self.symmetric_mass_ratio def test_total_mass_and_mass_ratio_to_component_masses(self): - mass_1, mass_2 = conversion.total_mass_and_mass_ratio_to_component_masses(self.mass_ratio, self.total_mass) - self.assertTrue(all([abs(mass_1 - self.mass_1) < 1e-5, - abs(mass_2 - self.mass_2) < 1e-5])) + mass_1, mass_2 = conversion.total_mass_and_mass_ratio_to_component_masses( + self.mass_ratio, self.total_mass + ) + self.assertTrue( + all([abs(mass_1 - self.mass_1) < 1e-5, abs(mass_2 - self.mass_2) < 1e-5]) + ) def test_chirp_mass_and_primary_mass_to_mass_ratio(self): mass_ratio = conversion.chirp_mass_and_primary_mass_to_mass_ratio( - self.chirp_mass, self.mass_1) + self.chirp_mass, self.mass_1 + ) self.assertAlmostEqual(self.mass_ratio, mass_ratio) def test_symmetric_mass_ratio_to_mass_ratio(self): - mass_ratio = conversion.symmetric_mass_ratio_to_mass_ratio(self.symmetric_mass_ratio) + mass_ratio = conversion.symmetric_mass_ratio_to_mass_ratio( + self.symmetric_mass_ratio + ) self.assertAlmostEqual(self.mass_ratio, mass_ratio) def test_chirp_mass_and_total_mass_to_symmetric_mass_ratio(self): - symmetric_mass_ratio = conversion.chirp_mass_and_total_mass_to_symmetric_mass_ratio(self.chirp_mass, self.total_mass) + symmetric_mass_ratio = conversion.chirp_mass_and_total_mass_to_symmetric_mass_ratio( + self.chirp_mass, self.total_mass + ) self.assertAlmostEqual(self.symmetric_mass_ratio, symmetric_mass_ratio) def test_chirp_mass_and_mass_ratio_to_total_mass(self): - total_mass = conversion.chirp_mass_and_mass_ratio_to_total_mass(self.chirp_mass, self.mass_ratio) + total_mass = conversion.chirp_mass_and_mass_ratio_to_total_mass( + self.chirp_mass, self.mass_ratio + ) self.assertAlmostEqual(self.total_mass, total_mass) def test_component_masses_to_chirp_mass(self): @@ -80,7 +108,9 @@ class TestBasicConversions(unittest.TestCase): self.assertAlmostEqual(self.total_mass, total_mass) def test_component_masses_to_symmetric_mass_ratio(self): - symmetric_mass_ratio = conversion.component_masses_to_symmetric_mass_ratio(self.mass_1, self.mass_2) + symmetric_mass_ratio = conversion.component_masses_to_symmetric_mass_ratio( + self.mass_1, self.mass_2 + ) self.assertAlmostEqual(self.symmetric_mass_ratio, symmetric_mass_ratio) def test_component_masses_to_mass_ratio(self): @@ -88,196 +118,281 @@ class TestBasicConversions(unittest.TestCase): self.assertAlmostEqual(self.mass_ratio, mass_ratio) def test_mass_1_and_chirp_mass_to_mass_ratio(self): - mass_ratio = conversion.mass_1_and_chirp_mass_to_mass_ratio(self.mass_1, self.chirp_mass) + mass_ratio = conversion.mass_1_and_chirp_mass_to_mass_ratio( + self.mass_1, self.chirp_mass + ) self.assertAlmostEqual(self.mass_ratio, mass_ratio) def test_lambda_tilde_to_lambda_1_lambda_2(self): - lambda_1, lambda_2 =\ - conversion.lambda_tilde_to_lambda_1_lambda_2( - self.lambda_tilde, self.mass_1, self.mass_2) - self.assertTrue(all([abs(self.lambda_1 - lambda_1) < 1e-5, - abs(self.lambda_2 - lambda_2) < 1e-5])) + lambda_1, lambda_2 = conversion.lambda_tilde_to_lambda_1_lambda_2( + self.lambda_tilde, self.mass_1, self.mass_2 + ) + self.assertTrue( + all( + [ + abs(self.lambda_1 - lambda_1) < 1e-5, + abs(self.lambda_2 - lambda_2) < 1e-5, + ] + ) + ) def test_lambda_tilde_delta_lambda_tilde_to_lambda_1_lambda_2(self): - lambda_1, lambda_2 =\ - conversion.lambda_tilde_delta_lambda_tilde_to_lambda_1_lambda_2( - self.lambda_tilde, self.delta_lambda_tilde, self.mass_1, self.mass_2) - self.assertTrue(all([abs(self.lambda_1 - lambda_1) < 1e-5, - abs(self.lambda_2 - lambda_2) < 1e-5])) + ( + lambda_1, + lambda_2, + ) = conversion.lambda_tilde_delta_lambda_tilde_to_lambda_1_lambda_2( + self.lambda_tilde, self.delta_lambda_tilde, self.mass_1, self.mass_2 + ) + self.assertTrue( + all( + [ + abs(self.lambda_1 - lambda_1) < 1e-5, + abs(self.lambda_2 - lambda_2) < 1e-5, + ] + ) + ) def test_lambda_1_lambda_2_to_lambda_tilde(self): - lambda_tilde = \ - conversion.lambda_1_lambda_2_to_lambda_tilde( - self.lambda_1, self.lambda_2, self.mass_1, self.mass_2) + lambda_tilde = conversion.lambda_1_lambda_2_to_lambda_tilde( + self.lambda_1, self.lambda_2, self.mass_1, self.mass_2 + ) self.assertTrue((self.lambda_tilde - lambda_tilde) < 1e-5) def test_lambda_1_lambda_2_to_delta_lambda_tilde(self): - delta_lambda_tilde = \ - conversion.lambda_1_lambda_2_to_delta_lambda_tilde( - self.lambda_1, self.lambda_2, self.mass_1, self.mass_2) + delta_lambda_tilde = conversion.lambda_1_lambda_2_to_delta_lambda_tilde( + self.lambda_1, self.lambda_2, self.mass_1, self.mass_2 + ) self.assertTrue((self.delta_lambda_tilde - delta_lambda_tilde) < 1e-5) class TestConvertToLALParams(unittest.TestCase): - def setUp(self): self.search_keys = [] self.parameters = dict() self.component_mass_pars = dict(mass_1=1.4, mass_2=1.4) self.mass_parameters = self.component_mass_pars.copy() - self.mass_parameters['mass_ratio'] =\ - conversion.component_masses_to_mass_ratio(**self.component_mass_pars) - self.mass_parameters['symmetric_mass_ratio'] = \ - conversion.component_masses_to_symmetric_mass_ratio(**self.component_mass_pars) - self.mass_parameters['chirp_mass'] = \ - conversion.component_masses_to_chirp_mass(**self.component_mass_pars) - self.mass_parameters['total_mass'] = \ - conversion.component_masses_to_total_mass(**self.component_mass_pars) + self.mass_parameters["mass_ratio"] = conversion.component_masses_to_mass_ratio( + **self.component_mass_pars + ) + self.mass_parameters[ + "symmetric_mass_ratio" + ] = conversion.component_masses_to_symmetric_mass_ratio( + **self.component_mass_pars + ) + self.mass_parameters["chirp_mass"] = conversion.component_masses_to_chirp_mass( + **self.component_mass_pars + ) + self.mass_parameters["total_mass"] = conversion.component_masses_to_total_mass( + **self.component_mass_pars + ) self.component_tidal_parameters = dict(lambda_1=300, lambda_2=300) self.all_component_pars = self.component_tidal_parameters.copy() self.all_component_pars.update(self.component_mass_pars) self.tidal_parameters = self.component_tidal_parameters.copy() - self.tidal_parameters['lambda_tilde'] = \ - conversion.lambda_1_lambda_2_to_lambda_tilde(**self.all_component_pars) - self.tidal_parameters['delta_lambda_tilde'] = \ - conversion.lambda_1_lambda_2_to_delta_lambda_tilde(**self.all_component_pars) + self.tidal_parameters[ + "lambda_tilde" + ] = conversion.lambda_1_lambda_2_to_lambda_tilde(**self.all_component_pars) + self.tidal_parameters[ + "delta_lambda_tilde" + ] = conversion.lambda_1_lambda_2_to_delta_lambda_tilde( + **self.all_component_pars + ) def tearDown(self): del self.search_keys del self.parameters def bbh_convert(self): - self.parameters, self.added_keys =\ - conversion.convert_to_lal_binary_black_hole_parameters( - self.parameters) + ( + self.parameters, + self.added_keys, + ) = conversion.convert_to_lal_binary_black_hole_parameters(self.parameters) def bns_convert(self): - self.parameters, self.added_keys = \ - conversion.convert_to_lal_binary_neutron_star_parameters( - self.parameters) + ( + self.parameters, + self.added_keys, + ) = conversion.convert_to_lal_binary_neutron_star_parameters(self.parameters) def test_redshift_to_luminosity_distance(self): - self.parameters['redshift'] = 1 - dl = conversion.redshift_to_luminosity_distance( - self.parameters['redshift']) + self.parameters["redshift"] = 1 + dl = conversion.redshift_to_luminosity_distance(self.parameters["redshift"]) self.bbh_convert() - self.assertEqual(self.parameters['luminosity_distance'], dl) + self.assertEqual(self.parameters["luminosity_distance"], dl) def test_comoving_to_luminosity_distance(self): - self.parameters['comoving_distance'] = 1 + self.parameters["comoving_distance"] = 1 dl = conversion.comoving_distance_to_luminosity_distance( - self.parameters['comoving_distance']) + self.parameters["comoving_distance"] + ) self.bbh_convert() - self.assertEqual(self.parameters['luminosity_distance'], dl) + self.assertEqual(self.parameters["luminosity_distance"], dl) def test_source_to_lab_frame(self): - self.parameters['test_source'] = 1 - self.parameters['redshift'] = 1 - lab = self.parameters['test_source'] * (1 + self.parameters['redshift']) + self.parameters["test_source"] = 1 + self.parameters["redshift"] = 1 + lab = self.parameters["test_source"] * (1 + self.parameters["redshift"]) self.bbh_convert() - self.assertEqual(self.parameters['test'], lab) + self.assertEqual(self.parameters["test"], lab) def _conversion_to_component_mass(self, keys): for key in keys: self.parameters[key] = self.mass_parameters[key] self.bbh_convert() self.assertAlmostEqual( - max([abs(self.parameters[key] - self.component_mass_pars[key]) - for key in ['mass_1', 'mass_2']]), 0) + max( + [ + abs(self.parameters[key] - self.component_mass_pars[key]) + for key in ["mass_1", "mass_2"] + ] + ), + 0, + ) def test_chirp_mass_total_mass(self): - self._conversion_to_component_mass(['chirp_mass', 'total_mass']) + self._conversion_to_component_mass(["chirp_mass", "total_mass"]) def test_chirp_mass_sym_mass_ratio(self): - self._conversion_to_component_mass(['chirp_mass', 'symmetric_mass_ratio']) + self._conversion_to_component_mass(["chirp_mass", "symmetric_mass_ratio"]) def test_chirp_mass_mass_ratio(self): - self._conversion_to_component_mass(['chirp_mass', 'mass_ratio']) + self._conversion_to_component_mass(["chirp_mass", "mass_ratio"]) def test_total_mass_sym_mass_ratio(self): - self._conversion_to_component_mass(['total_mass', 'symmetric_mass_ratio']) + self._conversion_to_component_mass(["total_mass", "symmetric_mass_ratio"]) def test_total_mass_mass_ratio(self): - self._conversion_to_component_mass(['total_mass', 'mass_ratio']) + self._conversion_to_component_mass(["total_mass", "mass_ratio"]) def test_total_mass_mass_1(self): - self._conversion_to_component_mass(['total_mass', 'mass_1']) + self._conversion_to_component_mass(["total_mass", "mass_1"]) def test_total_mass_mass_2(self): - self._conversion_to_component_mass(['total_mass', 'mass_2']) + self._conversion_to_component_mass(["total_mass", "mass_2"]) def test_sym_mass_ratio_mass_1(self): - self._conversion_to_component_mass(['symmetric_mass_ratio', 'mass_1']) + self._conversion_to_component_mass(["symmetric_mass_ratio", "mass_1"]) def test_sym_mass_ratio_mass_2(self): - self._conversion_to_component_mass(['symmetric_mass_ratio', 'mass_2']) + self._conversion_to_component_mass(["symmetric_mass_ratio", "mass_2"]) def test_mass_ratio_mass_1(self): - self._conversion_to_component_mass(['mass_ratio', 'mass_1']) + self._conversion_to_component_mass(["mass_ratio", "mass_1"]) def test_mass_ratio_mass_2(self): - self._conversion_to_component_mass(['mass_ratio', 'mass_2']) + self._conversion_to_component_mass(["mass_ratio", "mass_2"]) def test_bbh_aligned_spin_to_spherical(self): - self.parameters['chi_1'] = -0.5 - a_1 = abs(self.parameters['chi_1']) - tilt_1 = np.arccos(np.sign(self.parameters['chi_1'])) + self.parameters["chi_1"] = -0.5 + a_1 = abs(self.parameters["chi_1"]) + tilt_1 = np.arccos(np.sign(self.parameters["chi_1"])) phi_jl = 0.0 phi_12 = 0.0 self.bbh_convert() self.assertDictEqual( - {key: self.parameters[key] - for key in ['a_1', 'tilt_1', 'phi_12', 'phi_jl']}, - dict(a_1=a_1, tilt_1=tilt_1, phi_jl=phi_jl, phi_12=phi_12)) + { + key: self.parameters[key] + for key in ["a_1", "tilt_1", "phi_12", "phi_jl"] + }, + dict(a_1=a_1, tilt_1=tilt_1, phi_jl=phi_jl, phi_12=phi_12), + ) def test_bbh_cos_angle_to_angle_conversion(self): - self.parameters['cos_tilt_1'] = 1 - t1 = np.arccos(self.parameters['cos_tilt_1']) + self.parameters["cos_tilt_1"] = 1 + t1 = np.arccos(self.parameters["cos_tilt_1"]) self.bbh_convert() - self.assertEqual(self.parameters['tilt_1'], t1) + self.assertEqual(self.parameters["tilt_1"], t1) def _conversion_to_component_tidal(self, keys): for key in keys: self.parameters[key] = self.tidal_parameters[key] - for key in ['mass_1', 'mass_2']: + for key in ["mass_1", "mass_2"]: self.parameters[key] = self.mass_parameters[key] self.bns_convert() - component_dict = { - key: self.parameters[key] for key in ['lambda_1', 'lambda_2']} + component_dict = {key: self.parameters[key] for key in ["lambda_1", "lambda_2"]} self.assertDictEqual(component_dict, self.component_tidal_parameters) def test_lambda_tilde_delta_lambda_tilde(self): - self._conversion_to_component_tidal(['lambda_tilde', 'delta_lambda_tilde']) + self._conversion_to_component_tidal(["lambda_tilde", "delta_lambda_tilde"]) def test_lambda_tilde(self): - self._conversion_to_component_tidal(['lambda_tilde']) + self._conversion_to_component_tidal(["lambda_tilde"]) def test_lambda_1(self): - self._conversion_to_component_tidal(['lambda_1']) + self._conversion_to_component_tidal(["lambda_1"]) class TestGenerateAllParameters(unittest.TestCase): - def setUp(self): self.parameters = dict( - mass_1=36., mass_2=29., a_1=0.4, a_2=0.3, tilt_1=0.5, tilt_2=1.0, - phi_12=1.7, phi_jl=0.3, luminosity_distance=2000., theta_jn=0.4, - psi=2.659, phase=1.3, geocent_time=1126259642.413, ra=1.375, - dec=-1.2108, lambda_tilde=1000, delta_lambda_tilde=0) + mass_1=36.0, + mass_2=29.0, + a_1=0.4, + a_2=0.3, + tilt_1=0.5, + tilt_2=1.0, + phi_12=1.7, + phi_jl=0.3, + luminosity_distance=2000.0, + theta_jn=0.4, + psi=2.659, + phase=1.3, + geocent_time=1126259642.413, + ra=1.375, + dec=-1.2108, + lambda_tilde=1000, + delta_lambda_tilde=0, + ) self.expected_bbh_keys = [ - 'mass_1', 'mass_2', 'a_1', 'a_2', 'tilt_1', 'tilt_2', 'phi_12', - 'phi_jl', 'luminosity_distance', 'theta_jn', 'psi', 'phase', - 'geocent_time', 'ra', 'dec', 'reference_frequency', - 'waveform_approximant', 'minimum_frequency', 'chirp_mass', - 'total_mass', 'symmetric_mass_ratio', 'mass_ratio', 'iota', - 'spin_1x', 'spin_1y', 'spin_1z', 'spin_2x', 'spin_2y', 'spin_2z', - 'phi_1', 'phi_2', 'chi_eff', 'chi_1_in_plane', 'chi_2_in_plane', - 'chi_p', 'cos_tilt_1', 'cos_tilt_2', 'redshift', - 'comoving_distance', 'mass_1_source', 'mass_2_source', - 'chirp_mass_source', 'total_mass_source' + "mass_1", + "mass_2", + "a_1", + "a_2", + "tilt_1", + "tilt_2", + "phi_12", + "phi_jl", + "luminosity_distance", + "theta_jn", + "psi", + "phase", + "geocent_time", + "ra", + "dec", + "reference_frequency", + "waveform_approximant", + "minimum_frequency", + "chirp_mass", + "total_mass", + "symmetric_mass_ratio", + "mass_ratio", + "iota", + "spin_1x", + "spin_1y", + "spin_1z", + "spin_2x", + "spin_2y", + "spin_2z", + "phi_1", + "phi_2", + "chi_eff", + "chi_1_in_plane", + "chi_2_in_plane", + "chi_p", + "cos_tilt_1", + "cos_tilt_2", + "redshift", + "comoving_distance", + "mass_1_source", + "mass_2_source", + "chirp_mass_source", + "total_mass_source", ] self.expected_tidal_keys = [ - 'lambda_1', 'lambda_2', 'lambda_tilde', 'delta_lambda_tilde' + "lambda_1", + "lambda_2", + "lambda_tilde", + "delta_lambda_tilde", ] def test_generate_all_bbh_parameters(self): @@ -296,25 +411,28 @@ class TestGenerateAllParameters(unittest.TestCase): class TestDistanceTransformations(unittest.TestCase): - def setUp(self): self.distances = np.linspace(1, 1000, 100) def test_luminosity_redshift_with_cosmology(self): - z = conversion.luminosity_distance_to_redshift(self.distances, cosmology='WMAP9') - dl = conversion.redshift_to_luminosity_distance(z, cosmology='WMAP9') + z = conversion.luminosity_distance_to_redshift( + self.distances, cosmology="WMAP9" + ) + dl = conversion.redshift_to_luminosity_distance(z, cosmology="WMAP9") self.assertAlmostEqual(max(abs(dl - self.distances)), 0, 4) def test_comoving_redshift_with_cosmology(self): - z = conversion.comoving_distance_to_redshift(self.distances, cosmology='WMAP9') - dc = conversion.redshift_to_comoving_distance(z, cosmology='WMAP9') + z = conversion.comoving_distance_to_redshift(self.distances, cosmology="WMAP9") + dc = conversion.redshift_to_comoving_distance(z, cosmology="WMAP9") self.assertAlmostEqual(max(abs(dc - self.distances)), 0, 4) def test_comoving_luminosity_with_cosmology(self): - dc = conversion.comoving_distance_to_luminosity_distance(self.distances, cosmology='WMAP9') - dl = conversion.luminosity_distance_to_comoving_distance(dc, cosmology='WMAP9') + dc = conversion.comoving_distance_to_luminosity_distance( + self.distances, cosmology="WMAP9" + ) + dl = conversion.luminosity_distance_to_comoving_distance(dc, cosmology="WMAP9") self.assertAlmostEqual(max(abs(dl - self.distances)), 0, 4) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/test/cosmology_test.py b/test/cosmology_test.py index ca8ef65693497ea6f1c71affabea391e9084202d..2df9bd6b22fb0287833e9dfc5aaa01d866283a08 100644 --- a/test/cosmology_test.py +++ b/test/cosmology_test.py @@ -6,18 +6,17 @@ from bilby.gw import cosmology class TestSetCosmology(unittest.TestCase): - def setUp(self): pass def test_setting_cosmology_with_string(self): - cosmology.set_cosmology('WMAP9') - self.assertEqual(cosmology.COSMOLOGY[1], 'WMAP9') - cosmology.set_cosmology('Planck15') + cosmology.set_cosmology("WMAP9") + self.assertEqual(cosmology.COSMOLOGY[1], "WMAP9") + cosmology.set_cosmology("Planck15") def test_setting_cosmology_with_astropy_object(self): cosmology.set_cosmology(WMAP9) - self.assertEqual(cosmology.COSMOLOGY[1], 'WMAP9') + self.assertEqual(cosmology.COSMOLOGY[1], "WMAP9") cosmology.set_cosmology(Planck15) def test_setting_cosmology_with_default(self): @@ -27,30 +26,29 @@ class TestSetCosmology(unittest.TestCase): def test_setting_cosmology_with_flat_lambda_cdm_dict(self): cosmo_dict = dict(H0=67.7, Om0=0.3) cosmology.set_cosmology(cosmo_dict) - self.assertEqual(cosmology.COSMOLOGY[1][:13], 'FlatLambdaCDM') + self.assertEqual(cosmology.COSMOLOGY[1][:13], "FlatLambdaCDM") def test_setting_cosmology_with_lambda_cdm_dict(self): cosmo_dict = dict(H0=67.7, Om0=0.3, Ode0=0.7) cosmology.set_cosmology(cosmo_dict) - self.assertEqual(cosmology.COSMOLOGY[1][:9], 'LambdaCDM') + self.assertEqual(cosmology.COSMOLOGY[1][:9], "LambdaCDM") def test_setting_cosmology_with_w_cdm_dict(self): cosmo_dict = dict(H0=67.7, Om0=0.3, Ode0=0.7, w0=-1.0) cosmology.set_cosmology(cosmo_dict) - self.assertEqual(cosmology.COSMOLOGY[1][:4], 'wCDM') + self.assertEqual(cosmology.COSMOLOGY[1][:4], "wCDM") class TestGetCosmology(unittest.TestCase): - def setUp(self): pass def test_getting_cosmology_with_string(self): - self.assertEqual(cosmology.get_cosmology('WMAP9').name, 'WMAP9') + self.assertEqual(cosmology.get_cosmology("WMAP9").name, "WMAP9") def test_getting_cosmology_with_default(self): self.assertEqual(cosmology.get_cosmology(), cosmology.COSMOLOGY[0]) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/test/detector_test.py b/test/detector_test.py index 18d75ad12e01defbb17826c38ca8d387a2a5ca2e..7f8b0512a854faf8ae58a0a3731bd740b985c616 100644 --- a/test/detector_test.py +++ b/test/detector_test.py @@ -1,7 +1,6 @@ from __future__ import absolute_import import bilby -import inspect import unittest import mock from mock import MagicMock @@ -16,7 +15,6 @@ import deepdish as dd class TestInterferometerGeometry(unittest.TestCase): - def setUp(self): self.length = 30 self.latitude = 1 @@ -24,16 +22,18 @@ class TestInterferometerGeometry(unittest.TestCase): self.elevation = 3 self.xarm_azimuth = 4 self.yarm_azimuth = 5 - self.xarm_tilt = 0. - self.yarm_tilt = 0. - self.geometry = bilby.gw.detector.InterferometerGeometry(length=self.length, - latitude=self.latitude, - longitude=self.longitude, - elevation=self.elevation, - xarm_azimuth=self.xarm_azimuth, - yarm_azimuth=self.yarm_azimuth, - xarm_tilt=self.xarm_tilt, - yarm_tilt=self.yarm_tilt) + self.xarm_tilt = 0.0 + self.yarm_tilt = 0.0 + self.geometry = bilby.gw.detector.InterferometerGeometry( + length=self.length, + latitude=self.latitude, + longitude=self.longitude, + elevation=self.elevation, + xarm_azimuth=self.xarm_azimuth, + yarm_azimuth=self.yarm_azimuth, + xarm_tilt=self.xarm_tilt, + yarm_tilt=self.yarm_tilt, + ) def tearDown(self): del self.length @@ -72,24 +72,24 @@ class TestInterferometerGeometry(unittest.TestCase): def test_vertex_without_update(self): _ = self.geometry.vertex - with mock.patch('bilby.gw.utils.get_vertex_position_geocentric') as m: + with mock.patch("bilby.gw.utils.get_vertex_position_geocentric") as m: m.return_value = np.array([1]) self.assertFalse(np.array_equal(self.geometry.vertex, np.array([1]))) def test_vertex_with_latitude_update(self): - with mock.patch('bilby.gw.utils.get_vertex_position_geocentric') as m: + with mock.patch("bilby.gw.utils.get_vertex_position_geocentric") as m: m.return_value = np.array([1]) self.geometry.latitude = 5 self.assertEqual(self.geometry.vertex, np.array([1])) def test_vertex_with_longitude_update(self): - with mock.patch('bilby.gw.utils.get_vertex_position_geocentric') as m: + with mock.patch("bilby.gw.utils.get_vertex_position_geocentric") as m: m.return_value = np.array([1]) self.geometry.longitude = 5 self.assertEqual(self.geometry.vertex, np.array([1])) def test_vertex_with_elevation_update(self): - with mock.patch('bilby.gw.utils.get_vertex_position_geocentric') as m: + with mock.patch("bilby.gw.utils.get_vertex_position_geocentric") as m: m.return_value = np.array([1]) self.geometry.elevation = 5 self.assertEqual(self.geometry.vertex, np.array([1])) @@ -98,109 +98,103 @@ class TestInterferometerGeometry(unittest.TestCase): _ = self.geometry.x self.geometry.unit_vector_along_arm = MagicMock(return_value=np.array([1])) - self.assertFalse(np.array_equal(self.geometry.x, - np.array([1]))) + self.assertFalse(np.array_equal(self.geometry.x, np.array([1]))) def test_x_with_xarm_tilt_update(self): self.geometry.unit_vector_along_arm = MagicMock(return_value=np.array([1])) self.geometry.xarm_tilt = 0 - self.assertTrue(np.array_equal(self.geometry.x, - np.array([1]))) + self.assertTrue(np.array_equal(self.geometry.x, np.array([1]))) def test_x_with_xarm_azimuth_update(self): self.geometry.unit_vector_along_arm = MagicMock(return_value=np.array([1])) self.geometry.xarm_azimuth = 0 - self.assertTrue(np.array_equal(self.geometry.x, - np.array([1]))) + self.assertTrue(np.array_equal(self.geometry.x, np.array([1]))) def test_x_with_longitude_update(self): self.geometry.unit_vector_along_arm = MagicMock(return_value=np.array([1])) self.geometry.longitude = 0 - self.assertTrue(np.array_equal(self.geometry.x, - np.array([1]))) + self.assertTrue(np.array_equal(self.geometry.x, np.array([1]))) def test_x_with_latitude_update(self): self.geometry.unit_vector_along_arm = MagicMock(return_value=np.array([1])) self.geometry.latitude = 0 - self.assertTrue(np.array_equal(self.geometry.x, - np.array([1]))) + self.assertTrue(np.array_equal(self.geometry.x, np.array([1]))) def test_y_without_update(self): _ = self.geometry.y self.geometry.unit_vector_along_arm = MagicMock(return_value=np.array([1])) - self.assertFalse(np.array_equal(self.geometry.y, - np.array([1]))) + self.assertFalse(np.array_equal(self.geometry.y, np.array([1]))) def test_y_with_yarm_tilt_update(self): self.geometry.unit_vector_along_arm = MagicMock(return_value=np.array([1])) self.geometry.yarm_tilt = 0 - self.assertTrue(np.array_equal(self.geometry.y, - np.array([1]))) + self.assertTrue(np.array_equal(self.geometry.y, np.array([1]))) def test_y_with_yarm_azimuth_update(self): self.geometry.unit_vector_along_arm = MagicMock(return_value=np.array([1])) self.geometry.yarm_azimuth = 0 - self.assertTrue(np.array_equal(self.geometry.y, - np.array([1]))) + self.assertTrue(np.array_equal(self.geometry.y, np.array([1]))) def test_y_with_longitude_update(self): self.geometry.unit_vector_along_arm = MagicMock(return_value=np.array([1])) self.geometry.longitude = 0 - self.assertTrue(np.array_equal(self.geometry.y, - np.array([1]))) + self.assertTrue(np.array_equal(self.geometry.y, np.array([1]))) def test_y_with_latitude_update(self): self.geometry.unit_vector_along_arm = MagicMock(return_value=np.array([1])) self.geometry.latitude = 0 - self.assertTrue(np.array_equal(self.geometry.y, - np.array([1]))) + self.assertTrue(np.array_equal(self.geometry.y, np.array([1]))) def test_detector_tensor_without_update(self): _ = self.geometry.detector_tensor - with mock.patch('numpy.einsum') as m: + with mock.patch("numpy.einsum") as m: m.return_value = 1 - expected = np.array([[-9.24529394e-06, 1.02425803e-04, 3.24550668e-04], - [1.02425803e-04, 1.37390844e-03, -8.61137566e-03], - [3.24550668e-04, -8.61137566e-03, -1.36466315e-03]]) + expected = np.array( + [ + [-9.24529394e-06, 1.02425803e-04, 3.24550668e-04], + [1.02425803e-04, 1.37390844e-03, -8.61137566e-03], + [3.24550668e-04, -8.61137566e-03, -1.36466315e-03], + ] + ) self.assertTrue(np.allclose(expected, self.geometry.detector_tensor)) def test_detector_tensor_with_x_azimuth_update(self): _ = self.geometry.detector_tensor - with mock.patch('numpy.einsum') as m: + with mock.patch("numpy.einsum") as m: m.return_value = 1 self.geometry.xarm_azimuth = 1 self.assertEqual(0, self.geometry.detector_tensor) def test_detector_tensor_with_y_azimuth_update(self): _ = self.geometry.detector_tensor - with mock.patch('numpy.einsum') as m: + with mock.patch("numpy.einsum") as m: m.return_value = 1 self.geometry.yarm_azimuth = 1 self.assertEqual(0, self.geometry.detector_tensor) def test_detector_tensor_with_x_tilt_update(self): _ = self.geometry.detector_tensor - with mock.patch('numpy.einsum') as m: + with mock.patch("numpy.einsum") as m: m.return_value = 1 self.geometry.xarm_tilt = 1 self.assertEqual(0, self.geometry.detector_tensor) def test_detector_tensor_with_y_tilt_update(self): _ = self.geometry.detector_tensor - with mock.patch('numpy.einsum') as m: + with mock.patch("numpy.einsum") as m: m.return_value = 1 self.geometry.yarm_tilt = 1 self.assertEqual(0, self.geometry.detector_tensor) def test_detector_tensor_with_longitude_update(self): - with mock.patch('numpy.einsum') as m: + with mock.patch("numpy.einsum") as m: m.return_value = 1 self.geometry.longitude = 1 self.assertEqual(0, self.geometry.detector_tensor) def test_detector_tensor_with_latitude_update(self): - with mock.patch('numpy.einsum') as m: + with mock.patch("numpy.einsum") as m: _ = self.geometry.detector_tensor m.return_value = 1 self.geometry.latitude = 1 @@ -208,39 +202,49 @@ class TestInterferometerGeometry(unittest.TestCase): def test_unit_vector_along_arm_default(self): with self.assertRaises(ValueError): - self.geometry.unit_vector_along_arm('z') + self.geometry.unit_vector_along_arm("z") def test_unit_vector_along_arm_x(self): - with mock.patch('numpy.array') as m: + with mock.patch("numpy.array") as m: m.return_value = 1 self.geometry.xarm_tilt = 0 self.geometry.xarm_azimuth = 0 self.geometry.yarm_tilt = 0 self.geometry.yarm_azimuth = 90 - self.assertAlmostEqual(self.geometry.unit_vector_along_arm('x'), 1) + self.assertAlmostEqual(self.geometry.unit_vector_along_arm("x"), 1) def test_unit_vector_along_arm_y(self): - with mock.patch('numpy.array') as m: + with mock.patch("numpy.array") as m: m.return_value = 1 self.geometry.xarm_tilt = 0 self.geometry.xarm_azimuth = 90 self.geometry.yarm_tilt = 0 self.geometry.yarm_azimuth = 180 - self.assertAlmostEqual(self.geometry.unit_vector_along_arm('y'), -1) + self.assertAlmostEqual(self.geometry.unit_vector_along_arm("y"), -1) def test_repr(self): - expected = 'InterferometerGeometry(length={}, latitude={}, longitude={}, elevation={}, xarm_azimuth={}, ' \ - 'yarm_azimuth={}, xarm_tilt={}, yarm_tilt={})' \ - .format(float(self.length), float(self.latitude), float(self.longitude), float(self.elevation), - float(self.xarm_azimuth), float(self.yarm_azimuth), float(self.xarm_tilt), float(self.yarm_tilt)) + expected = ( + "InterferometerGeometry(length={}, latitude={}, longitude={}, elevation={}, xarm_azimuth={}, " + "yarm_azimuth={}, xarm_tilt={}, yarm_tilt={})".format( + float(self.length), + float(self.latitude), + float(self.longitude), + float(self.elevation), + float(self.xarm_azimuth), + float(self.yarm_azimuth), + float(self.xarm_tilt), + float(self.yarm_tilt), + ) + ) self.assertEqual(expected, repr(self.geometry)) class TestInterferometer(unittest.TestCase): - def setUp(self): - self.name = 'name' - self.power_spectral_density = bilby.gw.detector.PowerSpectralDensity.from_aligo() + self.name = "name" + self.power_spectral_density = ( + bilby.gw.detector.PowerSpectralDensity.from_aligo() + ) self.minimum_frequency = 10 self.maximum_frequency = 20 self.length = 30 @@ -249,29 +253,41 @@ class TestInterferometer(unittest.TestCase): self.elevation = 3 self.xarm_azimuth = 4 self.yarm_azimuth = 5 - self.xarm_tilt = 0. - self.yarm_tilt = 0. + self.xarm_tilt = 0.0 + self.yarm_tilt = 0.0 # noinspection PyTypeChecker - self.ifo = bilby.gw.detector.Interferometer(name=self.name, power_spectral_density=self.power_spectral_density, - minimum_frequency=self.minimum_frequency, - maximum_frequency=self.maximum_frequency, length=self.length, - latitude=self.latitude, longitude=self.longitude, - elevation=self.elevation, - xarm_azimuth=self.xarm_azimuth, yarm_azimuth=self.yarm_azimuth, - xarm_tilt=self.xarm_tilt, yarm_tilt=self.yarm_tilt) + self.ifo = bilby.gw.detector.Interferometer( + name=self.name, + power_spectral_density=self.power_spectral_density, + minimum_frequency=self.minimum_frequency, + maximum_frequency=self.maximum_frequency, + length=self.length, + latitude=self.latitude, + longitude=self.longitude, + elevation=self.elevation, + xarm_azimuth=self.xarm_azimuth, + yarm_azimuth=self.yarm_azimuth, + xarm_tilt=self.xarm_tilt, + yarm_tilt=self.yarm_tilt, + ) self.ifo.strain_data.set_from_frequency_domain_strain( - np.linspace(0, 4096, 4097), sampling_frequency=4096, duration=2) - self.outdir = 'outdir' + np.linspace(0, 4096, 4097), sampling_frequency=4096, duration=2 + ) + self.outdir = "outdir" self.injection_polarizations = dict() np.random.seed(42) - self.injection_polarizations['plus'] = np.random.random(4097) - self.injection_polarizations['cross'] = np.random.random(4097) + self.injection_polarizations["plus"] = np.random.random(4097) + self.injection_polarizations["cross"] = np.random.random(4097) self.waveform_generator = MagicMock() - self.wg_polarizations = dict(plus=np.random.random(4097), cross=np.random.random(4097)) - self.waveform_generator.frequency_domain_strain = lambda _: self.wg_polarizations - self.parameters = dict(ra=0., dec=0., geocent_time=0., psi=0.) + self.wg_polarizations = dict( + plus=np.random.random(4097), cross=np.random.random(4097) + ) + self.waveform_generator.frequency_domain_strain = ( + lambda _: self.wg_polarizations + ) + self.parameters = dict(ra=0.0, dec=0.0, geocent_time=0.0, psi=0.0) bilby.core.utils.check_directory_exists_and_if_not_mkdir(self.outdir) @@ -308,16 +324,19 @@ class TestInterferometer(unittest.TestCase): self.assertEqual(self.ifo.strain_data.maximum_frequency, self.maximum_frequency) def test_antenna_response_default(self): - with mock.patch('bilby.gw.utils.get_polarization_tensor') as m: - with mock.patch('numpy.einsum') as n: + with mock.patch("bilby.gw.utils.get_polarization_tensor") as m: + with mock.patch("numpy.einsum") as n: m.return_value = 0 n.return_value = 1 - self.assertEqual(self.ifo.antenna_response(234, 52, 54, 76, 'plus'), 1) + self.assertEqual(self.ifo.antenna_response(234, 52, 54, 76, "plus"), 1) def test_antenna_response_einsum(self): - with mock.patch('bilby.gw.utils.get_polarization_tensor') as m: + with mock.patch("bilby.gw.utils.get_polarization_tensor") as m: m.return_value = np.ones((3, 3)) - self.assertAlmostEqual(self.ifo.antenna_response(234, 52, 54, 76, 'plus'), self.ifo.detector_tensor.sum()) + self.assertAlmostEqual( + self.ifo.antenna_response(234, 52, 54, 76, "plus"), + self.ifo.detector_tensor.sum(), + ) def test_get_detector_response_default_behaviour(self): self.ifo.antenna_response = MagicMock(return_value=1) @@ -329,8 +348,11 @@ class TestInterferometer(unittest.TestCase): plus = np.linspace(0, 4096, 4097) response = self.ifo.get_detector_response( waveform_polarizations=dict(plus=plus), - parameters=dict(ra=0, dec=0, geocent_time=0, psi=0)) - self.assertTrue(np.array_equal(response, plus * self.ifo.frequency_mask * np.exp(-0j))) + parameters=dict(ra=0, dec=0, geocent_time=0, psi=0), + ) + self.assertTrue( + np.array_equal(response, plus * self.ifo.frequency_mask * np.exp(-0j)) + ) def test_get_detector_response_with_dt(self): self.ifo.antenna_response = MagicMock(return_value=1) @@ -341,8 +363,13 @@ class TestInterferometer(unittest.TestCase): plus = np.linspace(0, 4096, 4097) response = self.ifo.get_detector_response( waveform_polarizations=dict(plus=plus), - parameters=dict(ra=0, dec=0, geocent_time=0, psi=0)) - expected_response = plus * self.ifo.frequency_mask * np.exp(-1j * 2 * np.pi * self.ifo.frequency_array) + parameters=dict(ra=0, dec=0, geocent_time=0, psi=0), + ) + expected_response = ( + plus + * self.ifo.frequency_mask + * np.exp(-1j * 2 * np.pi * self.ifo.frequency_array) + ) self.assertTrue(np.allclose(abs(expected_response), abs(response))) def test_get_detector_response_multiple_modes(self): @@ -355,106 +382,172 @@ class TestInterferometer(unittest.TestCase): cross = np.linspace(0, 4096, 4097) response = self.ifo.get_detector_response( waveform_polarizations=dict(plus=plus, cross=cross), - parameters=dict(ra=0, dec=0, geocent_time=0, psi=0)) - self.assertTrue(np.array_equal(response, (plus + cross) * self.ifo.frequency_mask * np.exp(-0j))) + parameters=dict(ra=0, dec=0, geocent_time=0, psi=0), + ) + self.assertTrue( + np.array_equal( + response, (plus + cross) * self.ifo.frequency_mask * np.exp(-0j) + ) + ) def test_inject_signal_from_waveform_polarizations_correct_injection(self): original_strain = self.ifo.strain_data.frequency_domain_strain - self.ifo.get_detector_response = lambda x, params: x['plus'] + x['cross'] - self.ifo.inject_signal_from_waveform_polarizations(parameters=self.parameters, - injection_polarizations=self.injection_polarizations) - expected = self.injection_polarizations['plus'] + self.injection_polarizations['cross'] + original_strain - self.assertTrue(np.array_equal(expected, self.ifo.strain_data._frequency_domain_strain)) + self.ifo.get_detector_response = lambda x, params: x["plus"] + x["cross"] + self.ifo.inject_signal_from_waveform_polarizations( + parameters=self.parameters, + injection_polarizations=self.injection_polarizations, + ) + expected = ( + self.injection_polarizations["plus"] + + self.injection_polarizations["cross"] + + original_strain + ) + self.assertTrue( + np.array_equal(expected, self.ifo.strain_data._frequency_domain_strain) + ) def test_inject_signal_from_waveform_polarizations_update_time_domain_strain(self): original_td_strain = self.ifo.strain_data.time_domain_strain - self.ifo.get_detector_response = lambda x, params: x['plus'] + x['cross'] - self.ifo.inject_signal_from_waveform_polarizations(parameters=self.parameters, - injection_polarizations=self.injection_polarizations) - self.assertFalse(np.array_equal(original_td_strain, self.ifo.strain_data.time_domain_strain)) + self.ifo.get_detector_response = lambda x, params: x["plus"] + x["cross"] + self.ifo.inject_signal_from_waveform_polarizations( + parameters=self.parameters, + injection_polarizations=self.injection_polarizations, + ) + self.assertFalse( + np.array_equal(original_td_strain, self.ifo.strain_data.time_domain_strain) + ) def test_inject_signal_from_waveform_polarizations_meta_data(self): - self.ifo.get_detector_response = lambda x, params: x['plus'] + x['cross'] - self.ifo.inject_signal_from_waveform_polarizations(parameters=self.parameters, - injection_polarizations=self.injection_polarizations) - signal_ifo_expected = self.injection_polarizations['plus'] + self.injection_polarizations['cross'] - self.assertAlmostEqual(self.ifo.optimal_snr_squared(signal=signal_ifo_expected).real, - self.ifo.meta_data['optimal_SNR']**2, 10) - self.assertAlmostEqual(self.ifo.matched_filter_snr(signal=signal_ifo_expected), - self.ifo.meta_data['matched_filter_SNR'], 10) - self.assertDictEqual(self.parameters, - self.ifo.meta_data['parameters']) + self.ifo.get_detector_response = lambda x, params: x["plus"] + x["cross"] + self.ifo.inject_signal_from_waveform_polarizations( + parameters=self.parameters, + injection_polarizations=self.injection_polarizations, + ) + signal_ifo_expected = ( + self.injection_polarizations["plus"] + self.injection_polarizations["cross"] + ) + self.assertAlmostEqual( + self.ifo.optimal_snr_squared(signal=signal_ifo_expected).real, + self.ifo.meta_data["optimal_SNR"] ** 2, + 10, + ) + self.assertAlmostEqual( + self.ifo.matched_filter_snr(signal=signal_ifo_expected), + self.ifo.meta_data["matched_filter_SNR"], + 10, + ) + self.assertDictEqual(self.parameters, self.ifo.meta_data["parameters"]) def test_inject_signal_from_waveform_polarizations_incorrect_length(self): - self.injection_polarizations['plus'] = np.random.random(1000) - self.injection_polarizations['cross'] = np.random.random(1000) - self.ifo.get_detector_response = lambda x, params: x['plus'] + x['cross'] + self.injection_polarizations["plus"] = np.random.random(1000) + self.injection_polarizations["cross"] = np.random.random(1000) + self.ifo.get_detector_response = lambda x, params: x["plus"] + x["cross"] with self.assertRaises(ValueError): - self.ifo.inject_signal_from_waveform_polarizations(parameters=self.parameters, - injection_polarizations=self.injection_polarizations) + self.ifo.inject_signal_from_waveform_polarizations( + parameters=self.parameters, + injection_polarizations=self.injection_polarizations, + ) - @patch.object(bilby.core.utils.logger, 'warning') + @patch.object(bilby.core.utils.logger, "warning") def test_inject_signal_outside_segment_logs_warning(self, m): - self.parameters['geocent_time'] = 24345. - self.ifo.get_detector_response = lambda x, params: x['plus'] + x['cross'] - self.ifo.inject_signal_from_waveform_polarizations(parameters=self.parameters, - injection_polarizations=self.injection_polarizations) + self.parameters["geocent_time"] = 24345.0 + self.ifo.get_detector_response = lambda x, params: x["plus"] + x["cross"] + self.ifo.inject_signal_from_waveform_polarizations( + parameters=self.parameters, + injection_polarizations=self.injection_polarizations, + ) self.assertTrue(m.called) def test_inject_signal_from_waveform_generator_correct_return_value(self): - self.ifo.get_detector_response = lambda x, params: x['plus'] + x['cross'] - returned_polarizations = self.ifo.inject_signal_from_waveform_generator(parameters=self.parameters, - waveform_generator=self.waveform_generator) - self.assertTrue(np.array_equal(self.wg_polarizations['plus'], returned_polarizations['plus'])) - self.assertTrue(np.array_equal(self.wg_polarizations['cross'], returned_polarizations['cross'])) - - @patch.object(bilby.gw.detector.Interferometer, 'inject_signal_from_waveform_generator') + self.ifo.get_detector_response = lambda x, params: x["plus"] + x["cross"] + returned_polarizations = self.ifo.inject_signal_from_waveform_generator( + parameters=self.parameters, waveform_generator=self.waveform_generator + ) + self.assertTrue( + np.array_equal( + self.wg_polarizations["plus"], returned_polarizations["plus"] + ) + ) + self.assertTrue( + np.array_equal( + self.wg_polarizations["cross"], returned_polarizations["cross"] + ) + ) + + @patch.object( + bilby.gw.detector.Interferometer, "inject_signal_from_waveform_generator" + ) def test_inject_signal_with_waveform_generator_correct_call(self, m): - self.ifo.get_detector_response = lambda x, params: x['plus'] + x['cross'] - _ = self.ifo.inject_signal(parameters=self.parameters, - waveform_generator=self.waveform_generator) - m.assert_called_with(parameters=self.parameters, - waveform_generator=self.waveform_generator) + self.ifo.get_detector_response = lambda x, params: x["plus"] + x["cross"] + _ = self.ifo.inject_signal( + parameters=self.parameters, waveform_generator=self.waveform_generator + ) + m.assert_called_with( + parameters=self.parameters, waveform_generator=self.waveform_generator + ) def test_inject_signal_from_waveform_generator_correct_injection(self): original_strain = self.ifo.strain_data.frequency_domain_strain - self.ifo.get_detector_response = lambda x, params: x['plus'] + x['cross'] - injection_polarizations = self.ifo.inject_signal_from_waveform_generator(parameters=self.parameters, - waveform_generator=self.waveform_generator) - expected = injection_polarizations['plus'] + injection_polarizations['cross'] + original_strain - self.assertTrue(np.array_equal(expected, self.ifo.strain_data._frequency_domain_strain)) + self.ifo.get_detector_response = lambda x, params: x["plus"] + x["cross"] + injection_polarizations = self.ifo.inject_signal_from_waveform_generator( + parameters=self.parameters, waveform_generator=self.waveform_generator + ) + expected = ( + injection_polarizations["plus"] + + injection_polarizations["cross"] + + original_strain + ) + self.assertTrue( + np.array_equal(expected, self.ifo.strain_data._frequency_domain_strain) + ) def test_inject_signal_with_injection_polarizations(self): original_strain = self.ifo.strain_data.frequency_domain_strain - self.ifo.get_detector_response = lambda x, params: x['plus'] + x['cross'] - self.ifo.inject_signal(parameters=self.parameters, - injection_polarizations=self.injection_polarizations) - expected = self.injection_polarizations['plus'] + self.injection_polarizations['cross'] + original_strain - self.assertTrue(np.array_equal(expected, self.ifo.strain_data._frequency_domain_strain)) - - @patch.object(bilby.gw.detector.Interferometer, 'inject_signal_from_waveform_polarizations') + self.ifo.get_detector_response = lambda x, params: x["plus"] + x["cross"] + self.ifo.inject_signal( + parameters=self.parameters, + injection_polarizations=self.injection_polarizations, + ) + expected = ( + self.injection_polarizations["plus"] + + self.injection_polarizations["cross"] + + original_strain + ) + self.assertTrue( + np.array_equal(expected, self.ifo.strain_data._frequency_domain_strain) + ) + + @patch.object( + bilby.gw.detector.Interferometer, "inject_signal_from_waveform_polarizations" + ) def test_inject_signal_with_injection_polarizations_and_waveform_generator(self, m): - self.ifo.get_detector_response = lambda x, params: x['plus'] + x['cross'] - _ = self.ifo.inject_signal(parameters=self.parameters, - waveform_generator=self.waveform_generator, - injection_polarizations=self.injection_polarizations) - m.assert_called_with(parameters=self.parameters, - injection_polarizations=self.injection_polarizations) + self.ifo.get_detector_response = lambda x, params: x["plus"] + x["cross"] + _ = self.ifo.inject_signal( + parameters=self.parameters, + waveform_generator=self.waveform_generator, + injection_polarizations=self.injection_polarizations, + ) + m.assert_called_with( + parameters=self.parameters, + injection_polarizations=self.injection_polarizations, + ) with self.assertRaises(ValueError): - m.assert_called_with(parameters=self.parameters, - injection_polarizations=self.wg_polarizations) + m.assert_called_with( + parameters=self.parameters, + injection_polarizations=self.wg_polarizations, + ) def test_inject_signal_raises_value_error(self): with self.assertRaises(ValueError): self.ifo.inject_signal(injection_polarizations=None, parameters=None) def test_time_delay_from_geocenter(self): - with mock.patch('bilby.gw.utils.time_delay_geocentric') as m: + with mock.patch("bilby.gw.utils.time_delay_geocentric") as m: m.return_value = 1 self.assertEqual(self.ifo.time_delay_from_geocenter(1, 2, 3), 1) def test_vertex_position_geocentric(self): - with mock.patch('bilby.gw.utils.get_vertex_position_geocentric') as m: + with mock.patch("bilby.gw.utils.get_vertex_position_geocentric") as m: m.return_value = 1 self.assertEqual(self.ifo.vertex_position_geocentric(), 1) @@ -463,13 +556,16 @@ class TestInterferometer(unittest.TestCase): Merely checks parameters are given in the right order and the frequency mask is applied. """ - with mock.patch('bilby.gw.utils.noise_weighted_inner_product') as m: + with mock.patch("bilby.gw.utils.noise_weighted_inner_product") as m: m.side_effect = lambda a, b, c, d: [a, b, c, d] signal = np.ones_like(self.ifo.power_spectral_density_array) mask = self.ifo.frequency_mask - expected = [signal[mask], signal[mask], - self.ifo.power_spectral_density_array[mask], - self.ifo.strain_data.duration] + expected = [ + signal[mask], + signal[mask], + self.ifo.power_spectral_density_array[mask], + self.ifo.strain_data.duration, + ] actual = self.ifo.optimal_snr_squared(signal=signal) self.assertTrue(np.array_equal(expected[0], actual[0])) self.assertTrue(np.array_equal(expected[1], actual[1])) @@ -477,22 +573,35 @@ class TestInterferometer(unittest.TestCase): self.assertEqual(expected[3], actual[3]) def test_repr(self): - expected = 'Interferometer(name=\'{}\', power_spectral_density={}, minimum_frequency={}, ' \ - 'maximum_frequency={}, length={}, latitude={}, longitude={}, elevation={}, xarm_azimuth={}, ' \ - 'yarm_azimuth={}, xarm_tilt={}, yarm_tilt={})' \ - .format(self.name, self.power_spectral_density, float(self.minimum_frequency), - float(self.maximum_frequency), float(self.length), float(self.latitude), float(self.longitude), - float(self.elevation), float(self.xarm_azimuth), float(self.yarm_azimuth), float(self.xarm_tilt), - float(self.yarm_tilt)) + expected = ( + "Interferometer(name='{}', power_spectral_density={}, minimum_frequency={}, " + "maximum_frequency={}, length={}, latitude={}, longitude={}, elevation={}, xarm_azimuth={}, " + "yarm_azimuth={}, xarm_tilt={}, yarm_tilt={})".format( + self.name, + self.power_spectral_density, + float(self.minimum_frequency), + float(self.maximum_frequency), + float(self.length), + float(self.latitude), + float(self.longitude), + float(self.elevation), + float(self.xarm_azimuth), + float(self.yarm_azimuth), + float(self.xarm_tilt), + float(self.yarm_tilt), + ) + ) self.assertEqual(expected, repr(self.ifo)) def test_to_and_from_hdf5_loading(self): if sys.version_info[0] < 3: with self.assertRaises(NotImplementedError): - self.ifo.to_hdf5(outdir='outdir', label='test') + self.ifo.to_hdf5(outdir="outdir", label="test") else: - self.ifo.to_hdf5(outdir='outdir', label='test') - filename = self.ifo._hdf5_filename_from_outdir_label(outdir='outdir', label='test') + self.ifo.to_hdf5(outdir="outdir", label="test") + filename = self.ifo._hdf5_filename_from_outdir_label( + outdir="outdir", label="test" + ) recovered_ifo = bilby.gw.detector.Interferometer.from_hdf5(filename) self.assertEqual(self.ifo, recovered_ifo) @@ -500,19 +609,24 @@ class TestInterferometer(unittest.TestCase): if sys.version_info[0] < 3: pass else: - bilby.core.utils.check_directory_exists_and_if_not_mkdir('outdir') - dd.io.save('./outdir/psd.h5', self.power_spectral_density) - filename = self.ifo._hdf5_filename_from_outdir_label(outdir='outdir', label='psd') + bilby.core.utils.check_directory_exists_and_if_not_mkdir("outdir") + dd.io.save("./outdir/psd.h5", self.power_spectral_density) + filename = self.ifo._hdf5_filename_from_outdir_label( + outdir="outdir", label="psd" + ) with self.assertRaises(TypeError): bilby.gw.detector.Interferometer.from_hdf5(filename) class TestInterferometerEquals(unittest.TestCase): - def setUp(self): - self.name = 'name' - self.power_spectral_density_1 = bilby.gw.detector.PowerSpectralDensity.from_aligo() - self.power_spectral_density_2 = bilby.gw.detector.PowerSpectralDensity.from_aligo() + self.name = "name" + self.power_spectral_density_1 = ( + bilby.gw.detector.PowerSpectralDensity.from_aligo() + ) + self.power_spectral_density_2 = ( + bilby.gw.detector.PowerSpectralDensity.from_aligo() + ) self.minimum_frequency = 10 self.maximum_frequency = 20 self.length = 30 @@ -521,34 +635,49 @@ class TestInterferometerEquals(unittest.TestCase): self.elevation = 3 self.xarm_azimuth = 4 self.yarm_azimuth = 5 - self.xarm_tilt = 0. - self.yarm_tilt = 0. + self.xarm_tilt = 0.0 + self.yarm_tilt = 0.0 # noinspection PyTypeChecker self.duration = 1 self.sampling_frequency = 200 - self.frequency_array = bilby.utils.create_frequency_series(sampling_frequency=self.sampling_frequency, - duration=self.duration) + self.frequency_array = bilby.utils.create_frequency_series( + sampling_frequency=self.sampling_frequency, duration=self.duration + ) self.strain = self.frequency_array - self.ifo_1 = bilby.gw.detector.Interferometer(name=self.name, - power_spectral_density=self.power_spectral_density_1, - minimum_frequency=self.minimum_frequency, - maximum_frequency=self.maximum_frequency, length=self.length, - latitude=self.latitude, longitude=self.longitude, - elevation=self.elevation, - xarm_azimuth=self.xarm_azimuth, yarm_azimuth=self.yarm_azimuth, - xarm_tilt=self.xarm_tilt, yarm_tilt=self.yarm_tilt) - self.ifo_2 = bilby.gw.detector.Interferometer(name=self.name, - power_spectral_density=self.power_spectral_density_2, - minimum_frequency=self.minimum_frequency, - maximum_frequency=self.maximum_frequency, length=self.length, - latitude=self.latitude, longitude=self.longitude, - elevation=self.elevation, - xarm_azimuth=self.xarm_azimuth, yarm_azimuth=self.yarm_azimuth, - xarm_tilt=self.xarm_tilt, yarm_tilt=self.yarm_tilt) - self.ifo_1.set_strain_data_from_frequency_domain_strain(frequency_array=self.frequency_array, - frequency_domain_strain=self.strain) - self.ifo_2.set_strain_data_from_frequency_domain_strain(frequency_array=self.frequency_array, - frequency_domain_strain=self.strain) + self.ifo_1 = bilby.gw.detector.Interferometer( + name=self.name, + power_spectral_density=self.power_spectral_density_1, + minimum_frequency=self.minimum_frequency, + maximum_frequency=self.maximum_frequency, + length=self.length, + latitude=self.latitude, + longitude=self.longitude, + elevation=self.elevation, + xarm_azimuth=self.xarm_azimuth, + yarm_azimuth=self.yarm_azimuth, + xarm_tilt=self.xarm_tilt, + yarm_tilt=self.yarm_tilt, + ) + self.ifo_2 = bilby.gw.detector.Interferometer( + name=self.name, + power_spectral_density=self.power_spectral_density_2, + minimum_frequency=self.minimum_frequency, + maximum_frequency=self.maximum_frequency, + length=self.length, + latitude=self.latitude, + longitude=self.longitude, + elevation=self.elevation, + xarm_azimuth=self.xarm_azimuth, + yarm_azimuth=self.yarm_azimuth, + xarm_tilt=self.xarm_tilt, + yarm_tilt=self.yarm_tilt, + ) + self.ifo_1.set_strain_data_from_frequency_domain_strain( + frequency_array=self.frequency_array, frequency_domain_strain=self.strain + ) + self.ifo_2.set_strain_data_from_frequency_domain_strain( + frequency_array=self.frequency_array, frequency_domain_strain=self.strain + ) def tearDown(self): del self.name @@ -619,21 +748,23 @@ class TestInterferometerEquals(unittest.TestCase): self.assertNotEqual(self.ifo_1, self.ifo_2) def test_eq_false_different_ifo_strain_data(self): - self.strain = bilby.utils.create_frequency_series(sampling_frequency=self.sampling_frequency / 2, - duration=self.duration * 2) - self.ifo_1.set_strain_data_from_frequency_domain_strain(frequency_array=self.frequency_array, - frequency_domain_strain=self.strain) + self.strain = bilby.utils.create_frequency_series( + sampling_frequency=self.sampling_frequency / 2, duration=self.duration * 2 + ) + self.ifo_1.set_strain_data_from_frequency_domain_strain( + frequency_array=self.frequency_array, frequency_domain_strain=self.strain + ) self.assertNotEqual(self.ifo_1, self.ifo_2) class TestInterferometerStrainData(unittest.TestCase): - def setUp(self): self.minimum_frequency = 10 self.maximum_frequency = 20 self.ifosd = bilby.gw.detector.InterferometerStrainData( minimum_frequency=self.minimum_frequency, - maximum_frequency=self.maximum_frequency) + maximum_frequency=self.maximum_frequency, + ) def tearDown(self): del self.minimum_frequency @@ -643,64 +774,86 @@ class TestInterferometerStrainData(unittest.TestCase): def test_frequency_mask(self): self.minimum_frequency = 10 self.maximum_frequency = 20 - with mock.patch('bilby.core.utils.create_frequency_series') as m: + with mock.patch("bilby.core.utils.create_frequency_series") as m: m.return_value = np.array([5, 15, 25]) self.ifosd.set_from_frequency_domain_strain( - frequency_domain_strain=np.array([0, 1, 2]), frequency_array=np.array([5, 15, 25])) - self.assertTrue(np.array_equal(self.ifosd.frequency_mask, [False, True, False])) + frequency_domain_strain=np.array([0, 1, 2]), + frequency_array=np.array([5, 15, 25]), + ) + self.assertTrue( + np.array_equal(self.ifosd.frequency_mask, [False, True, False]) + ) def test_set_data_fails(self): - with mock.patch('bilby.core.utils.create_frequency_series') as m: + with mock.patch("bilby.core.utils.create_frequency_series") as m: m.return_value = [1, 2, 3] with self.assertRaises(ValueError): self.ifosd.set_from_frequency_domain_strain( - frequency_domain_strain=np.array([0, 1, 2])) + frequency_domain_strain=np.array([0, 1, 2]) + ) def test_set_data_fails_too_much(self): - with mock.patch('bilby.core.utils.create_frequency_series') as m: + with mock.patch("bilby.core.utils.create_frequency_series") as m: m.return_value = [1, 2, 3] with self.assertRaises(ValueError): self.ifosd.set_from_frequency_domain_strain( - frequency_domain_strain=np.array([0, 1, 2]), frequency_array=np.array([1, 2, 3]), - duration=3, sampling_frequency=1) + frequency_domain_strain=np.array([0, 1, 2]), + frequency_array=np.array([1, 2, 3]), + duration=3, + sampling_frequency=1, + ) def test_start_time_init(self): - with mock.patch('bilby.core.utils.create_frequency_series') as m: + with mock.patch("bilby.core.utils.create_frequency_series") as m: m.return_value = [1, 2, 3] duration = 3 sampling_frequency = 1 self.ifosd.set_from_frequency_domain_strain( - frequency_domain_strain=np.array([0, 1, 2]), duration=duration, - sampling_frequency=sampling_frequency) + frequency_domain_strain=np.array([0, 1, 2]), + duration=duration, + sampling_frequency=sampling_frequency, + ) self.assertTrue(self.ifosd.start_time == 0) def test_start_time_set(self): - with mock.patch('bilby.core.utils.create_frequency_series') as m: + with mock.patch("bilby.core.utils.create_frequency_series") as m: m.return_value = [1, 2, 3] duration = 3 sampling_frequency = 1 self.ifosd.set_from_frequency_domain_strain( - frequency_domain_strain=np.array([0, 1, 2]), duration=duration, - sampling_frequency=sampling_frequency, start_time=10) + frequency_domain_strain=np.array([0, 1, 2]), + duration=duration, + sampling_frequency=sampling_frequency, + start_time=10, + ) self.assertTrue(self.ifosd.start_time == 10) def test_time_array_frequency_array_consistency(self): duration = 1 sampling_frequency = 10 time_array = bilby.core.utils.create_time_series( - sampling_frequency=sampling_frequency, duration=duration) + sampling_frequency=sampling_frequency, duration=duration + ) time_domain_strain = np.random.normal( - 0, duration - 1 / sampling_frequency, len(time_array)) + 0, duration - 1 / sampling_frequency, len(time_array) + ) self.ifosd.roll_off = 0 self.ifosd.set_from_time_domain_strain( - time_domain_strain=time_domain_strain, duration=duration, - sampling_frequency=sampling_frequency) + time_domain_strain=time_domain_strain, + duration=duration, + sampling_frequency=sampling_frequency, + ) frequency_domain_strain, freqs = bilby.core.utils.nfft( - time_domain_strain, sampling_frequency) + time_domain_strain, sampling_frequency + ) - self.assertTrue(np.all( - self.ifosd.frequency_domain_strain == frequency_domain_strain * self.ifosd.frequency_mask)) + self.assertTrue( + np.all( + self.ifosd.frequency_domain_strain + == frequency_domain_strain * self.ifosd.frequency_mask + ) + ) def test_time_within_data_before(self): self.ifosd.start_time = 3 @@ -723,9 +876,10 @@ class TestInterferometerStrainData(unittest.TestCase): self.ifosd._time_domain_strain = np.array([3]) self.ifosd.duration = 5 self.ifosd.roll_off = 2 - expected_window = scipy.signal.windows.tukey(len(self.ifosd._time_domain_strain), alpha=self.ifosd.alpha) - self.assertEqual(expected_window, - self.ifosd.time_domain_window()) + expected_window = scipy.signal.windows.tukey( + len(self.ifosd._time_domain_strain), alpha=self.ifosd.alpha + ) + self.assertEqual(expected_window, self.ifosd.time_domain_window()) self.assertEqual(np.mean(expected_window ** 2), self.ifosd.window_factor) def test_time_domain_window_sets_roll_off_directly(self): @@ -750,7 +904,7 @@ class TestInterferometerStrainData(unittest.TestCase): self.ifosd._time_domain_strain = expected_strain self.assertEqual(expected_strain, self.ifosd.time_domain_strain) - @patch('bilby.core.utils.infft') + @patch("bilby.core.utils.infft") def test_time_domain_strain_from_frequency_domain_strain(self, m): m.return_value = 5 self.ifosd.sampling_frequency = 200 @@ -763,38 +917,47 @@ class TestInterferometerStrainData(unittest.TestCase): self.ifosd._time_domain_strain = None self.ifosd._frequency_domain_strain = None with self.assertRaises(ValueError): - test = self.ifosd.time_domain_strain + _ = self.ifosd.time_domain_strain def test_frequency_domain_strain_when_set(self): self.ifosd.sampling_frequency = 200 self.ifosd.duration = 4 expected_strain = self.ifosd.frequency_array * self.ifosd.frequency_mask self.ifosd._frequency_domain_strain = expected_strain - self.assertTrue(np.array_equal(expected_strain, - self.ifosd.frequency_domain_strain)) + self.assertTrue( + np.array_equal(expected_strain, self.ifosd.frequency_domain_strain) + ) - @patch('bilby.core.utils.nfft') + @patch("bilby.core.utils.nfft") def test_frequency_domain_strain_from_frequency_domain_strain(self, m): self.ifosd.start_time = 0 self.ifosd.duration = 4 self.ifosd.sampling_frequency = 200 m.return_value = self.ifosd.frequency_array, self.ifosd.frequency_array self.ifosd._time_domain_strain = self.ifosd.time_array - self.assertTrue(np.array_equal(self.ifosd.frequency_array * self.ifosd.frequency_mask, - self.ifosd.frequency_domain_strain)) + self.assertTrue( + np.array_equal( + self.ifosd.frequency_array * self.ifosd.frequency_mask, + self.ifosd.frequency_domain_strain, + ) + ) def test_frequency_domain_strain_not_set(self): self.ifosd._time_domain_strain = None self.ifosd._frequency_domain_strain = None with self.assertRaises(ValueError): - test = self.ifosd.frequency_domain_strain + _ = self.ifosd.frequency_domain_strain def test_set_frequency_domain_strain(self): self.ifosd.duration = 4 self.ifosd.sampling_frequency = 200 self.ifosd.frequency_domain_strain = np.ones(len(self.ifosd.frequency_array)) - self.assertTrue(np.array_equal(np.ones(len(self.ifosd.frequency_array)), - self.ifosd._frequency_domain_strain)) + self.assertTrue( + np.array_equal( + np.ones(len(self.ifosd.frequency_array)), + self.ifosd._frequency_domain_strain, + ) + ) def test_set_frequency_domain_strain_wrong_length(self): self.ifosd.duration = 4 @@ -804,26 +967,32 @@ class TestInterferometerStrainData(unittest.TestCase): class TestInterferometerStrainDataEquals(unittest.TestCase): - def setUp(self): self.minimum_frequency = 10 self.maximum_frequency = 20 self.roll_off = 0.2 self.sampling_frequency = 100 self.duration = 2 - self.frequency_array = bilby.utils.create_frequency_series(sampling_frequency=self.sampling_frequency, - duration=self.duration) + self.frequency_array = bilby.utils.create_frequency_series( + sampling_frequency=self.sampling_frequency, duration=self.duration + ) self.strain = self.frequency_array - self.ifosd_1 = bilby.gw.detector.InterferometerStrainData(minimum_frequency=self.minimum_frequency, - maximum_frequency=self.maximum_frequency, - roll_off=self.roll_off) - self.ifosd_2 = bilby.gw.detector.InterferometerStrainData(minimum_frequency=self.minimum_frequency, - maximum_frequency=self.maximum_frequency, - roll_off=self.roll_off) - self.ifosd_1.set_from_frequency_domain_strain(frequency_domain_strain=self.strain, - frequency_array=self.frequency_array) - self.ifosd_2.set_from_frequency_domain_strain(frequency_domain_strain=self.strain, - frequency_array=self.frequency_array) + self.ifosd_1 = bilby.gw.detector.InterferometerStrainData( + minimum_frequency=self.minimum_frequency, + maximum_frequency=self.maximum_frequency, + roll_off=self.roll_off, + ) + self.ifosd_2 = bilby.gw.detector.InterferometerStrainData( + minimum_frequency=self.minimum_frequency, + maximum_frequency=self.maximum_frequency, + roll_off=self.roll_off, + ) + self.ifosd_1.set_from_frequency_domain_strain( + frequency_domain_strain=self.strain, frequency_array=self.frequency_array + ) + self.ifosd_2.set_from_frequency_domain_strain( + frequency_domain_strain=self.strain, frequency_array=self.frequency_array + ) def tearDown(self): del self.minimum_frequency @@ -868,38 +1037,45 @@ class TestInterferometerStrainDataEquals(unittest.TestCase): self.assertNotEqual(self.ifosd_1, self.ifosd_2) def test_eq_different_frequency_array(self): - new_frequency_array = bilby.utils.create_frequency_series(sampling_frequency=self.sampling_frequency / 2, - duration=self.duration * 2) + new_frequency_array = bilby.utils.create_frequency_series( + sampling_frequency=self.sampling_frequency / 2, duration=self.duration * 2 + ) self.ifosd_1.frequency_array = new_frequency_array self.assertNotEqual(self.ifosd_1, self.ifosd_2) def test_eq_different_frequency_domain_strain(self): - new_strain = bilby.utils.create_frequency_series(sampling_frequency=self.sampling_frequency / 2, - duration=self.duration * 2) + new_strain = bilby.utils.create_frequency_series( + sampling_frequency=self.sampling_frequency / 2, duration=self.duration * 2 + ) self.ifosd_1._frequency_domain_strain = new_strain self.assertNotEqual(self.ifosd_1, self.ifosd_2) def test_eq_different_time_array(self): - new_time_array = bilby.utils.create_time_series(sampling_frequency=self.sampling_frequency / 2, - duration=self.duration * 2) + new_time_array = bilby.utils.create_time_series( + sampling_frequency=self.sampling_frequency / 2, duration=self.duration * 2 + ) self.ifosd_1.time_array = new_time_array self.assertNotEqual(self.ifosd_1, self.ifosd_2) def test_eq_different_time_domain_strain(self): - new_strain = bilby.utils.create_time_series(sampling_frequency=self.sampling_frequency / 2, - duration=self.duration * 2) + new_strain = bilby.utils.create_time_series( + sampling_frequency=self.sampling_frequency / 2, duration=self.duration * 2 + ) self.ifosd_1._time_domain_strain = new_strain self.assertNotEqual(self.ifosd_1, self.ifosd_2) class TestInterferometerList(unittest.TestCase): - def setUp(self): self.frequency_arrays = np.linspace(0, 4096, 4097) - self.name1 = 'name1' - self.name2 = 'name2' - self.power_spectral_density1 = bilby.gw.detector.PowerSpectralDensity.from_aligo() - self.power_spectral_density2 = bilby.gw.detector.PowerSpectralDensity.from_aligo() + self.name1 = "name1" + self.name2 = "name2" + self.power_spectral_density1 = ( + bilby.gw.detector.PowerSpectralDensity.from_aligo() + ) + self.power_spectral_density2 = ( + bilby.gw.detector.PowerSpectralDensity.from_aligo() + ) self.minimum_frequency1 = 10 self.minimum_frequency2 = 10 self.maximum_frequency1 = 20 @@ -916,33 +1092,47 @@ class TestInterferometerList(unittest.TestCase): self.xarm_azimuth2 = 4 self.yarm_azimuth1 = 5 self.yarm_azimuth2 = 5 - self.xarm_tilt1 = 0. - self.xarm_tilt2 = 0. - self.yarm_tilt1 = 0. - self.yarm_tilt2 = 0. + self.xarm_tilt1 = 0.0 + self.xarm_tilt2 = 0.0 + self.yarm_tilt1 = 0.0 + self.yarm_tilt2 = 0.0 # noinspection PyTypeChecker - self.ifo1 = bilby.gw.detector.Interferometer(name=self.name1, - power_spectral_density=self.power_spectral_density1, - minimum_frequency=self.minimum_frequency1, - maximum_frequency=self.maximum_frequency1, length=self.length1, - latitude=self.latitude1, longitude=self.longitude1, - elevation=self.elevation1, - xarm_azimuth=self.xarm_azimuth1, yarm_azimuth=self.yarm_azimuth1, - xarm_tilt=self.xarm_tilt1, yarm_tilt=self.yarm_tilt1) - self.ifo2 = bilby.gw.detector.Interferometer(name=self.name2, - power_spectral_density=self.power_spectral_density2, - minimum_frequency=self.minimum_frequency2, - maximum_frequency=self.maximum_frequency2, length=self.length2, - latitude=self.latitude2, longitude=self.longitude2, - elevation=self.elevation2, - xarm_azimuth=self.xarm_azimuth2, yarm_azimuth=self.yarm_azimuth2, - xarm_tilt=self.xarm_tilt2, yarm_tilt=self.yarm_tilt2) + self.ifo1 = bilby.gw.detector.Interferometer( + name=self.name1, + power_spectral_density=self.power_spectral_density1, + minimum_frequency=self.minimum_frequency1, + maximum_frequency=self.maximum_frequency1, + length=self.length1, + latitude=self.latitude1, + longitude=self.longitude1, + elevation=self.elevation1, + xarm_azimuth=self.xarm_azimuth1, + yarm_azimuth=self.yarm_azimuth1, + xarm_tilt=self.xarm_tilt1, + yarm_tilt=self.yarm_tilt1, + ) + self.ifo2 = bilby.gw.detector.Interferometer( + name=self.name2, + power_spectral_density=self.power_spectral_density2, + minimum_frequency=self.minimum_frequency2, + maximum_frequency=self.maximum_frequency2, + length=self.length2, + latitude=self.latitude2, + longitude=self.longitude2, + elevation=self.elevation2, + xarm_azimuth=self.xarm_azimuth2, + yarm_azimuth=self.yarm_azimuth2, + xarm_tilt=self.xarm_tilt2, + yarm_tilt=self.yarm_tilt2, + ) self.ifo1.strain_data.set_from_frequency_domain_strain( - self.frequency_arrays, sampling_frequency=4096, duration=2) + self.frequency_arrays, sampling_frequency=4096, duration=2 + ) self.ifo2.strain_data.set_from_frequency_domain_strain( - self.frequency_arrays, sampling_frequency=4096, duration=2) + self.frequency_arrays, sampling_frequency=4096, duration=2 + ) self.ifo_list = bilby.gw.detector.InterferometerList([self.ifo1, self.ifo2]) - self.outdir = 'outdir' + self.outdir = "outdir" bilby.core.utils.check_directory_exists_and_if_not_mkdir(self.outdir) def tearDown(self): @@ -982,10 +1172,10 @@ class TestInterferometerList(unittest.TestCase): def test_init_with_string_list(self): """ Merely checks if this ends up in the right bracket """ - with mock.patch('bilby.gw.detector.networks.get_empty_interferometer') as m: + with mock.patch("bilby.gw.detector.networks.get_empty_interferometer") as m: m.side_effect = TypeError with self.assertRaises(TypeError): - bilby.gw.detector.InterferometerList(['string']) + bilby.gw.detector.InterferometerList(["string"]) def test_init_with_other_object(self): with self.assertRaises(TypeError): @@ -998,31 +1188,45 @@ class TestInterferometerList(unittest.TestCase): def test_init_inconsistent_duration(self): self.frequency_arrays = np.linspace(0, 2048, 2049) - self.ifo2 = bilby.gw.detector.Interferometer(name=self.name2, - power_spectral_density=self.power_spectral_density2, - minimum_frequency=self.minimum_frequency2, - maximum_frequency=self.maximum_frequency2, length=self.length2, - latitude=self.latitude2, longitude=self.longitude2, - elevation=self.elevation2, - xarm_azimuth=self.xarm_azimuth2, yarm_azimuth=self.yarm_azimuth2, - xarm_tilt=self.xarm_tilt2, yarm_tilt=self.yarm_tilt2) + self.ifo2 = bilby.gw.detector.Interferometer( + name=self.name2, + power_spectral_density=self.power_spectral_density2, + minimum_frequency=self.minimum_frequency2, + maximum_frequency=self.maximum_frequency2, + length=self.length2, + latitude=self.latitude2, + longitude=self.longitude2, + elevation=self.elevation2, + xarm_azimuth=self.xarm_azimuth2, + yarm_azimuth=self.yarm_azimuth2, + xarm_tilt=self.xarm_tilt2, + yarm_tilt=self.yarm_tilt2, + ) self.ifo2.strain_data.set_from_frequency_domain_strain( - self.frequency_arrays, sampling_frequency=4096, duration=1) + self.frequency_arrays, sampling_frequency=4096, duration=1 + ) with self.assertRaises(ValueError): bilby.gw.detector.InterferometerList([self.ifo1, self.ifo2]) def test_init_inconsistent_sampling_frequency(self): self.frequency_arrays = np.linspace(0, 2048, 2049) - self.ifo2 = bilby.gw.detector.Interferometer(name=self.name2, - power_spectral_density=self.power_spectral_density2, - minimum_frequency=self.minimum_frequency2, - maximum_frequency=self.maximum_frequency2, length=self.length2, - latitude=self.latitude2, longitude=self.longitude2, - elevation=self.elevation2, - xarm_azimuth=self.xarm_azimuth2, yarm_azimuth=self.yarm_azimuth2, - xarm_tilt=self.xarm_tilt2, yarm_tilt=self.yarm_tilt2) + self.ifo2 = bilby.gw.detector.Interferometer( + name=self.name2, + power_spectral_density=self.power_spectral_density2, + minimum_frequency=self.minimum_frequency2, + maximum_frequency=self.maximum_frequency2, + length=self.length2, + latitude=self.latitude2, + longitude=self.longitude2, + elevation=self.elevation2, + xarm_azimuth=self.xarm_azimuth2, + yarm_azimuth=self.yarm_azimuth2, + xarm_tilt=self.xarm_tilt2, + yarm_tilt=self.yarm_tilt2, + ) self.ifo2.strain_data.set_from_frequency_domain_strain( - self.frequency_arrays, sampling_frequency=2048, duration=2) + self.frequency_arrays, sampling_frequency=2048, duration=2 + ) with self.assertRaises(ValueError): bilby.gw.detector.InterferometerList([self.ifo1, self.ifo2]) @@ -1031,7 +1235,7 @@ class TestInterferometerList(unittest.TestCase): with self.assertRaises(ValueError): bilby.gw.detector.InterferometerList([self.ifo1, self.ifo2]) - @patch.object(bilby.gw.detector.networks.logger, 'warning') + @patch.object(bilby.gw.detector.networks.logger, "warning") def test_check_interferometers_relative_tolerance(self, mock_warning): # Value larger than relative tolerance -- not tolerated self.ifo2.strain_data.start_time = self.ifo1.strain_data.start_time + 1e-4 @@ -1045,18 +1249,25 @@ class TestInterferometerList(unittest.TestCase): self.assertTrue(mock_warning.called) warning_log_str = mock_warning.call_args.args[0].args[0] self.assertIsInstance(warning_log_str, str) - self.assertTrue("The start_time of all interferometers are not the same:" in - warning_log_str) + self.assertTrue( + "The start_time of all interferometers are not the same:" in warning_log_str + ) - @patch.object(bilby.gw.detector.Interferometer, 'set_strain_data_from_power_spectral_density') + @patch.object( + bilby.gw.detector.Interferometer, "set_strain_data_from_power_spectral_density" + ) def test_set_strain_data_from_power_spectral_density(self, m): - self.ifo_list.set_strain_data_from_power_spectral_densities(sampling_frequency=123, duration=6.2, start_time=3) + self.ifo_list.set_strain_data_from_power_spectral_densities( + sampling_frequency=123, duration=6.2, start_time=3 + ) m.assert_called_with(sampling_frequency=123, duration=6.2, start_time=3) self.assertEqual(len(self.ifo_list), m.call_count) def test_inject_signal_pol_and_wg_none(self): with self.assertRaises(ValueError): - self.ifo_list.inject_signal(injection_polarizations=None, waveform_generator=None) + self.ifo_list.inject_signal( + injection_polarizations=None, waveform_generator=None + ) def test_meta_data(self): ifos_list = [self.ifo1, self.ifo2] @@ -1065,33 +1276,46 @@ class TestInterferometerList(unittest.TestCase): meta_data = {ifo.name: ifo.meta_data for ifo in ifos_list} self.assertEqual(ifos.meta_data, meta_data) - @patch.object(bilby.gw.waveform_generator.WaveformGenerator, 'frequency_domain_strain') + @patch.object( + bilby.gw.waveform_generator.WaveformGenerator, "frequency_domain_strain" + ) def test_inject_signal_pol_none_calls_frequency_domain_strain(self, m): waveform_generator = bilby.gw.waveform_generator.WaveformGenerator( - frequency_domain_source_model=lambda x, y, z: x) + frequency_domain_source_model=lambda x, y, z: x + ) self.ifo1.inject_signal = MagicMock(return_value=None) self.ifo2.inject_signal = MagicMock(return_value=None) - self.ifo_list.inject_signal(parameters=None, waveform_generator=waveform_generator) + self.ifo_list.inject_signal( + parameters=None, waveform_generator=waveform_generator + ) self.assertTrue(m.called) - @patch.object(bilby.gw.detector.Interferometer, 'inject_signal') + @patch.object(bilby.gw.detector.Interferometer, "inject_signal") def test_inject_signal_with_inj_pol(self, m): self.ifo_list.inject_signal(injection_polarizations=dict(plus=1)) m.assert_called_with(parameters=None, injection_polarizations=dict(plus=1)) self.assertEqual(len(self.ifo_list), m.call_count) - @patch.object(bilby.gw.detector.Interferometer, 'inject_signal') + @patch.object(bilby.gw.detector.Interferometer, "inject_signal") def test_inject_signal_returns_expected_polarisations(self, m): m.return_value = dict(plus=1, cross=2) injection_polarizations = dict(plus=1, cross=2) - ifos_pol = self.ifo_list.inject_signal(injection_polarizations=injection_polarizations) - self.assertDictEqual(self.ifo1.inject_signal(injection_polarizations=injection_polarizations), ifos_pol[0]) - self.assertDictEqual(self.ifo2.inject_signal(injection_polarizations=injection_polarizations), ifos_pol[1]) - - @patch.object(bilby.gw.detector.Interferometer, 'save_data') + ifos_pol = self.ifo_list.inject_signal( + injection_polarizations=injection_polarizations + ) + self.assertDictEqual( + self.ifo1.inject_signal(injection_polarizations=injection_polarizations), + ifos_pol[0], + ) + self.assertDictEqual( + self.ifo2.inject_signal(injection_polarizations=injection_polarizations), + ifos_pol[1], + ) + + @patch.object(bilby.gw.detector.Interferometer, "save_data") def test_save_data(self, m): - self.ifo_list.save_data(outdir='test_outdir', label='test_outdir') - m.assert_called_with(outdir='test_outdir', label='test_outdir') + self.ifo_list.save_data(outdir="test_outdir", label="test_outdir") + m.assert_called_with(outdir="test_outdir", label="test_outdir") self.assertEqual(len(self.ifo_list), m.call_count) def test_number_of_interferometers(self): @@ -1102,16 +1326,28 @@ class TestInterferometerList(unittest.TestCase): self.assertEqual(self.ifo2.strain_data.duration, self.ifo_list.duration) def test_sampling_frequency(self): - self.assertEqual(self.ifo1.strain_data.sampling_frequency, self.ifo_list.sampling_frequency) - self.assertEqual(self.ifo2.strain_data.sampling_frequency, self.ifo_list.sampling_frequency) + self.assertEqual( + self.ifo1.strain_data.sampling_frequency, self.ifo_list.sampling_frequency + ) + self.assertEqual( + self.ifo2.strain_data.sampling_frequency, self.ifo_list.sampling_frequency + ) def test_start_time(self): self.assertEqual(self.ifo1.strain_data.start_time, self.ifo_list.start_time) self.assertEqual(self.ifo2.strain_data.start_time, self.ifo_list.start_time) def test_frequency_array(self): - self.assertTrue(np.array_equal(self.ifo1.strain_data.frequency_array, self.ifo_list.frequency_array)) - self.assertTrue(np.array_equal(self.ifo2.strain_data.frequency_array, self.ifo_list.frequency_array)) + self.assertTrue( + np.array_equal( + self.ifo1.strain_data.frequency_array, self.ifo_list.frequency_array + ) + ) + self.assertTrue( + np.array_equal( + self.ifo2.strain_data.frequency_array, self.ifo_list.frequency_array + ) + ) def test_append_with_ifo(self): self.ifo_list.append(self.ifo2) @@ -1121,16 +1357,20 @@ class TestInterferometerList(unittest.TestCase): def test_append_with_ifo_list(self): self.ifo_list.append(self.ifo_list) names = [ifo.name for ifo in self.ifo_list] - self.assertListEqual([self.ifo1.name, self.ifo2.name, self.ifo1.name, self.ifo2.name], names) + self.assertListEqual( + [self.ifo1.name, self.ifo2.name, self.ifo1.name, self.ifo2.name], names + ) def test_extend(self): self.ifo_list.extend(self.ifo_list) names = [ifo.name for ifo in self.ifo_list] - self.assertListEqual([self.ifo1.name, self.ifo2.name, self.ifo1.name, self.ifo2.name], names) + self.assertListEqual( + [self.ifo1.name, self.ifo2.name, self.ifo1.name, self.ifo2.name], names + ) def test_insert(self): new_ifo = self.ifo1 - new_ifo.name = 'name3' + new_ifo.name = "name3" self.ifo_list.insert(1, new_ifo) names = [ifo.name for ifo in self.ifo_list] self.assertListEqual([self.ifo1.name, new_ifo.name, self.ifo2.name], names) @@ -1138,10 +1378,10 @@ class TestInterferometerList(unittest.TestCase): def test_to_and_from_hdf5_loading(self): if sys.version_info[0] < 3: with self.assertRaises(NotImplementedError): - self.ifo_list.to_hdf5(outdir='outdir', label='test') + self.ifo_list.to_hdf5(outdir="outdir", label="test") else: - self.ifo_list.to_hdf5(outdir='outdir', label='test') - filename = 'outdir/test_name1name2.h5' + self.ifo_list.to_hdf5(outdir="outdir", label="test") + filename = "outdir/test_name1name2.h5" recovered_ifo = bilby.gw.detector.InterferometerList.from_hdf5(filename) self.assertListEqual(self.ifo_list, recovered_ifo) @@ -1149,28 +1389,28 @@ class TestInterferometerList(unittest.TestCase): if sys.version_info[0] < 3: pass else: - dd.io.save('./outdir/psd.h5', self.ifo_list[0].power_spectral_density) + dd.io.save("./outdir/psd.h5", self.ifo_list[0].power_spectral_density) filename = self.ifo_list._hdf5_filename_from_outdir_label( - outdir='outdir', label='psd') + outdir="outdir", label="psd" + ) with self.assertRaises(TypeError): bilby.gw.detector.InterferometerList.from_hdf5(filename) def test_plot_data(self): - ifos = bilby.gw.detector.InterferometerList(['H1', 'L1']) + ifos = bilby.gw.detector.InterferometerList(["H1", "L1"]) ifos.set_strain_data_from_power_spectral_densities(2048, 4) ifos.plot_data(outdir=self.outdir) - ifos = bilby.gw.detector.InterferometerList(['H1', 'L1', 'V1']) + ifos = bilby.gw.detector.InterferometerList(["H1", "L1", "V1"]) ifos.set_strain_data_from_power_spectral_densities(2048, 4) ifos.plot_data(outdir=self.outdir) class TestPowerSpectralDensityWithoutFiles(unittest.TestCase): - def setUp(self): - self.frequency_array = np.array([1., 2., 3.]) - self.psd_array = np.array([16., 25., 36.]) - self.asd_array = np.array([4., 5., 6.]) + self.frequency_array = np.array([1.0, 2.0, 3.0]) + self.psd_array = np.array([16.0, 25.0, 36.0]) + self.asd_array = np.array([4.0, 5.0, 6.0]) def tearDown(self): del self.frequency_array @@ -1178,72 +1418,91 @@ class TestPowerSpectralDensityWithoutFiles(unittest.TestCase): del self.asd_array def test_init_with_asd_array(self): - psd = bilby.gw.detector.PowerSpectralDensity(frequency_array=self.frequency_array, asd_array=self.asd_array) + psd = bilby.gw.detector.PowerSpectralDensity( + frequency_array=self.frequency_array, asd_array=self.asd_array + ) self.assertTrue(np.array_equal(self.frequency_array, psd.frequency_array)) self.assertTrue(np.array_equal(self.asd_array, psd.asd_array)) self.assertTrue(np.array_equal(self.psd_array, psd.psd_array)) def test_init_with_psd_array(self): - psd = bilby.gw.detector.PowerSpectralDensity(frequency_array=self.frequency_array, psd_array=self.psd_array) + psd = bilby.gw.detector.PowerSpectralDensity( + frequency_array=self.frequency_array, psd_array=self.psd_array + ) self.assertTrue(np.array_equal(self.frequency_array, psd.frequency_array)) self.assertTrue(np.array_equal(self.asd_array, psd.asd_array)) self.assertTrue(np.array_equal(self.psd_array, psd.psd_array)) def test_setting_asd_array_after_init(self): - psd = bilby.gw.detector.PowerSpectralDensity(frequency_array=self.frequency_array) + psd = bilby.gw.detector.PowerSpectralDensity( + frequency_array=self.frequency_array + ) psd.asd_array = self.asd_array self.assertTrue(np.array_equal(self.frequency_array, psd.frequency_array)) self.assertTrue(np.array_equal(self.asd_array, psd.asd_array)) self.assertTrue(np.array_equal(self.psd_array, psd.psd_array)) def test_setting_psd_array_after_init(self): - psd = bilby.gw.detector.PowerSpectralDensity(frequency_array=self.frequency_array) + psd = bilby.gw.detector.PowerSpectralDensity( + frequency_array=self.frequency_array + ) psd.psd_array = self.psd_array self.assertTrue(np.array_equal(self.frequency_array, psd.frequency_array)) self.assertTrue(np.array_equal(self.asd_array, psd.asd_array)) self.assertTrue(np.array_equal(self.psd_array, psd.psd_array)) def test_power_spectral_density_interpolated_from_asd_array(self): - expected = np.array([25.]) - psd = bilby.gw.detector.PowerSpectralDensity(frequency_array=self.frequency_array, asd_array=self.asd_array) + expected = np.array([25.0]) + psd = bilby.gw.detector.PowerSpectralDensity( + frequency_array=self.frequency_array, asd_array=self.asd_array + ) self.assertEqual(expected, psd.power_spectral_density_interpolated(2)) def test_power_spectral_density_interpolated_from_psd_array(self): - expected = np.array([25.]) - psd = bilby.gw.detector.PowerSpectralDensity(frequency_array=self.frequency_array, psd_array=self.psd_array) + expected = np.array([25.0]) + psd = bilby.gw.detector.PowerSpectralDensity( + frequency_array=self.frequency_array, psd_array=self.psd_array + ) self.assertEqual(expected, psd.power_spectral_density_interpolated(2)) def test_from_amplitude_spectral_density_array(self): actual = bilby.gw.detector.PowerSpectralDensity.from_amplitude_spectral_density_array( - frequency_array=self.frequency_array, asd_array=self.asd_array) + frequency_array=self.frequency_array, asd_array=self.asd_array + ) self.assertTrue(np.array_equal(self.psd_array, actual.psd_array)) self.assertTrue(np.array_equal(self.asd_array, actual.asd_array)) def test_from_power_spectral_density_array(self): actual = bilby.gw.detector.PowerSpectralDensity.from_power_spectral_density_array( - frequency_array=self.frequency_array, psd_array=self.psd_array) + frequency_array=self.frequency_array, psd_array=self.psd_array + ) self.assertTrue(np.array_equal(self.psd_array, actual.psd_array)) self.assertTrue(np.array_equal(self.asd_array, actual.asd_array)) def test_repr(self): - psd = bilby.gw.detector.PowerSpectralDensity(frequency_array=self.frequency_array, psd_array=self.psd_array) - expected = 'PowerSpectralDensity(frequency_array={}, psd_array={}, asd_array={})'.format(self.frequency_array, - self.psd_array, - self.asd_array) + psd = bilby.gw.detector.PowerSpectralDensity( + frequency_array=self.frequency_array, psd_array=self.psd_array + ) + expected = "PowerSpectralDensity(frequency_array={}, psd_array={}, asd_array={})".format( + self.frequency_array, self.psd_array, self.asd_array + ) self.assertEqual(expected, repr(psd)) class TestPowerSpectralDensityWithFiles(unittest.TestCase): - def setUp(self): - self.dir = os.path.join(os.path.dirname(__file__), 'noise_curves') + self.dir = os.path.join(os.path.dirname(__file__), "noise_curves") os.mkdir(self.dir) - self.asd_file = os.path.join(os.path.dirname(__file__), 'noise_curves', 'asd_test_file.txt') - self.psd_file = os.path.join(os.path.dirname(__file__), 'noise_curves', 'psd_test_file.txt') - with open(self.asd_file, 'w') as f: - f.write('1.\t1.0e-21\n2.\t2.0e-21\n3.\t3.0e-21') - with open(self.psd_file, 'w') as f: - f.write('1.\t1.0e-42\n2.\t4.0e-42\n3.\t9.0e-42') + self.asd_file = os.path.join( + os.path.dirname(__file__), "noise_curves", "asd_test_file.txt" + ) + self.psd_file = os.path.join( + os.path.dirname(__file__), "noise_curves", "psd_test_file.txt" + ) + with open(self.asd_file, "w") as f: + f.write("1.\t1.0e-21\n2.\t2.0e-21\n3.\t3.0e-21") + with open(self.psd_file, "w") as f: + f.write("1.\t1.0e-42\n2.\t4.0e-42\n3.\t9.0e-42") self.frequency_array = np.array([1.0, 2.0, 3.0]) self.asd_array = np.array([1.0e-21, 2.0e-21, 3.0e-21]) self.psd_array = np.array([1.0e-42, 4.0e-42, 9.0e-42]) @@ -1259,26 +1518,34 @@ class TestPowerSpectralDensityWithFiles(unittest.TestCase): del self.psd_file def test_init_with_psd_file(self): - psd = bilby.gw.detector.PowerSpectralDensity(frequency_array=self.frequency_array, psd_file=self.psd_file) + psd = bilby.gw.detector.PowerSpectralDensity( + frequency_array=self.frequency_array, psd_file=self.psd_file + ) self.assertEqual(self.psd_file, psd.psd_file) self.assertTrue(np.array_equal(self.psd_array, psd.psd_array)) self.assertTrue(np.allclose(self.asd_array, psd.asd_array, atol=1e-30)) def test_init_with_asd_file(self): - psd = bilby.gw.detector.PowerSpectralDensity(frequency_array=self.frequency_array, asd_file=self.asd_file) + psd = bilby.gw.detector.PowerSpectralDensity( + frequency_array=self.frequency_array, asd_file=self.asd_file + ) self.assertEqual(self.asd_file, psd.asd_file) self.assertTrue(np.allclose(self.psd_array, psd.psd_array, atol=1e-60)) self.assertTrue(np.array_equal(self.asd_array, psd.asd_array)) def test_setting_psd_array_after_init(self): - psd = bilby.gw.detector.PowerSpectralDensity(frequency_array=self.frequency_array) + psd = bilby.gw.detector.PowerSpectralDensity( + frequency_array=self.frequency_array + ) psd.psd_file = self.psd_file self.assertEqual(self.psd_file, psd.psd_file) self.assertTrue(np.array_equal(self.psd_array, psd.psd_array)) self.assertTrue(np.allclose(self.asd_array, psd.asd_array, atol=1e-30)) def test_init_with_asd_array_after_init(self): - psd = bilby.gw.detector.PowerSpectralDensity(frequency_array=self.frequency_array) + psd = bilby.gw.detector.PowerSpectralDensity( + frequency_array=self.frequency_array + ) psd.asd_file = self.asd_file self.assertEqual(self.asd_file, psd.asd_file) self.assertTrue(np.allclose(self.psd_array, psd.psd_array, atol=1e-60)) @@ -1286,92 +1553,113 @@ class TestPowerSpectralDensityWithFiles(unittest.TestCase): def test_power_spectral_density_interpolated_from_asd_file(self): expected = np.array([4.0e-42]) - psd = bilby.gw.detector.PowerSpectralDensity(frequency_array=self.frequency_array, asd_file=self.asd_file) - self.assertTrue(np.allclose(expected, psd.power_spectral_density_interpolated(2), atol=1e-60)) + psd = bilby.gw.detector.PowerSpectralDensity( + frequency_array=self.frequency_array, asd_file=self.asd_file + ) + self.assertTrue( + np.allclose( + expected, psd.power_spectral_density_interpolated(2), atol=1e-60 + ) + ) def test_power_spectral_density_interpolated_from_psd_file(self): expected = np.array([4.0e-42]) - psd = bilby.gw.detector.PowerSpectralDensity(frequency_array=self.frequency_array, psd_file=self.psd_file) + psd = bilby.gw.detector.PowerSpectralDensity( + frequency_array=self.frequency_array, psd_file=self.psd_file + ) self.assertAlmostEqual(expected, psd.power_spectral_density_interpolated(2)) def test_from_amplitude_spectral_density_file(self): - psd = bilby.gw.detector.PowerSpectralDensity.from_amplitude_spectral_density_file(asd_file=self.asd_file) + psd = bilby.gw.detector.PowerSpectralDensity.from_amplitude_spectral_density_file( + asd_file=self.asd_file + ) self.assertEqual(self.asd_file, psd.asd_file) self.assertTrue(np.allclose(self.psd_array, psd.psd_array, atol=1e-60)) self.assertTrue(np.array_equal(self.asd_array, psd.asd_array)) def test_from_power_spectral_density_file(self): - psd = bilby.gw.detector.PowerSpectralDensity.from_power_spectral_density_file(psd_file=self.psd_file) + psd = bilby.gw.detector.PowerSpectralDensity.from_power_spectral_density_file( + psd_file=self.psd_file + ) self.assertEqual(self.psd_file, psd.psd_file) self.assertTrue(np.array_equal(self.psd_array, psd.psd_array)) self.assertTrue(np.allclose(self.asd_array, psd.asd_array, atol=1e-30)) def test_from_aligo(self): psd = bilby.gw.detector.PowerSpectralDensity.from_aligo() - expected_filename = 'aLIGO_ZERO_DET_high_P_psd.txt' + expected_filename = "aLIGO_ZERO_DET_high_P_psd.txt" expected = bilby.gw.detector.PowerSpectralDensity(psd_file=expected_filename) - actual_filename = psd.psd_file.split('/')[-1] + actual_filename = psd.psd_file.split("/")[-1] self.assertEqual(expected_filename, actual_filename) self.assertTrue(np.allclose(expected.psd_array, psd.psd_array, atol=1e-60)) self.assertTrue(np.array_equal(expected.asd_array, psd.asd_array)) def test_check_file_psd_file_set_to_asd_file(self): - logger = logging.getLogger('bilby') + logger = logging.getLogger("bilby") m = MagicMock() logger.warning = m - psd = bilby.gw.detector.PowerSpectralDensity(psd_file=self.asd_file) + _ = bilby.gw.detector.PowerSpectralDensity(psd_file=self.asd_file) self.assertEqual(4, m.call_count) def test_check_file_not_called_psd_file_set_to_psd_file(self): - logger = logging.getLogger('bilby') + logger = logging.getLogger("bilby") m = MagicMock() logger.warning = m - psd = bilby.gw.detector.PowerSpectralDensity(psd_file=self.psd_file) + _ = bilby.gw.detector.PowerSpectralDensity(psd_file=self.psd_file) self.assertEqual(0, m.call_count) def test_check_file_asd_file_set_to_psd_file(self): - logger = logging.getLogger('bilby') + logger = logging.getLogger("bilby") m = MagicMock() logger.warning = m - psd = bilby.gw.detector.PowerSpectralDensity(asd_file=self.psd_file) + _ = bilby.gw.detector.PowerSpectralDensity(asd_file=self.psd_file) self.assertEqual(4, m.call_count) def test_check_file_not_called_asd_file_set_to_asd_file(self): - logger = logging.getLogger('bilby') + logger = logging.getLogger("bilby") m = MagicMock() logger.warning = m - psd = bilby.gw.detector.PowerSpectralDensity(asd_file=self.asd_file) + _ = bilby.gw.detector.PowerSpectralDensity(asd_file=self.asd_file) self.assertEqual(0, m.call_count) def test_from_frame_file(self): - expected_frequency_array = np.array([1., 2., 3.]) - expected_psd_array = np.array([16., 25., 36.]) - with mock.patch('bilby.gw.detector.InterferometerStrainData.set_from_frame_file') as m: - with mock.patch('bilby.gw.detector.InterferometerStrainData.create_power_spectral_density') as n: + expected_frequency_array = np.array([1.0, 2.0, 3.0]) + expected_psd_array = np.array([16.0, 25.0, 36.0]) + with mock.patch( + "bilby.gw.detector.InterferometerStrainData.set_from_frame_file" + ) as _: + with mock.patch( + "bilby.gw.detector.InterferometerStrainData.create_power_spectral_density" + ) as n: n.return_value = expected_frequency_array, expected_psd_array - psd = bilby.gw.detector.PowerSpectralDensity.from_frame_file(frame_file=self.asd_file, - psd_start_time=0, - psd_duration=4) - self.assertTrue(np.array_equal(expected_frequency_array, psd.frequency_array)) + psd = bilby.gw.detector.PowerSpectralDensity.from_frame_file( + frame_file=self.asd_file, psd_start_time=0, psd_duration=4 + ) + self.assertTrue( + np.array_equal(expected_frequency_array, psd.frequency_array) + ) self.assertTrue(np.array_equal(expected_psd_array, psd.psd_array)) def test_repr(self): psd = bilby.gw.detector.PowerSpectralDensity(psd_file=self.psd_file) - expected = 'PowerSpectralDensity(psd_file=\'{}\', asd_file=\'{}\')'.format(self.psd_file, None) + expected = "PowerSpectralDensity(psd_file='{}', asd_file='{}')".format( + self.psd_file, None + ) self.assertEqual(expected, repr(psd)) class TestPowerSpectralDensityEquals(unittest.TestCase): - def setUp(self): self.psd_from_file_1 = bilby.gw.detector.PowerSpectralDensity.from_aligo() self.psd_from_file_2 = bilby.gw.detector.PowerSpectralDensity.from_aligo() self.frequency_array = np.linspace(1, 100) self.psd_array = np.linspace(1, 100) - self.psd_from_array_1 = bilby.gw.detector.PowerSpectralDensity. \ - from_power_spectral_density_array(frequency_array=self.frequency_array, psd_array=self.psd_array) - self.psd_from_array_2 = bilby.gw.detector.PowerSpectralDensity. \ - from_power_spectral_density_array(frequency_array=self.frequency_array, psd_array=self.psd_array) + self.psd_from_array_1 = bilby.gw.detector.PowerSpectralDensity.from_power_spectral_density_array( + frequency_array=self.frequency_array, psd_array=self.psd_array + ) + self.psd_from_array_2 = bilby.gw.detector.PowerSpectralDensity.from_power_spectral_density_array( + frequency_array=self.frequency_array, psd_array=self.psd_array + ) def tearDown(self): del self.psd_from_file_1 @@ -1388,14 +1676,14 @@ class TestPowerSpectralDensityEquals(unittest.TestCase): self.assertEqual(self.psd_from_file_1, self.psd_from_file_2) def test_eq_false_different_psd_file_name(self): - self.psd_from_file_1._psd_file = 'some_other_name' + self.psd_from_file_1._psd_file = "some_other_name" self.assertNotEqual(self.psd_from_file_1, self.psd_from_file_2) def test_eq_false_different_asd_file_name(self): self.psd_from_file_1._psd_file = None self.psd_from_file_2._psd_file = None - self.psd_from_file_1._asd_file = 'some_name' - self.psd_from_file_2._asd_file = 'some_other_name' + self.psd_from_file_1._asd_file = "some_name" + self.psd_from_file_2._asd_file = "some_other_name" self.assertNotEqual(self.psd_from_file_1, self.psd_from_file_2) def test_eq_false_different_frequency_array(self): @@ -1417,5 +1705,5 @@ class TestPowerSpectralDensityEquals(unittest.TestCase): self.assertNotEqual(self.psd_from_array_1, self.psd_from_array_2) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/test/example_test.py b/test/example_test.py index b478768ca90fa2e6f241d9dc60bdbaca84e5b292..0196f40b09449b48f877116fe5421b9b72f0bcb6 100644 --- a/test/example_test.py +++ b/test/example_test.py @@ -1,6 +1,7 @@ from __future__ import absolute_import import matplotlib -matplotlib.use('Agg') + +matplotlib.use("Agg") import unittest import os @@ -12,14 +13,14 @@ from past.builtins import execfile import bilby.core.utils # Imported to ensure the examples run -import numpy as np -import inspect +import numpy as np # noqa: F401 +import inspect # noqa: F401 bilby.core.utils.command_line_args.bilby_test_mode = True class Test(unittest.TestCase): - outdir = 'outdir' + outdir = "outdir" dir_path = os.path.dirname(os.path.realpath(__file__)) dir_path = os.path.abspath(os.path.join(dir_path, os.path.pardir)) @@ -29,8 +30,7 @@ class Test(unittest.TestCase): try: shutil.rmtree(self.outdir) except OSError: - logging.warning( - "{} not removed prior to tests".format(self.outdir)) + logging.warning("{} not removed prior to tests".format(self.outdir)) @classmethod def tearDownClass(self): @@ -38,20 +38,18 @@ class Test(unittest.TestCase): try: shutil.rmtree(self.outdir) except OSError: - logging.warning( - "{} not removed prior to tests".format(self.outdir)) + logging.warning("{} not removed prior to tests".format(self.outdir)) def test_examples(self): """ Loop over examples to check they run """ - examples = ['examples/core_examples/linear_regression.py', - 'examples/core_examples/linear_regression_unknown_noise.py', - ] + examples = [ + "examples/core_examples/linear_regression.py", + "examples/core_examples/linear_regression_unknown_noise.py", + ] for filename in examples: print("Testing {}".format(filename)) execfile(filename) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() - - diff --git a/test/grid_test.py b/test/grid_test.py index e67ecf00783b3ef1b5f1c0b3753044b8382973b3..0450fd6c5144e7db8228a2fc077d29c2cdd48525 100644 --- a/test/grid_test.py +++ b/test/grid_test.py @@ -2,10 +2,8 @@ from __future__ import absolute_import, division import unittest import numpy as np -import pandas as pd import shutil import os -import json from scipy.stats import multivariate_normal import bilby @@ -30,32 +28,41 @@ class MultiGaussian(bilby.Likelihood): class TestGrid(unittest.TestCase): - def setUp(self): np.random.seed(7) - + # set 2D multivariate Gaussian (zero mean, unit variance) - self.mus = [0., 0.] - self.cov = [[1., 0.], [0., 1.]] + self.mus = [0.0, 0.0] + self.cov = [[1.0, 0.0], [0.0, 1.0]] dim = len(self.mus) self.likelihood = MultiGaussian(self.mus, self.cov) - + # set priors out to +/- 5 sigma self.priors = bilby.core.prior.PriorDict() self.priors.update( - {"x{0}".format(i): bilby.core.prior.Uniform(-5, 5, "x{0}".format(i)) for i in range(dim)} + { + "x{0}".format(i): bilby.core.prior.Uniform(-5, 5, "x{0}".format(i)) + for i in range(dim) + } ) # expected evidence integral should be (1/V) where V is the prior volume - log_prior_vol = np.sum(np.log([prior.maximum - prior.minimum for key, prior in self.priors.items()])) + log_prior_vol = np.sum( + np.log( + [prior.maximum - prior.minimum for key, prior in self.priors.items()] + ) + ) self.expected_ln_evidence = -log_prior_vol self.grid_size = 100 grid = bilby.core.grid.Grid( - label='label', outdir='outdir', priors=self.priors, - grid_size=self.grid_size, likelihood=self.likelihood, - save=True + label="label", + outdir="outdir", + priors=self.priors, + grid_size=self.grid_size, + likelihood=self.likelihood, + save=True, ) self.grid = grid @@ -71,29 +78,33 @@ class TestGrid(unittest.TestCase): pass def test_grid_file_name_default(self): - outdir = 'outdir' - label = 'label' - self.assertEqual(bilby.core.grid.grid_file_name(outdir, label), - '{}/{}_grid.json'.format(outdir, label)) - self.assertEqual(bilby.core.grid.grid_file_name(outdir, label, True), - '{}/{}_grid.json.gz'.format(outdir, label)) + outdir = "outdir" + label = "label" + self.assertEqual( + bilby.core.grid.grid_file_name(outdir, label), + "{}/{}_grid.json".format(outdir, label), + ) + self.assertEqual( + bilby.core.grid.grid_file_name(outdir, label, True), + "{}/{}_grid.json.gz".format(outdir, label), + ) def test_fail_save_and_load(self): with self.assertRaises(ValueError): bilby.core.grid.Grid.read() with self.assertRaises(IOError): - bilby.core.grid.Grid.read(filename='not/a/file.json') + bilby.core.grid.Grid.read(filename="not/a/file.json") def test_fail_marginalize(self): with self.assertRaises(TypeError): self.grid.marginalize_posterior(parameters=2.4) - + with self.assertRaises(TypeError): self.grid.marginalize_posterior(not_parameters=4.7) - + with self.assertRaises(ValueError): - self.grid.marginalize_posterior(parameters='jkgsd') + self.grid.marginalize_posterior(parameters="jkgsd") def test_parameter_names(self): assert list(self.priors.keys()) == self.grid.parameter_names @@ -102,94 +113,150 @@ class TestGrid(unittest.TestCase): def test_no_marginalization(self): # test arrays are the same if no parameters are given to marginalize # over - assert np.array_equal(self.grid.ln_likelihood, - self.grid.marginalize_ln_likelihood(not_parameters=self.grid.parameter_names)) - + assert np.array_equal( + self.grid.ln_likelihood, + self.grid.marginalize_ln_likelihood( + not_parameters=self.grid.parameter_names + ), + ) + def test_marginalization_shapes(self): assert len(self.grid.marginalize_ln_likelihood().shape) == 0 - - marg1 = self.grid.marginalize_ln_likelihood(parameters=self.grid.parameter_names[0]) + + marg1 = self.grid.marginalize_ln_likelihood( + parameters=self.grid.parameter_names[0] + ) assert marg1.shape == (self.grid_size,) - marg2 = self.grid.marginalize_ln_likelihood(parameters=self.grid.parameter_names[1]) + marg2 = self.grid.marginalize_ln_likelihood( + parameters=self.grid.parameter_names[1] + ) assert marg2.shape == (self.grid_size,) assert self.grid.ln_likelihood.shape == (self.grid_size, self.grid_size) assert self.grid.ln_posterior.shape == (self.grid_size, self.grid_size) def test_marginalization_opposite(self): - assert np.array_equal(self.grid.marginalize_ln_likelihood(parameters=self.grid.parameter_names[0]), - self.grid.marginalize_ln_likelihood(not_parameters=self.grid.parameter_names[1])) - assert np.array_equal(self.grid.marginalize_ln_likelihood(parameters=self.grid.parameter_names[1]), - self.grid.marginalize_ln_likelihood(not_parameters=self.grid.parameter_names[0])) - + assert np.array_equal( + self.grid.marginalize_ln_likelihood( + parameters=self.grid.parameter_names[0] + ), + self.grid.marginalize_ln_likelihood( + not_parameters=self.grid.parameter_names[1] + ), + ) + assert np.array_equal( + self.grid.marginalize_ln_likelihood( + parameters=self.grid.parameter_names[1] + ), + self.grid.marginalize_ln_likelihood( + not_parameters=self.grid.parameter_names[0] + ), + ) + def test_max_marginalized_likelihood(self): # marginalised likelihoods should have max values of 1 (as they are not # properly normalised) - assert self.grid.marginalize_likelihood(self.grid.parameter_names[0]).max() == 1. - assert self.grid.marginalize_likelihood(self.grid.parameter_names[1]).max() == 1. + assert ( + self.grid.marginalize_likelihood(self.grid.parameter_names[0]).max() == 1.0 + ) + assert ( + self.grid.marginalize_likelihood(self.grid.parameter_names[1]).max() == 1.0 + ) def test_ln_evidence(self): assert np.isclose(self.grid.ln_evidence, self.expected_ln_evidence) def test_fail_grid_size(self): with self.assertRaises(TypeError): - grid = bilby.core.grid.Grid( - label='label', outdir='outdir', priors=self.priors, - grid_size=2.3, likelihood=self.likelihood, - save=True + bilby.core.grid.Grid( + label="label", + outdir="outdir", + priors=self.priors, + grid_size=2.3, + likelihood=self.likelihood, + save=True, ) def test_mesh_grid(self): assert self.grid.mesh_grid[0].shape == (self.grid_size, self.grid_size) - assert self.grid.mesh_grid[0][0,0] == self.priors[self.grid.parameter_names[0]].minimum - assert self.grid.mesh_grid[0][-1,-1] == self.priors[self.grid.parameter_names[1]].maximum + assert ( + self.grid.mesh_grid[0][0, 0] + == self.priors[self.grid.parameter_names[0]].minimum + ) + assert ( + self.grid.mesh_grid[0][-1, -1] + == self.priors[self.grid.parameter_names[1]].maximum + ) def test_different_grids(self): npoints = [10, 20] grid = bilby.core.grid.Grid( - label='label', outdir='outdir', priors=self.priors, - grid_size=npoints, likelihood=self.likelihood + label="label", + outdir="outdir", + priors=self.priors, + grid_size=npoints, + likelihood=self.likelihood, ) assert grid.mesh_grid[0].shape == tuple(npoints) - assert grid.mesh_grid[0][0,0] == self.priors[self.grid.parameter_names[0]].minimum - assert grid.mesh_grid[0][-1,-1] == self.priors[self.grid.parameter_names[1]].maximum + assert ( + grid.mesh_grid[0][0, 0] == self.priors[self.grid.parameter_names[0]].minimum + ) + assert ( + grid.mesh_grid[0][-1, -1] + == self.priors[self.grid.parameter_names[1]].maximum + ) del grid - npoints = {'x0': 15, 'x1': 18} + npoints = {"x0": 15, "x1": 18} grid = bilby.core.grid.Grid( - label='label', outdir='outdir', priors=self.priors, - grid_size=npoints, likelihood=self.likelihood + label="label", + outdir="outdir", + priors=self.priors, + grid_size=npoints, + likelihood=self.likelihood, ) - assert grid.mesh_grid[0].shape == (npoints['x0'], npoints['x1']) - assert grid.mesh_grid[0][0,0] == self.priors[self.grid.parameter_names[0]].minimum - assert grid.mesh_grid[0][-1,-1] == self.priors[self.grid.parameter_names[1]].maximum + assert grid.mesh_grid[0].shape == (npoints["x0"], npoints["x1"]) + assert ( + grid.mesh_grid[0][0, 0] == self.priors[self.grid.parameter_names[0]].minimum + ) + assert ( + grid.mesh_grid[0][-1, -1] + == self.priors[self.grid.parameter_names[1]].maximum + ) del grid - x0s = np.linspace(self.priors['x0'].minimum, self.priors['x0'].maximum, 13) - x1s = np.linspace(self.priors['x0'].minimum, self.priors['x0'].maximum, 14) - npoints = {'x0': x0s, - 'x1': x1s} + x0s = np.linspace(self.priors["x0"].minimum, self.priors["x0"].maximum, 13) + x1s = np.linspace(self.priors["x0"].minimum, self.priors["x0"].maximum, 14) + npoints = {"x0": x0s, "x1": x1s} grid = bilby.core.grid.Grid( - label='label', outdir='outdir', priors=self.priors, - grid_size=npoints, likelihood=self.likelihood + label="label", + outdir="outdir", + priors=self.priors, + grid_size=npoints, + likelihood=self.likelihood, ) assert grid.mesh_grid[0].shape == (len(x0s), len(x1s)) - assert grid.mesh_grid[0][0,0] == self.priors[self.grid.parameter_names[0]].minimum - assert grid.mesh_grid[0][-1,-1] == self.priors[self.grid.parameter_names[1]].maximum - assert np.array_equal(grid.sample_points['x0'], x0s) - assert np.array_equal(grid.sample_points['x1'], x1s) + assert ( + grid.mesh_grid[0][0, 0] == self.priors[self.grid.parameter_names[0]].minimum + ) + assert ( + grid.mesh_grid[0][-1, -1] + == self.priors[self.grid.parameter_names[1]].maximum + ) + assert np.array_equal(grid.sample_points["x0"], x0s) + assert np.array_equal(grid.sample_points["x1"], x1s) def test_save_and_load(self): - filename = os.path.join('outdir', 'test_output.json') + filename = os.path.join("outdir", "test_output.json") self.grid.save_to_file(filename=filename) @@ -200,24 +267,27 @@ class TestGrid(unittest.TestCase): assert newgrid.n_dims == self.grid.n_dims assert np.array_equal(newgrid.mesh_grid[0], self.grid.mesh_grid[0]) for par in newgrid.parameter_names: - assert np.array_equal(newgrid.sample_points[par], self.grid.sample_points[par]) + assert np.array_equal( + newgrid.sample_points[par], self.grid.sample_points[par] + ) assert newgrid.ln_evidence == self.grid.ln_evidence assert np.array_equal(newgrid.ln_likelihood, self.grid.ln_likelihood) assert np.array_equal(newgrid.ln_posterior, self.grid.ln_posterior) del newgrid - self.grid.save_to_file(overwrite=True, outdir='outdir') + self.grid.save_to_file(overwrite=True, outdir="outdir") # load file - newgrid = bilby.core.grid.Grid.read(outdir='outdir', - label='label') + newgrid = bilby.core.grid.Grid.read(outdir="outdir", label="label") assert newgrid.parameter_names == self.grid.parameter_names assert newgrid.n_dims == self.grid.n_dims assert np.array_equal(newgrid.mesh_grid[0], self.grid.mesh_grid[0]) for par in newgrid.parameter_names: - assert np.array_equal(newgrid.sample_points[par], self.grid.sample_points[par]) + assert np.array_equal( + newgrid.sample_points[par], self.grid.sample_points[par] + ) assert newgrid.ln_evidence == self.grid.ln_evidence assert np.array_equal(newgrid.ln_likelihood, self.grid.ln_likelihood) assert np.array_equal(newgrid.ln_posterior, self.grid.ln_posterior) @@ -225,7 +295,7 @@ class TestGrid(unittest.TestCase): del newgrid def test_save_and_load_gzip(self): - filename = os.path.join('outdir', 'test_output.json.gz') + filename = os.path.join("outdir", "test_output.json.gz") self.grid.save_to_file(filename=filename) @@ -236,25 +306,27 @@ class TestGrid(unittest.TestCase): assert newgrid.n_dims == self.grid.n_dims assert np.array_equal(newgrid.mesh_grid[0], self.grid.mesh_grid[0]) for par in newgrid.parameter_names: - assert np.array_equal(newgrid.sample_points[par], self.grid.sample_points[par]) + assert np.array_equal( + newgrid.sample_points[par], self.grid.sample_points[par] + ) assert newgrid.ln_evidence == self.grid.ln_evidence assert np.array_equal(newgrid.ln_likelihood, self.grid.ln_likelihood) assert np.array_equal(newgrid.ln_posterior, self.grid.ln_posterior) del newgrid - self.grid.save_to_file(overwrite=True, outdir='outdir', - gzip=True) + self.grid.save_to_file(overwrite=True, outdir="outdir", gzip=True) # load file - newgrid = bilby.core.grid.Grid.read(outdir='outdir', label='label', - gzip=True) + newgrid = bilby.core.grid.Grid.read(outdir="outdir", label="label", gzip=True) assert newgrid.parameter_names == self.grid.parameter_names assert newgrid.n_dims == self.grid.n_dims assert np.array_equal(newgrid.mesh_grid[0], self.grid.mesh_grid[0]) for par in newgrid.parameter_names: - assert np.array_equal(newgrid.sample_points[par], self.grid.sample_points[par]) + assert np.array_equal( + newgrid.sample_points[par], self.grid.sample_points[par] + ) assert newgrid.ln_evidence == self.grid.ln_evidence assert np.array_equal(newgrid.ln_likelihood, self.grid.ln_likelihood) assert np.array_equal(newgrid.ln_posterior, self.grid.ln_posterior) diff --git a/test/gw_example_test.py b/test/gw_example_test.py index 46e8d5f4e627810bf5fd8f2018d199e78d4bb83a..4c5c1c1aa198684e49c0bae52d63a9e4df77ef68 100644 --- a/test/gw_example_test.py +++ b/test/gw_example_test.py @@ -1,6 +1,7 @@ from __future__ import absolute_import import matplotlib -matplotlib.use('Agg') + +matplotlib.use("Agg") import unittest import os @@ -12,14 +13,14 @@ from past.builtins import execfile import bilby.core.utils # Imported to ensure the examples run -import numpy as np -import inspect +import numpy as np # noqa: F401 +import inspect # noqa: F401 bilby.core.utils.command_line_args.bilby_test_mode = True class Test(unittest.TestCase): - outdir = 'outdir' + outdir = "outdir" dir_path = os.path.dirname(os.path.realpath(__file__)) dir_path = os.path.abspath(os.path.join(dir_path, os.path.pardir)) @@ -29,8 +30,7 @@ class Test(unittest.TestCase): try: shutil.rmtree(self.outdir) except OSError: - logging.warning( - "{} not removed prior to tests".format(self.outdir)) + logging.warning("{} not removed prior to tests".format(self.outdir)) @classmethod def tearDownClass(self): @@ -38,18 +38,18 @@ class Test(unittest.TestCase): try: shutil.rmtree(self.outdir) except OSError: - logging.warning( - "{} not removed prior to tests".format(self.outdir)) + logging.warning("{} not removed prior to tests".format(self.outdir)) def test_examples(self): """ Loop over examples to check they run """ - examples = ['examples/gw_examples/injection_examples/fast_tutorial.py', - 'examples/gw_examples/data_examples/GW150914.py', - ] + examples = [ + "examples/gw_examples/injection_examples/fast_tutorial.py", + "examples/gw_examples/data_examples/GW150914.py", + ] for filename in examples: print("Testing {}".format(filename)) execfile(filename) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/test/gw_likelihood_test.py b/test/gw_likelihood_test.py index d5bf45bcf64e59ce1cc146921044c2f4490c585e..9c50c0f73569d3b3c807346a98a9d758997b54a7 100644 --- a/test/gw_likelihood_test.py +++ b/test/gw_likelihood_test.py @@ -8,25 +8,38 @@ from bilby.gw.likelihood import BilbyROQParamsRangeError class TestBasicGWTransient(unittest.TestCase): - def setUp(self): np.random.seed(500) self.parameters = dict( - mass_1=31., mass_2=29., a_1=0.4, a_2=0.3, tilt_1=0.0, tilt_2=0.0, - phi_12=1.7, phi_jl=0.3, luminosity_distance=4000., theta_jn=0.4, - psi=2.659, phase=1.3, geocent_time=1126259642.413, ra=1.375, - dec=-1.2108) - self.interferometers = bilby.gw.detector.InterferometerList(['H1']) + mass_1=31.0, + mass_2=29.0, + a_1=0.4, + a_2=0.3, + tilt_1=0.0, + tilt_2=0.0, + phi_12=1.7, + phi_jl=0.3, + luminosity_distance=4000.0, + theta_jn=0.4, + psi=2.659, + phase=1.3, + geocent_time=1126259642.413, + ra=1.375, + dec=-1.2108, + ) + self.interferometers = bilby.gw.detector.InterferometerList(["H1"]) self.interferometers.set_strain_data_from_power_spectral_densities( - sampling_frequency=2048, duration=4) + sampling_frequency=2048, duration=4 + ) self.waveform_generator = bilby.gw.waveform_generator.WaveformGenerator( - duration=4, sampling_frequency=2048, + duration=4, + sampling_frequency=2048, frequency_domain_source_model=bilby.gw.source.lal_binary_black_hole, - ) + ) self.likelihood = bilby.gw.likelihood.BasicGravitationalWaveTransient( interferometers=self.interferometers, - waveform_generator=self.waveform_generator + waveform_generator=self.waveform_generator, ) self.likelihood.parameters = self.parameters.copy() @@ -39,62 +52,78 @@ class TestBasicGWTransient(unittest.TestCase): def test_noise_log_likelihood(self): """Test noise log likelihood matches precomputed value""" self.likelihood.noise_log_likelihood() - self.assertAlmostEqual(-4037.0994372143414, self.likelihood.noise_log_likelihood(), 3) + self.assertAlmostEqual( + -4037.0994372143414, self.likelihood.noise_log_likelihood(), 3 + ) def test_log_likelihood(self): """Test log likelihood matches precomputed value""" self.likelihood.log_likelihood() - self.assertAlmostEqual(self.likelihood.log_likelihood(), - -4054.047229508672, 3) + self.assertAlmostEqual(self.likelihood.log_likelihood(), -4054.047229508672, 3) def test_log_likelihood_ratio(self): """Test log likelihood ratio returns the correct value""" self.assertAlmostEqual( - self.likelihood.log_likelihood() - - self.likelihood.noise_log_likelihood(), - self.likelihood.log_likelihood_ratio(), 3) + self.likelihood.log_likelihood() - self.likelihood.noise_log_likelihood(), + self.likelihood.log_likelihood_ratio(), + 3, + ) def test_likelihood_zero_when_waveform_is_none(self): """Test log likelihood returns np.nan_to_num(-np.inf) when the waveform is None""" - self.likelihood.waveform_generator.frequency_domain_strain = \ - lambda x: None - self.assertEqual(self.likelihood.log_likelihood_ratio(), - np.nan_to_num(-np.inf)) + self.likelihood.waveform_generator.frequency_domain_strain = lambda x: None + self.assertEqual(self.likelihood.log_likelihood_ratio(), np.nan_to_num(-np.inf)) def test_repr(self): - expected = 'BasicGravitationalWaveTransient(interferometers={},\n\twaveform_generator={})'.format( - self.interferometers, self.waveform_generator) + expected = "BasicGravitationalWaveTransient(interferometers={},\n\twaveform_generator={})".format( + self.interferometers, self.waveform_generator + ) self.assertEqual(expected, repr(self.likelihood)) class TestGWTransient(unittest.TestCase): - def setUp(self): np.random.seed(500) self.duration = 4 self.sampling_frequency = 2048 self.parameters = dict( - mass_1=31., mass_2=29., a_1=0.4, a_2=0.3, tilt_1=0.0, tilt_2=0.0, - phi_12=1.7, phi_jl=0.3, luminosity_distance=4000., theta_jn=0.4, - psi=2.659, phase=1.3, geocent_time=1126259642.413, ra=1.375, - dec=-1.2108) - self.interferometers = bilby.gw.detector.InterferometerList(['H1']) + mass_1=31.0, + mass_2=29.0, + a_1=0.4, + a_2=0.3, + tilt_1=0.0, + tilt_2=0.0, + phi_12=1.7, + phi_jl=0.3, + luminosity_distance=4000.0, + theta_jn=0.4, + psi=2.659, + phase=1.3, + geocent_time=1126259642.413, + ra=1.375, + dec=-1.2108, + ) + self.interferometers = bilby.gw.detector.InterferometerList(["H1"]) self.interferometers.set_strain_data_from_power_spectral_densities( - sampling_frequency=self.sampling_frequency, duration=self.duration) + sampling_frequency=self.sampling_frequency, duration=self.duration + ) self.waveform_generator = bilby.gw.waveform_generator.WaveformGenerator( - duration=self.duration, sampling_frequency=self.sampling_frequency, + duration=self.duration, + sampling_frequency=self.sampling_frequency, frequency_domain_source_model=bilby.gw.source.lal_binary_black_hole, ) self.prior = bilby.gw.prior.BBHPriorDict() - self.prior['geocent_time'] = bilby.prior.Uniform( - minimum=self.parameters['geocent_time'] - self.duration / 2, - maximum=self.parameters['geocent_time'] + self.duration / 2) + self.prior["geocent_time"] = bilby.prior.Uniform( + minimum=self.parameters["geocent_time"] - self.duration / 2, + maximum=self.parameters["geocent_time"] + self.duration / 2, + ) self.likelihood = bilby.gw.likelihood.GravitationalWaveTransient( interferometers=self.interferometers, - waveform_generator=self.waveform_generator, priors=self.prior.copy() + waveform_generator=self.waveform_generator, + priors=self.prior.copy(), ) self.likelihood.parameters = self.parameters.copy() @@ -108,7 +137,9 @@ class TestGWTransient(unittest.TestCase): def test_noise_log_likelihood(self): """Test noise log likelihood matches precomputed value""" self.likelihood.noise_log_likelihood() - self.assertAlmostEqual(-4037.0994372143414, self.likelihood.noise_log_likelihood(), 3) + self.assertAlmostEqual( + -4037.0994372143414, self.likelihood.noise_log_likelihood(), 3 + ) def test_log_likelihood(self): """Test log likelihood matches precomputed value""" @@ -119,36 +150,61 @@ class TestGWTransient(unittest.TestCase): def test_log_likelihood_ratio(self): """Test log likelihood ratio returns the correct value""" self.assertAlmostEqual( - self.likelihood.log_likelihood() - - self.likelihood.noise_log_likelihood(), - self.likelihood.log_likelihood_ratio(), 3) + self.likelihood.log_likelihood() - self.likelihood.noise_log_likelihood(), + self.likelihood.log_likelihood_ratio(), + 3, + ) def test_likelihood_zero_when_waveform_is_none(self): """Test log likelihood returns np.nan_to_num(-np.inf) when the waveform is None""" - self.likelihood.waveform_generator.frequency_domain_strain =\ - lambda x: None - self.assertEqual(self.likelihood.log_likelihood_ratio(), - np.nan_to_num(-np.inf)) + self.likelihood.waveform_generator.frequency_domain_strain = lambda x: None + self.assertEqual(self.likelihood.log_likelihood_ratio(), np.nan_to_num(-np.inf)) def test_repr(self): - expected = 'GravitationalWaveTransient(interferometers={},\n\twaveform_generator={},\n\t' \ - 'time_marginalization={}, distance_marginalization={}, phase_marginalization={}, ' \ - 'priors={})'.format(self.interferometers, self.waveform_generator, False, False, False, self.prior) + expected = ( + "GravitationalWaveTransient(interferometers={},\n\twaveform_generator={},\n\t" + "time_marginalization={}, distance_marginalization={}, phase_marginalization={}, " + "priors={})".format( + self.interferometers, + self.waveform_generator, + False, + False, + False, + self.prior, + ) + ) self.assertEqual(expected, repr(self.likelihood)) def test_interferometers_setting_list(self): - ifos = [bilby.gw.detector.get_empty_interferometer(name=name) for name in ['H1', 'L1']] + ifos = [ + bilby.gw.detector.get_empty_interferometer(name=name) + for name in ["H1", "L1"] + ] self.likelihood.interferometers = ifos - self.assertListEqual(bilby.gw.detector.InterferometerList(ifos), self.likelihood.interferometers) - self.assertTrue(type(self.likelihood.interferometers) == bilby.gw.detector.InterferometerList) + self.assertListEqual( + bilby.gw.detector.InterferometerList(ifos), self.likelihood.interferometers + ) + self.assertTrue( + type(self.likelihood.interferometers) + == bilby.gw.detector.InterferometerList + ) def test_interferometers_setting_interferometer_list(self): - ifos = bilby.gw.detector.InterferometerList([bilby.gw.detector.get_empty_interferometer(name=name) - for name in ['H1', 'L1']]) + ifos = bilby.gw.detector.InterferometerList( + [ + bilby.gw.detector.get_empty_interferometer(name=name) + for name in ["H1", "L1"] + ] + ) self.likelihood.interferometers = ifos - self.assertListEqual(bilby.gw.detector.InterferometerList(ifos), self.likelihood.interferometers) - self.assertTrue(type(self.likelihood.interferometers) == bilby.gw.detector.InterferometerList) + self.assertListEqual( + bilby.gw.detector.InterferometerList(ifos), self.likelihood.interferometers + ) + self.assertTrue( + type(self.likelihood.interferometers) + == bilby.gw.detector.InterferometerList + ) def test_meta_data(self): expected = dict( @@ -163,37 +219,54 @@ class TestGWTransient(unittest.TestCase): sampling_frequency=self.waveform_generator.sampling_frequency, duration=self.waveform_generator.duration, start_time=self.waveform_generator.start_time, - lal_version=self.likelihood.lal_version) + lal_version=self.likelihood.lal_version, + ) self.assertDictEqual(expected, self.likelihood.meta_data) class TestTimeMarginalization(unittest.TestCase): - def setUp(self): np.random.seed(500) self.duration = 4 self.sampling_frequency = 2048 self.parameters = dict( - mass_1=31., mass_2=29., a_1=0.4, a_2=0.3, tilt_1=0.0, tilt_2=0.0, - phi_12=1.7, phi_jl=0.3, luminosity_distance=4000., theta_jn=0.4, - psi=2.659, phase=1.3, geocent_time=1126259640, ra=1.375, - dec=-1.2108) + mass_1=31.0, + mass_2=29.0, + a_1=0.4, + a_2=0.3, + tilt_1=0.0, + tilt_2=0.0, + phi_12=1.7, + phi_jl=0.3, + luminosity_distance=4000.0, + theta_jn=0.4, + psi=2.659, + phase=1.3, + geocent_time=1126259640, + ra=1.375, + dec=-1.2108, + ) - self.interferometers = bilby.gw.detector.InterferometerList(['H1']) + self.interferometers = bilby.gw.detector.InterferometerList(["H1"]) self.interferometers.set_strain_data_from_power_spectral_densities( - sampling_frequency=self.sampling_frequency, duration=self.duration, - start_time=1126259640) + sampling_frequency=self.sampling_frequency, + duration=self.duration, + start_time=1126259640, + ) self.waveform_generator = bilby.gw.waveform_generator.WaveformGenerator( - duration=self.duration, sampling_frequency=self.sampling_frequency, + duration=self.duration, + sampling_frequency=self.sampling_frequency, frequency_domain_source_model=bilby.gw.source.lal_binary_black_hole, - start_time=1126259640) + start_time=1126259640, + ) self.priors = bilby.gw.prior.BBHPriorDict() self.likelihood = bilby.gw.likelihood.GravitationalWaveTransient( interferometers=self.interferometers, - waveform_generator=self.waveform_generator, priors=self.priors.copy() + waveform_generator=self.waveform_generator, + priors=self.priors.copy(), ) self.likelihood.parameters = self.parameters.copy() @@ -214,28 +287,32 @@ class TestTimeMarginalization(unittest.TestCase): """ likes = [] lls = [] - self.priors['geocent_time'] = bilby.prior.Uniform( + self.priors["geocent_time"] = bilby.prior.Uniform( minimum=self.waveform_generator.start_time, - maximum=self.waveform_generator.start_time + self.duration) + maximum=self.waveform_generator.start_time + self.duration, + ) self.time = bilby.gw.likelihood.GravitationalWaveTransient( interferometers=self.interferometers, waveform_generator=self.waveform_generator, - time_marginalization=True, priors=self.priors + time_marginalization=True, + priors=self.priors, + ) + times = ( + self.waveform_generator.start_time + + np.linspace(0, self.duration, 4097)[:-1] ) - times = self.waveform_generator.start_time + np.linspace( - 0, self.duration, 4097)[:-1] for time in times: - self.likelihood.parameters['geocent_time'] = time + self.likelihood.parameters["geocent_time"] = time lls.append(self.likelihood.log_likelihood_ratio()) likes.append(np.exp(lls[-1])) - marg_like = np.log(np.trapz( - likes * self.time.priors['geocent_time'].prob(times), times)) + marg_like = np.log( + np.trapz(likes * self.time.priors["geocent_time"].prob(times), times) + ) self.time.parameters = self.parameters.copy() - self.time.parameters['time_jitter'] = 0.0 - self.time.parameters['geocent_time'] = self.waveform_generator.start_time - self.assertAlmostEqual(marg_like, self.time.log_likelihood_ratio(), - delta=0.5) + self.time.parameters["time_jitter"] = 0.0 + self.time.parameters["geocent_time"] = self.waveform_generator.start_time + self.assertAlmostEqual(marg_like, self.time.log_likelihood_ratio(), delta=0.5) def test_time_marginalisation_partial_segment(self): """ @@ -244,56 +321,75 @@ class TestTimeMarginalization(unittest.TestCase): """ likes = [] lls = [] - self.priors['geocent_time'] = bilby.prior.Uniform( - minimum=self.parameters['geocent_time'] + 1 - 0.1, - maximum=self.parameters['geocent_time'] + 1 + 0.1) + self.priors["geocent_time"] = bilby.prior.Uniform( + minimum=self.parameters["geocent_time"] + 1 - 0.1, + maximum=self.parameters["geocent_time"] + 1 + 0.1, + ) self.time = bilby.gw.likelihood.GravitationalWaveTransient( interferometers=self.interferometers, waveform_generator=self.waveform_generator, - time_marginalization=True, priors=self.priors + time_marginalization=True, + priors=self.priors, + ) + times = ( + self.waveform_generator.start_time + + np.linspace(0, self.duration, 4097)[:-1] ) - times = self.waveform_generator.start_time + np.linspace( - 0, self.duration, 4097)[:-1] for time in times: - self.likelihood.parameters['geocent_time'] = time + self.likelihood.parameters["geocent_time"] = time lls.append(self.likelihood.log_likelihood_ratio()) likes.append(np.exp(lls[-1])) - marg_like = np.log(np.trapz( - likes * self.time.priors['geocent_time'].prob(times), times)) + marg_like = np.log( + np.trapz(likes * self.time.priors["geocent_time"].prob(times), times) + ) self.time.parameters = self.parameters.copy() - self.time.parameters['time_jitter'] = 0.0 - self.time.parameters['geocent_time'] = self.waveform_generator.start_time - self.assertAlmostEqual(marg_like, self.time.log_likelihood_ratio(), - delta=0.5) + self.time.parameters["time_jitter"] = 0.0 + self.time.parameters["geocent_time"] = self.waveform_generator.start_time + self.assertAlmostEqual(marg_like, self.time.log_likelihood_ratio(), delta=0.5) class TestMarginalizedLikelihood(unittest.TestCase): - def setUp(self): np.random.seed(500) self.duration = 4 self.sampling_frequency = 2048 self.parameters = dict( - mass_1=31., mass_2=29., a_1=0.4, a_2=0.3, tilt_1=0.0, tilt_2=0.0, - phi_12=1.7, phi_jl=0.3, luminosity_distance=4000., theta_jn=0.4, - psi=2.659, phase=1.3, geocent_time=1126259642.413, ra=1.375, - dec=-1.2108) + mass_1=31.0, + mass_2=29.0, + a_1=0.4, + a_2=0.3, + tilt_1=0.0, + tilt_2=0.0, + phi_12=1.7, + phi_jl=0.3, + luminosity_distance=4000.0, + theta_jn=0.4, + psi=2.659, + phase=1.3, + geocent_time=1126259642.413, + ra=1.375, + dec=-1.2108, + ) - self.interferometers = bilby.gw.detector.InterferometerList(['H1']) + self.interferometers = bilby.gw.detector.InterferometerList(["H1"]) self.interferometers.set_strain_data_from_power_spectral_densities( - sampling_frequency=self.sampling_frequency, duration=self.duration, - start_time=self.parameters['geocent_time'] - self.duration / 2) + sampling_frequency=self.sampling_frequency, + duration=self.duration, + start_time=self.parameters["geocent_time"] - self.duration / 2, + ) self.waveform_generator = bilby.gw.waveform_generator.WaveformGenerator( - duration=self.duration, sampling_frequency=self.sampling_frequency, + duration=self.duration, + sampling_frequency=self.sampling_frequency, frequency_domain_source_model=bilby.gw.source.lal_binary_black_hole, ) self.prior = bilby.gw.prior.BBHPriorDict() - self.prior['geocent_time'] = bilby.prior.Uniform( - minimum=self.parameters['geocent_time'] - self.duration / 2, - maximum=self.parameters['geocent_time'] + self.duration / 2) + self.prior["geocent_time"] = bilby.prior.Uniform( + minimum=self.parameters["geocent_time"] - self.duration / 2, + maximum=self.parameters["geocent_time"] + self.duration / 2, + ) def test_cannot_instantiate_marginalised_likelihood_without_prior(self): self.assertRaises( @@ -301,47 +397,71 @@ class TestMarginalizedLikelihood(unittest.TestCase): lambda: bilby.gw.likelihood.GravitationalWaveTransient( interferometers=self.interferometers, waveform_generator=self.waveform_generator, - phase_marginalization=True)) + phase_marginalization=True, + ), + ) def test_generating_default_time_prior(self): - temp = self.prior.pop('geocent_time') + temp = self.prior.pop("geocent_time") new_prior = self.prior.copy() like = bilby.gw.likelihood.GravitationalWaveTransient( interferometers=self.interferometers, - waveform_generator=self.waveform_generator, priors=new_prior, - time_marginalization=True + waveform_generator=self.waveform_generator, + priors=new_prior, + time_marginalization=True, + ) + same = all( + [ + temp.minimum == like.priors["geocent_time"].minimum, + temp.maximum == like.priors["geocent_time"].maximum, + new_prior["geocent_time"] == temp.minimum, + ] ) - same = all([temp.minimum == like.priors['geocent_time'].minimum, - temp.maximum == like.priors['geocent_time'].maximum, - new_prior['geocent_time'] == temp.minimum]) self.assertTrue(same) - self.prior['geocent_time'] = temp + self.prior["geocent_time"] = temp def test_generating_default_phase_prior(self): - temp = self.prior.pop('phase') + temp = self.prior.pop("phase") new_prior = self.prior.copy() like = bilby.gw.likelihood.GravitationalWaveTransient( interferometers=self.interferometers, - waveform_generator=self.waveform_generator, priors=new_prior, - phase_marginalization=True + waveform_generator=self.waveform_generator, + priors=new_prior, + phase_marginalization=True, + ) + same = all( + [ + temp.minimum == like.priors["phase"].minimum, + temp.maximum == like.priors["phase"].maximum, + new_prior["phase"] == float(0), + ] ) - same = all([temp.minimum == like.priors['phase'].minimum, - temp.maximum == like.priors['phase'].maximum, - new_prior['phase'] == float(0)]) self.assertTrue(same) - self.prior['phase'] = temp + self.prior["phase"] = temp def test_run_sampler_flags_if_marginalized_phase_is_sampled(self): like = bilby.gw.likelihood.GravitationalWaveTransient( interferometers=self.interferometers, - waveform_generator=self.waveform_generator, priors=self.prior, - phase_marginalization=True + waveform_generator=self.waveform_generator, + priors=self.prior, + phase_marginalization=True, ) new_prior = self.prior.copy() - new_prior['phase'] = bilby.prior.Uniform(minimum=0, maximum=2*np.pi) + new_prior["phase"] = bilby.prior.Uniform(minimum=0, maximum=2 * np.pi) for key, param in dict( - mass_1=31., mass_2=29., a_1=0.4, a_2=0.3, tilt_1=0.0, tilt_2=0.0, - phi_12=1.7, phi_jl=0.3, theta_jn=0.4, psi=2.659, ra=1.375, dec=-1.2108).items(): + mass_1=31.0, + mass_2=29.0, + a_1=0.4, + a_2=0.3, + tilt_1=0.0, + tilt_2=0.0, + phi_12=1.7, + phi_jl=0.3, + theta_jn=0.4, + psi=2.659, + ra=1.375, + dec=-1.2108, + ).items(): new_prior[key] = param with self.assertRaises(bilby.core.sampler.SamplingMarginalisedParameterError): bilby.run_sampler(like, new_prior) @@ -349,54 +469,82 @@ class TestMarginalizedLikelihood(unittest.TestCase): def test_run_sampler_flags_if_marginalized_time_is_sampled(self): like = bilby.gw.likelihood.GravitationalWaveTransient( interferometers=self.interferometers, - waveform_generator=self.waveform_generator, priors=self.prior, - time_marginalization=True + waveform_generator=self.waveform_generator, + priors=self.prior, + time_marginalization=True, ) new_prior = self.prior.copy() - new_prior['geocent_time'] = bilby.prior.Uniform(minimum=0, maximum=1) + new_prior["geocent_time"] = bilby.prior.Uniform(minimum=0, maximum=1) for key, param in dict( - mass_1=31., mass_2=29., a_1=0.4, a_2=0.3, tilt_1=0.0, tilt_2=0.0, - phi_12=1.7, phi_jl=0.3, theta_jn=0.4, psi=2.659, ra=1.375, dec=-1.2108).items(): + mass_1=31.0, + mass_2=29.0, + a_1=0.4, + a_2=0.3, + tilt_1=0.0, + tilt_2=0.0, + phi_12=1.7, + phi_jl=0.3, + theta_jn=0.4, + psi=2.659, + ra=1.375, + dec=-1.2108, + ).items(): new_prior[key] = param with self.assertRaises(bilby.core.sampler.SamplingMarginalisedParameterError): bilby.run_sampler(like, new_prior) class TestPhaseMarginalization(unittest.TestCase): - def setUp(self): np.random.seed(500) self.duration = 4 self.sampling_frequency = 2048 self.parameters = dict( - mass_1=31., mass_2=29., a_1=0.4, a_2=0.3, tilt_1=0.0, tilt_2=0.0, - phi_12=1.7, phi_jl=0.3, luminosity_distance=4000., theta_jn=0.4, - psi=2.659, phase=1.3, geocent_time=1126259642.413, ra=1.375, - dec=-1.2108) + mass_1=31.0, + mass_2=29.0, + a_1=0.4, + a_2=0.3, + tilt_1=0.0, + tilt_2=0.0, + phi_12=1.7, + phi_jl=0.3, + luminosity_distance=4000.0, + theta_jn=0.4, + psi=2.659, + phase=1.3, + geocent_time=1126259642.413, + ra=1.375, + dec=-1.2108, + ) - self.interferometers = bilby.gw.detector.InterferometerList(['H1']) + self.interferometers = bilby.gw.detector.InterferometerList(["H1"]) self.interferometers.set_strain_data_from_power_spectral_densities( - sampling_frequency=self.sampling_frequency, duration=self.duration) + sampling_frequency=self.sampling_frequency, duration=self.duration + ) self.waveform_generator = bilby.gw.waveform_generator.WaveformGenerator( - duration=self.duration, sampling_frequency=self.sampling_frequency, + duration=self.duration, + sampling_frequency=self.sampling_frequency, frequency_domain_source_model=bilby.gw.source.lal_binary_black_hole, ) self.prior = bilby.gw.prior.BBHPriorDict() - self.prior['geocent_time'] = bilby.prior.Uniform( - minimum=self.parameters['geocent_time'] - self.duration / 2, - maximum=self.parameters['geocent_time'] + self.duration / 2) + self.prior["geocent_time"] = bilby.prior.Uniform( + minimum=self.parameters["geocent_time"] - self.duration / 2, + maximum=self.parameters["geocent_time"] + self.duration / 2, + ) self.likelihood = bilby.gw.likelihood.GravitationalWaveTransient( interferometers=self.interferometers, - waveform_generator=self.waveform_generator, priors=self.prior.copy() + waveform_generator=self.waveform_generator, + priors=self.prior.copy(), ) self.phase = bilby.gw.likelihood.GravitationalWaveTransient( interferometers=self.interferometers, waveform_generator=self.waveform_generator, - phase_marginalization=True, priors=self.prior.copy() + phase_marginalization=True, + priors=self.prior.copy(), ) for like in [self.likelihood, self.phase]: like.parameters = self.parameters.copy() @@ -416,64 +564,83 @@ class TestPhaseMarginalization(unittest.TestCase): like = [] phases = np.linspace(0, 2 * np.pi, 1000) for phase in phases: - self.likelihood.parameters['phase'] = phase + self.likelihood.parameters["phase"] = phase like.append(np.exp(self.likelihood.log_likelihood_ratio())) marg_like = np.log(np.trapz(like, phases) / (2 * np.pi)) self.phase.parameters = self.parameters.copy() - self.assertAlmostEqual(marg_like, self.phase.log_likelihood_ratio(), - delta=0.5) + self.assertAlmostEqual(marg_like, self.phase.log_likelihood_ratio(), delta=0.5) class TestTimePhaseMarginalization(unittest.TestCase): - def setUp(self): np.random.seed(500) self.duration = 4 self.sampling_frequency = 2048 self.parameters = dict( - mass_1=31., mass_2=29., a_1=0.4, a_2=0.3, tilt_1=0.0, tilt_2=0.0, - phi_12=1.7, phi_jl=0.3, luminosity_distance=4000., theta_jn=0.4, - psi=2.659, phase=1.3, geocent_time=1126259642.413, ra=1.375, - dec=-1.2108) + mass_1=31.0, + mass_2=29.0, + a_1=0.4, + a_2=0.3, + tilt_1=0.0, + tilt_2=0.0, + phi_12=1.7, + phi_jl=0.3, + luminosity_distance=4000.0, + theta_jn=0.4, + psi=2.659, + phase=1.3, + geocent_time=1126259642.413, + ra=1.375, + dec=-1.2108, + ) - self.interferometers = bilby.gw.detector.InterferometerList(['H1']) + self.interferometers = bilby.gw.detector.InterferometerList(["H1"]) self.interferometers.set_strain_data_from_power_spectral_densities( - sampling_frequency=self.sampling_frequency, duration=self.duration, - start_time=1126259640) + sampling_frequency=self.sampling_frequency, + duration=self.duration, + start_time=1126259640, + ) self.waveform_generator = bilby.gw.waveform_generator.WaveformGenerator( - duration=self.duration, sampling_frequency=self.sampling_frequency, + duration=self.duration, + sampling_frequency=self.sampling_frequency, frequency_domain_source_model=bilby.gw.source.lal_binary_black_hole, - start_time=1126259640) + start_time=1126259640, + ) self.priors = bilby.gw.prior.BBHPriorDict() - self.priors['geocent_time'] = bilby.prior.Uniform( - minimum=self.parameters['geocent_time'] - self.duration / 2, - maximum=self.parameters['geocent_time'] + self.duration / 2) + self.priors["geocent_time"] = bilby.prior.Uniform( + minimum=self.parameters["geocent_time"] - self.duration / 2, + maximum=self.parameters["geocent_time"] + self.duration / 2, + ) self.likelihood = bilby.gw.likelihood.GravitationalWaveTransient( interferometers=self.interferometers, - waveform_generator=self.waveform_generator, priors=self.priors.copy() + waveform_generator=self.waveform_generator, + priors=self.priors.copy(), ) self.time = bilby.gw.likelihood.GravitationalWaveTransient( interferometers=self.interferometers, waveform_generator=self.waveform_generator, - time_marginalization=True, priors=self.priors.copy() + time_marginalization=True, + priors=self.priors.copy(), ) self.phase = bilby.gw.likelihood.GravitationalWaveTransient( interferometers=self.interferometers, waveform_generator=self.waveform_generator, - phase_marginalization=True, priors=self.priors.copy() + phase_marginalization=True, + priors=self.priors.copy(), ) self.time_phase = bilby.gw.likelihood.GravitationalWaveTransient( interferometers=self.interferometers, waveform_generator=self.waveform_generator, - time_marginalization=True, phase_marginalization=True, - priors=self.priors + time_marginalization=True, + phase_marginalization=True, + priors=self.priors, ) for like in [self.likelihood, self.time, self.phase, self.time_phase]: like.parameters = self.parameters.copy() @@ -497,19 +664,20 @@ class TestTimePhaseMarginalization(unittest.TestCase): """ like = [] times = np.linspace( - self.time_phase.priors['geocent_time'].minimum, - self.time_phase.priors['geocent_time'].maximum, 4097)[:-1] + self.time_phase.priors["geocent_time"].minimum, + self.time_phase.priors["geocent_time"].maximum, + 4097, + )[:-1] for time in times: - self.phase.parameters['geocent_time'] = time + self.phase.parameters["geocent_time"] = time like.append(np.exp(self.phase.log_likelihood_ratio())) - marg_like = np.log(np.trapz(like, times) - / self.waveform_generator.duration) + marg_like = np.log(np.trapz(like, times) / self.waveform_generator.duration) self.time_phase.parameters = self.parameters.copy() - self.time_phase.parameters['time_jitter'] = 0.0 - self.assertAlmostEqual(marg_like, - self.time_phase.log_likelihood_ratio(), - delta=0.5) + self.time_phase.parameters["time_jitter"] = 0.0 + self.assertAlmostEqual( + marg_like, self.time_phase.log_likelihood_ratio(), delta=0.5 + ) def test_phase_marginalisation(self): """ @@ -519,20 +687,19 @@ class TestTimePhaseMarginalization(unittest.TestCase): like = [] phases = np.linspace(0, 2 * np.pi, 1000) for phase in phases: - self.time.parameters['phase'] = phase - self.time.parameters['time_jitter'] = 0.0 + self.time.parameters["phase"] = phase + self.time.parameters["time_jitter"] = 0.0 like.append(np.exp(self.time.log_likelihood_ratio())) marg_like = np.log(np.trapz(like, phases) / (2 * np.pi)) self.time_phase.parameters = self.parameters.copy() - self.time_phase.parameters['time_jitter'] = 0.0 - self.assertAlmostEqual(marg_like, - self.time_phase.log_likelihood_ratio(), - delta=0.5) + self.time_phase.parameters["time_jitter"] = 0.0 + self.assertAlmostEqual( + marg_like, self.time_phase.log_likelihood_ratio(), delta=0.5 + ) class TestROQLikelihood(unittest.TestCase): - def setUp(self): self.duration = 4 self.sampling_frequency = 2048 @@ -540,8 +707,9 @@ class TestROQLikelihood(unittest.TestCase): # Possible locations for the ROQ: in the docker image, local, or on CIT trial_roq_paths = [ "/roq_basis", - os.path.join(os.path.expanduser("~"), 'ROQ_data/IMRPhenomPv2/4s'), - "/home/cbc/ROQ_data/IMRPhenomPv2/4s"] + os.path.join(os.path.expanduser("~"), "ROQ_data/IMRPhenomPv2/4s"), + "/home/cbc/ROQ_data/IMRPhenomPv2/4s", + ] roq_dir = None for path in trial_roq_paths: if os.path.isdir(path): @@ -562,13 +730,27 @@ class TestROQLikelihood(unittest.TestCase): self.params_file = "{}/params.dat".format(roq_dir) self.test_parameters = dict( - mass_1=36.0, mass_2=36.0, a_1=0.0, a_2=0.0, tilt_1=0.0, tilt_2=0.0, - phi_12=1.7, phi_jl=0.3, luminosity_distance=1000., theta_jn=0.4, - psi=0.659, phase=1.3, geocent_time=1.2, ra=1.3, dec=-1.2) + mass_1=36.0, + mass_2=36.0, + a_1=0.0, + a_2=0.0, + tilt_1=0.0, + tilt_2=0.0, + phi_12=1.7, + phi_jl=0.3, + luminosity_distance=1000.0, + theta_jn=0.4, + psi=0.659, + phase=1.3, + geocent_time=1.2, + ra=1.3, + dec=-1.2, + ) - ifos = bilby.gw.detector.InterferometerList(['H1']) + ifos = bilby.gw.detector.InterferometerList(["H1"]) ifos.set_strain_data_from_power_spectral_densities( - sampling_frequency=self.sampling_frequency, duration=self.duration) + sampling_frequency=self.sampling_frequency, duration=self.duration + ) self.priors = bilby.gw.prior.BBHPriorDict() self.priors.pop("mass_1") @@ -576,123 +758,166 @@ class TestROQLikelihood(unittest.TestCase): # Testing is done with the 4s IMRPhenomPV2 ROQ basis self.priors["chirp_mass"] = bilby.core.prior.Uniform(12.299703, 45) self.priors["mass_ratio"] = bilby.core.prior.Uniform(0.125, 1) - self.priors['geocent_time'] = bilby.core.prior.Uniform(1.19, 1.21) + self.priors["geocent_time"] = bilby.core.prior.Uniform(1.19, 1.21) non_roq_wfg = bilby.gw.WaveformGenerator( - duration=self.duration, sampling_frequency=self.sampling_frequency, + duration=self.duration, + sampling_frequency=self.sampling_frequency, frequency_domain_source_model=bilby.gw.source.lal_binary_black_hole, waveform_arguments=dict( - reference_frequency=20.0, minimum_frequency=20.0, - approximant='IMRPhenomPv2')) + reference_frequency=20.0, + minimum_frequency=20.0, + approximant="IMRPhenomPv2", + ), + ) ifos.inject_signal( - parameters=self.test_parameters, waveform_generator=non_roq_wfg) + parameters=self.test_parameters, waveform_generator=non_roq_wfg + ) self.ifos = ifos roq_wfg = bilby.gw.waveform_generator.WaveformGenerator( - duration=self.duration, sampling_frequency=self.sampling_frequency, + duration=self.duration, + sampling_frequency=self.sampling_frequency, frequency_domain_source_model=bilby.gw.source.roq, waveform_arguments=dict( frequency_nodes_linear=fnodes_linear, frequency_nodes_quadratic=fnodes_quadratic, - reference_frequency=20., minimum_frequency=20., - approximant='IMRPhenomPv2')) + reference_frequency=20.0, + minimum_frequency=20.0, + approximant="IMRPhenomPv2", + ), + ) self.roq_wfg = roq_wfg self.non_roq = bilby.gw.likelihood.GravitationalWaveTransient( - interferometers=ifos, waveform_generator=non_roq_wfg) + interferometers=ifos, waveform_generator=non_roq_wfg + ) self.non_roq_phase = bilby.gw.likelihood.GravitationalWaveTransient( - interferometers=ifos, waveform_generator=non_roq_wfg, - phase_marginalization=True, priors=self.priors.copy()) + interferometers=ifos, + waveform_generator=non_roq_wfg, + phase_marginalization=True, + priors=self.priors.copy(), + ) self.roq = bilby.gw.likelihood.ROQGravitationalWaveTransient( - interferometers=ifos, waveform_generator=roq_wfg, + interferometers=ifos, + waveform_generator=roq_wfg, linear_matrix=linear_matrix_file, - quadratic_matrix=quadratic_matrix_file, priors=self.priors) + quadratic_matrix=quadratic_matrix_file, + priors=self.priors, + ) self.roq_phase = bilby.gw.likelihood.ROQGravitationalWaveTransient( - interferometers=ifos, waveform_generator=roq_wfg, + interferometers=ifos, + waveform_generator=roq_wfg, linear_matrix=linear_matrix_file, quadratic_matrix=quadratic_matrix_file, - phase_marginalization=True, priors=self.priors.copy()) + phase_marginalization=True, + priors=self.priors.copy(), + ) def tearDown(self): - del (self.roq, self.non_roq, self.non_roq_phase, self.roq_phase, - self.ifos, self.priors) + del ( + self.roq, + self.non_roq, + self.non_roq_phase, + self.roq_phase, + self.ifos, + self.priors, + ) def test_matches_non_roq(self): self.non_roq.parameters.update(self.test_parameters) self.roq.parameters.update(self.test_parameters) self.assertLess( - abs(self.non_roq.log_likelihood_ratio() - - self.roq.log_likelihood_ratio()) / - self.non_roq.log_likelihood_ratio(), 1e-3) + abs(self.non_roq.log_likelihood_ratio() - self.roq.log_likelihood_ratio()) + / self.non_roq.log_likelihood_ratio(), + 1e-3, + ) def test_time_prior_out_of_bounds_returns_zero(self): self.roq.parameters.update(self.test_parameters) - self.roq.parameters['geocent_time'] = -5 - self.assertEqual( - self.roq.log_likelihood_ratio(), np.nan_to_num(-np.inf)) + self.roq.parameters["geocent_time"] = -5 + self.assertEqual(self.roq.log_likelihood_ratio(), np.nan_to_num(-np.inf)) def test_phase_marginalisation_roq(self): """Test phase marginalised likelihood matches brute force version""" self.non_roq_phase.parameters = self.test_parameters.copy() self.roq_phase.parameters = self.test_parameters.copy() self.assertLess( - abs(self.non_roq_phase.log_likelihood_ratio() - - self.roq_phase.log_likelihood_ratio()) / - self.non_roq_phase.log_likelihood_ratio(), 1e-3) + abs( + self.non_roq_phase.log_likelihood_ratio() + - self.roq_phase.log_likelihood_ratio() + ) + / self.non_roq_phase.log_likelihood_ratio(), + 1e-3, + ) def test_create_roq_weights_with_params(self): roq = bilby.gw.likelihood.ROQGravitationalWaveTransient( - interferometers=self.ifos, waveform_generator=self.roq_wfg, - linear_matrix=self.linear_matrix_file, roq_params=self.params_file, - quadratic_matrix=self.quadratic_matrix_file, priors=self.priors) + interferometers=self.ifos, + waveform_generator=self.roq_wfg, + linear_matrix=self.linear_matrix_file, + roq_params=self.params_file, + quadratic_matrix=self.quadratic_matrix_file, + priors=self.priors, + ) roq.parameters.update(self.test_parameters) self.roq.parameters.update(self.test_parameters) - self.assertEqual( - roq.log_likelihood_ratio(), self.roq.log_likelihood_ratio()) + self.assertEqual(roq.log_likelihood_ratio(), self.roq.log_likelihood_ratio()) def test_create_roq_weights_frequency_mismatch_works_with_params(self): self.ifos[0].maximum_frequency = self.ifos[0].maximum_frequency / 2 bilby.gw.likelihood.ROQGravitationalWaveTransient( - interferometers=self.ifos, waveform_generator=self.roq_wfg, - linear_matrix=self.linear_matrix_file, roq_params=self.params_file, - quadratic_matrix=self.quadratic_matrix_file, priors=self.priors) + interferometers=self.ifos, + waveform_generator=self.roq_wfg, + linear_matrix=self.linear_matrix_file, + roq_params=self.params_file, + quadratic_matrix=self.quadratic_matrix_file, + priors=self.priors, + ) def test_create_roq_weights_frequency_mismatch_fails_without_params(self): self.ifos[0].maximum_frequency = self.ifos[0].maximum_frequency / 2 with self.assertRaises(ValueError): bilby.gw.likelihood.ROQGravitationalWaveTransient( - interferometers=self.ifos, waveform_generator=self.roq_wfg, + interferometers=self.ifos, + waveform_generator=self.roq_wfg, linear_matrix=self.linear_matrix_file, - quadratic_matrix=self.quadratic_matrix_file, priors=self.priors) + quadratic_matrix=self.quadratic_matrix_file, + priors=self.priors, + ) def test_create_roq_weights_fails_with_min_chirp_mass_outside_bounds(self): self.ifos[0].maximum_frequency = self.ifos[0].maximum_frequency / 2 self.priors["chirp_mass"] = bilby.core.prior.Uniform(10, 45) with self.assertRaises(BilbyROQParamsRangeError): bilby.gw.likelihood.ROQGravitationalWaveTransient( - interferometers=self.ifos, waveform_generator=self.roq_wfg, + interferometers=self.ifos, + waveform_generator=self.roq_wfg, linear_matrix=self.linear_matrix_file, roq_params=self.params_file, quadratic_matrix=self.quadratic_matrix_file, - priors=self.priors) + priors=self.priors, + ) def test_create_roq_weights_fails_with_max_chirp_mass_outside_bounds(self): self.ifos[0].maximum_frequency = self.ifos[0].maximum_frequency / 2 self.priors["chirp_mass"] = bilby.core.prior.Uniform(12.299703, 50) with self.assertRaises(BilbyROQParamsRangeError): bilby.gw.likelihood.ROQGravitationalWaveTransient( - interferometers=self.ifos, waveform_generator=self.roq_wfg, + interferometers=self.ifos, + waveform_generator=self.roq_wfg, linear_matrix=self.linear_matrix_file, roq_params=self.params_file, quadratic_matrix=self.quadratic_matrix_file, - priors=self.priors) + priors=self.priors, + ) def test_create_roq_weights_fails_with_min_component_mass_outside_bounds(self): self.ifos[0].maximum_frequency = self.ifos[0].maximum_frequency / 2 @@ -700,57 +925,67 @@ class TestROQLikelihood(unittest.TestCase): self.priors["mass_ratio"] = bilby.core.prior.Uniform(1e-5, 1) with self.assertRaises(BilbyROQParamsRangeError): bilby.gw.likelihood.ROQGravitationalWaveTransient( - interferometers=self.ifos, waveform_generator=self.roq_wfg, + interferometers=self.ifos, + waveform_generator=self.roq_wfg, linear_matrix=self.linear_matrix_file, roq_params=self.params_file, quadratic_matrix=self.quadratic_matrix_file, - priors=self.priors) + priors=self.priors, + ) def test_create_roq_weights_fails_with_max_frequency(self): - ifos = bilby.gw.detector.InterferometerList(['H1']) + ifos = bilby.gw.detector.InterferometerList(["H1"]) ifos.set_strain_data_from_power_spectral_densities( - sampling_frequency=2**14, duration=4) - ifos[0].maximum_frequency = 2**13 + sampling_frequency=2 ** 14, duration=4 + ) + ifos[0].maximum_frequency = 2 ** 13 with self.assertRaises(BilbyROQParamsRangeError): bilby.gw.likelihood.ROQGravitationalWaveTransient( - interferometers=ifos, waveform_generator=self.roq_wfg, + interferometers=ifos, + waveform_generator=self.roq_wfg, linear_matrix=self.linear_matrix_file, roq_params=self.params_file, quadratic_matrix=self.quadratic_matrix_file, - priors=self.priors) + priors=self.priors, + ) def test_create_roq_weights_fails_due_to_min_frequency(self): self.ifos[0].minimum_frequency = 15 with self.assertRaises(BilbyROQParamsRangeError): bilby.gw.likelihood.ROQGravitationalWaveTransient( - interferometers=self.ifos, waveform_generator=self.roq_wfg, + interferometers=self.ifos, + waveform_generator=self.roq_wfg, linear_matrix=self.linear_matrix_file, roq_params=self.params_file, quadratic_matrix=self.quadratic_matrix_file, - priors=self.priors) + priors=self.priors, + ) def test_create_roq_weights_fails_due_to_duration(self): - ifos = bilby.gw.detector.InterferometerList(['H1']) + ifos = bilby.gw.detector.InterferometerList(["H1"]) ifos.set_strain_data_from_power_spectral_densities( - sampling_frequency=self.sampling_frequency, duration=16) + sampling_frequency=self.sampling_frequency, duration=16 + ) with self.assertRaises(BilbyROQParamsRangeError): bilby.gw.likelihood.ROQGravitationalWaveTransient( - interferometers=ifos, waveform_generator=self.roq_wfg, + interferometers=ifos, + waveform_generator=self.roq_wfg, linear_matrix=self.linear_matrix_file, roq_params=self.params_file, quadratic_matrix=self.quadratic_matrix_file, - priors=self.priors) + priors=self.priors, + ) class TestRescaledROQLikelihood(unittest.TestCase): - def test_rescaling(self): # Possible locations for the ROQ: in the docker image, local, or on CIT trial_roq_paths = [ "/roq_basis", - os.path.join(os.path.expanduser("~"), 'ROQ_data/IMRPhenomPv2/4s'), - "/home/cbc/ROQ_data/IMRPhenomPv2/4s"] + os.path.join(os.path.expanduser("~"), "ROQ_data/IMRPhenomPv2/4s"), + "/home/cbc/ROQ_data/IMRPhenomPv2/4s", + ] roq_dir = None for path in trial_roq_paths: if os.path.isdir(path): @@ -776,9 +1011,10 @@ class TestRescaledROQLikelihood(unittest.TestCase): self.duration = 4 / scale_factor self.sampling_frequency = 2048 * scale_factor - ifos = bilby.gw.detector.InterferometerList(['H1']) + ifos = bilby.gw.detector.InterferometerList(["H1"]) ifos.set_strain_data_from_power_spectral_densities( - sampling_frequency=self.sampling_frequency, duration=self.duration) + sampling_frequency=self.sampling_frequency, duration=self.duration + ) self.ifos = ifos self.priors = bilby.gw.prior.BBHPriorDict() @@ -786,38 +1022,45 @@ class TestRescaledROQLikelihood(unittest.TestCase): self.priors.pop("mass_2") # Testing is done with the 4s IMRPhenomPV2 ROQ basis self.priors["chirp_mass"] = bilby.core.prior.Uniform( - 12.299703 / scale_factor, 45 / scale_factor) + 12.299703 / scale_factor, 45 / scale_factor + ) self.priors["mass_ratio"] = bilby.core.prior.Uniform(0.125, 1) - self.priors['geocent_time'] = bilby.core.prior.Uniform(1.19, 1.21) + self.priors["geocent_time"] = bilby.core.prior.Uniform(1.19, 1.21) self.roq_wfg = bilby.gw.waveform_generator.WaveformGenerator( - duration=self.duration, sampling_frequency=self.sampling_frequency, + duration=self.duration, + sampling_frequency=self.sampling_frequency, frequency_domain_source_model=bilby.gw.source.roq, waveform_arguments=dict( frequency_nodes_linear=fnodes_linear, frequency_nodes_quadratic=fnodes_quadratic, - reference_frequency=20., minimum_frequency=20., - approximant='IMRPhenomPv2')) + reference_frequency=20.0, + minimum_frequency=20.0, + approximant="IMRPhenomPv2", + ), + ) self.roq = bilby.gw.likelihood.ROQGravitationalWaveTransient( - interferometers=ifos, waveform_generator=self.roq_wfg, - linear_matrix=linear_matrix_file, roq_params=params, - roq_scale_factor=scale_factor, quadratic_matrix=quadratic_matrix_file, - priors=self.priors) + interferometers=ifos, + waveform_generator=self.roq_wfg, + linear_matrix=linear_matrix_file, + roq_params=params, + roq_scale_factor=scale_factor, + quadratic_matrix=quadratic_matrix_file, + priors=self.priors, + ) class TestBBHLikelihoodSetUp(unittest.TestCase): - def setUp(self): - self.ifos = bilby.gw.detector.InterferometerList(['H1']) + self.ifos = bilby.gw.detector.InterferometerList(["H1"]) def tearDown(self): del self.ifos def test_instantiation(self): - self.like = bilby.gw.likelihood.get_binary_black_hole_likelihood( - self.ifos) + self.like = bilby.gw.likelihood.get_binary_black_hole_likelihood(self.ifos) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/test/gw_plot_test.py b/test/gw_plot_test.py index b440f2eb8136335a6daaf326cf8283d99e497fad..336bdd73bf651e5187b13e03059e20ceb3296829 100644 --- a/test/gw_plot_test.py +++ b/test/gw_plot_test.py @@ -8,11 +8,10 @@ import bilby class TestCBCResult(unittest.TestCase): - def setUp(self): bilby.utils.command_line_args.bilby_test_mode = False priors = bilby.gw.prior.BBHPriorDict() - priors['geocent_time'] = 2 + priors["geocent_time"] = 2 injection_parameters = priors.sample() self.meta_data = dict( likelihood=dict( @@ -21,11 +20,12 @@ class TestCBCResult(unittest.TestCase): time_marginalization=True, frequency_domain_source_model=bilby.gw.source.lal_binary_black_hole, waveform_arguments=dict( - reference_frequency=20.0, - waveform_approximant='IMRPhenomPv2'), + reference_frequency=20.0, waveform_approximant="IMRPhenomPv2" + ), interferometers=dict( H1=dict(optimal_SNR=1, parameters=injection_parameters), - L1=dict(optimal_SNR=1, parameters=injection_parameters)), + L1=dict(optimal_SNR=1, parameters=injection_parameters), + ), sampling_frequency=4096, duration=4, start_time=0, @@ -34,12 +34,16 @@ class TestCBCResult(unittest.TestCase): ) ) self.result = bilby.gw.result.CBCResult( - label='label', outdir='outdir', sampler='nestle', - search_parameter_keys=list(priors.keys()), fixed_parameter_keys=list(), - priors=priors, sampler_kwargs=dict(test='test', func=lambda x: x), + label="label", + outdir="outdir", + sampler="nestle", + search_parameter_keys=list(priors.keys()), + fixed_parameter_keys=list(), + priors=priors, + sampler_kwargs=dict(test="test", func=lambda x: x), injection_parameters=injection_parameters, meta_data=self.meta_data, - posterior=pd.DataFrame(priors.sample(100)) + posterior=pd.DataFrame(priors.sample(100)), ) if not os.path.isdir(self.result.outdir): os.mkdir(self.result.outdir) @@ -63,7 +67,9 @@ class TestCBCResult(unittest.TestCase): label="recalib_H1_", n_nodes=5, ) - calibration_filename = f"{self.result.outdir}/{self.result.label}_calibration.png" + calibration_filename = ( + f"{self.result.outdir}/{self.result.label}_calibration.png" + ) for key in calibration_prior: self.result.posterior[key] = calibration_prior[key].sample(100) self.result.plot_calibration_posterior() @@ -71,7 +77,9 @@ class TestCBCResult(unittest.TestCase): def test_calibration_plot_returns_none_with_no_calibration_parameters(self): self.assertIsNone(self.result.plot_calibration_posterior()) - calibration_filename = f"{self.result.outdir}/{self.result.label}_calibration.png" + calibration_filename = ( + f"{self.result.outdir}/{self.result.label}_calibration.png" + ) self.assertFalse(os.path.exists(calibration_filename)) def test_calibration_pdf_plot(self): @@ -83,7 +91,9 @@ class TestCBCResult(unittest.TestCase): label="recalib_H1_", n_nodes=5, ) - calibration_filename = f"{self.result.outdir}/{self.result.label}_calibration.pdf" + calibration_filename = ( + f"{self.result.outdir}/{self.result.label}_calibration.pdf" + ) for key in calibration_prior: self.result.posterior[key] = calibration_prior[key].sample(100) self.result.plot_calibration_posterior(format="pdf") @@ -96,20 +106,31 @@ class TestCBCResult(unittest.TestCase): def test_waveform_plotting_png(self): self.result.plot_waveform_posterior(n_samples=200) for ifo in self.result.interferometers: - self.assertTrue(os.path.exists( - f"{self.result.outdir}/{self.result.label}_{ifo}_waveform.png") + self.assertTrue( + os.path.exists( + f"{self.result.outdir}/{self.result.label}_{ifo}_waveform.png" + ) ) def test_plot_skymap_meta_data(self): from ligo.skymap import io + expected_keys = { - "HISTORY", "build_date", "creator", "distmean", "diststd", - "gps_creation_time", "gps_time", "nest", "objid", "origin", - "vcs_revision", "vcs_version", "instruments" + "HISTORY", + "build_date", + "creator", + "distmean", + "diststd", + "gps_creation_time", + "gps_time", + "nest", + "objid", + "origin", + "vcs_revision", + "vcs_version", + "instruments", } - self.result.plot_skymap( - maxpts=50, geo=False, objid="test", instruments="H1L1" - ) + self.result.plot_skymap(maxpts=50, geo=False, objid="test", instruments="H1L1") fits_filename = f"{self.result.outdir}/{self.result.label}_skymap.fits" skymap_filename = f"{self.result.outdir}/{self.result.label}_skymap.png" pickle_filename = f"{self.result.outdir}/{self.result.label}_skypost.obj" @@ -118,10 +139,14 @@ class TestCBCResult(unittest.TestCase): self.assertTrue(os.path.exists(skymap_filename)) self.assertTrue(os.path.exists(pickle_filename)) self.result.plot_skymap( - maxpts=50, geo=False, objid="test", instruments="H1L1", - load_pickle=True, colorbar=True + maxpts=50, + geo=False, + objid="test", + instruments="H1L1", + load_pickle=True, + colorbar=True, ) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/test/gw_prior_test.py b/test/gw_prior_test.py index 28bbaf1da3b6beb9e17564d847ede0072720f965..fb45d589ad35b6c44d73c13f1bdd0c5f65e9183f 100644 --- a/test/gw_prior_test.py +++ b/test/gw_prior_test.py @@ -18,14 +18,15 @@ from bilby.gw import conversion class TestBBHPriorDict(unittest.TestCase): - def setUp(self): self.prior_dict = dict() - self.base_directory =\ - '/'.join(os.path.dirname( - os.path.abspath(sys.argv[0])).split('/')[:-1]) - self.filename = os.path.join(os.path.dirname(os.path.realpath(__file__)), - 'prior_files/binary_black_holes.prior') + self.base_directory = "/".join( + os.path.dirname(os.path.abspath(sys.argv[0])).split("/")[:-1] + ) + self.filename = os.path.join( + os.path.dirname(os.path.realpath(__file__)), + "prior_files/binary_black_holes.prior", + ) self.bbh_prior_dict = bilby.gw.prior.BBHPriorDict(filename=self.filename) for key, value in self.bbh_prior_dict.items(): self.prior_dict[key] = value @@ -38,14 +39,30 @@ class TestBBHPriorDict(unittest.TestCase): def test_create_default_prior(self): default = bilby.gw.prior.BBHPriorDict() - minima = all([self.bbh_prior_dict[key].minimum == default[key].minimum - for key in default.keys()]) - maxima = all([self.bbh_prior_dict[key].maximum == default[key].maximum - for key in default.keys()]) - names = all([self.bbh_prior_dict[key].name == default[key].name - for key in default.keys()]) - boundaries = all([self.bbh_prior_dict[key].boundary == default[key].boundary - for key in default.keys()]) + minima = all( + [ + self.bbh_prior_dict[key].minimum == default[key].minimum + for key in default.keys() + ] + ) + maxima = all( + [ + self.bbh_prior_dict[key].maximum == default[key].maximum + for key in default.keys() + ] + ) + names = all( + [ + self.bbh_prior_dict[key].name == default[key].name + for key in default.keys() + ] + ) + boundaries = all( + [ + self.bbh_prior_dict[key].boundary == default[key].boundary + for key in default.keys() + ] + ) self.assertTrue(all([minima, maxima, names, boundaries])) @@ -55,71 +72,101 @@ class TestBBHPriorDict(unittest.TestCase): self.assertEqual(self.bbh_prior_dict[key], new_dict[key]) def test_redundant_priors_not_in_dict_before(self): - for prior in ['chirp_mass', 'total_mass', 'mass_ratio', 'symmetric_mass_ratio', - 'cos_tilt_1', 'cos_tilt_2', 'phi_1', 'phi_2', 'cos_theta_jn', - 'comoving_distance', 'redshift']: + for prior in [ + "chirp_mass", + "total_mass", + "mass_ratio", + "symmetric_mass_ratio", + "cos_tilt_1", + "cos_tilt_2", + "phi_1", + "phi_2", + "cos_theta_jn", + "comoving_distance", + "redshift", + ]: self.assertTrue(self.bbh_prior_dict.test_redundancy(prior)) def test_redundant_priors_already_in_dict(self): - for prior in ['mass_1', 'mass_2', 'tilt_1', 'tilt_2', - 'phi_1', 'phi_2', 'theta_jn', 'luminosity_distance']: + for prior in [ + "mass_1", + "mass_2", + "tilt_1", + "tilt_2", + "phi_1", + "phi_2", + "theta_jn", + "luminosity_distance", + ]: self.assertTrue(self.bbh_prior_dict.test_redundancy(prior)) def test_correct_not_redundant_priors_masses(self): - del self.bbh_prior_dict['mass_2'] - for prior in ['mass_2', 'chirp_mass', 'total_mass', 'symmetric_mass_ratio']: + del self.bbh_prior_dict["mass_2"] + for prior in ["mass_2", "chirp_mass", "total_mass", "symmetric_mass_ratio"]: self.assertFalse(self.bbh_prior_dict.test_redundancy(prior)) def test_correct_not_redundant_priors_spin_magnitudes(self): - del self.bbh_prior_dict['a_2'] - self.assertFalse(self.bbh_prior_dict.test_redundancy('a_2')) + del self.bbh_prior_dict["a_2"] + self.assertFalse(self.bbh_prior_dict.test_redundancy("a_2")) def test_correct_not_redundant_priors_spin_tilt_1(self): - del self.bbh_prior_dict['tilt_1'] - for prior in ['tilt_1', 'cos_tilt_1']: + del self.bbh_prior_dict["tilt_1"] + for prior in ["tilt_1", "cos_tilt_1"]: self.assertFalse(self.bbh_prior_dict.test_redundancy(prior)) def test_correct_not_redundant_priors_spin_tilt_2(self): - del self.bbh_prior_dict['tilt_2'] - for prior in ['tilt_2', 'cos_tilt_2']: + del self.bbh_prior_dict["tilt_2"] + for prior in ["tilt_2", "cos_tilt_2"]: self.assertFalse(self.bbh_prior_dict.test_redundancy(prior)) def test_correct_not_redundant_priors_spin_azimuth(self): - del self.bbh_prior_dict['phi_12'] - for prior in ['phi_1', 'phi_2', 'phi_12']: + del self.bbh_prior_dict["phi_12"] + for prior in ["phi_1", "phi_2", "phi_12"]: self.assertFalse(self.bbh_prior_dict.test_redundancy(prior)) def test_correct_not_redundant_priors_inclination(self): - del self.bbh_prior_dict['theta_jn'] - for prior in ['theta_jn', 'cos_theta_jn']: + del self.bbh_prior_dict["theta_jn"] + for prior in ["theta_jn", "cos_theta_jn"]: self.assertFalse(self.bbh_prior_dict.test_redundancy(prior)) def test_correct_not_redundant_priors_distance(self): - del self.bbh_prior_dict['luminosity_distance'] - for prior in ['luminosity_distance', 'comoving_distance', - 'redshift']: + del self.bbh_prior_dict["luminosity_distance"] + for prior in ["luminosity_distance", "comoving_distance", "redshift"]: self.assertFalse(self.bbh_prior_dict.test_redundancy(prior)) def test_add_unrelated_prior(self): - self.assertFalse(self.bbh_prior_dict.test_redundancy('abc')) + self.assertFalse(self.bbh_prior_dict.test_redundancy("abc")) def test_test_has_redundant_priors(self): self.assertFalse(self.bbh_prior_dict.test_has_redundant_keys()) - for prior in ['chirp_mass', 'total_mass', 'mass_ratio', 'symmetric_mass_ratio', - 'cos_tilt_1', 'cos_tilt_2', 'phi_1', 'phi_2', 'cos_theta_jn', - 'comoving_distance', 'redshift']: + for prior in [ + "chirp_mass", + "total_mass", + "mass_ratio", + "symmetric_mass_ratio", + "cos_tilt_1", + "cos_tilt_2", + "phi_1", + "phi_2", + "cos_theta_jn", + "comoving_distance", + "redshift", + ]: self.bbh_prior_dict[prior] = 0 self.assertTrue(self.bbh_prior_dict.test_has_redundant_keys()) del self.bbh_prior_dict[prior] def test_add_constraint_prior_not_redundant(self): - self.bbh_prior_dict['chirp_mass'] = bilby.prior.Constraint( - minimum=20, maximum=40, name='chirp_mass') + self.bbh_prior_dict["chirp_mass"] = bilby.prior.Constraint( + minimum=20, maximum=40, name="chirp_mass" + ) self.assertFalse(self.bbh_prior_dict.test_has_redundant_keys()) def test_pickle_prior(self): - priors = dict(chirp_mass=bilby.core.prior.Uniform(10, 20), - mass_ratio=bilby.core.prior.Uniform(0.125, 1)) + priors = dict( + chirp_mass=bilby.core.prior.Uniform(10, 20), + mass_ratio=bilby.core.prior.Uniform(0.125, 1), + ) priors = bilby.gw.prior.BBHPriorDict(priors) with open("test.pickle", "wb") as file: pickle.dump(priors, file) @@ -129,29 +176,43 @@ class TestBBHPriorDict(unittest.TestCase): class TestPriorConversion(unittest.TestCase): - def test_bilby_to_lalinference(self): mass_1 = [1, 20] mass_2 = [1, 20] chirp_mass = [1, 5] mass_ratio = [0.125, 1] - bilby_prior = BBHPriorDict(dictionary=dict( - chirp_mass=Uniform(name='chirp_mass', minimum=chirp_mass[0], maximum=chirp_mass[1]), - mass_ratio=Uniform(name='mass_ratio', minimum=mass_ratio[0], maximum=mass_ratio[1]), - mass_2=Constraint(name='mass_2', minimum=mass_1[0], maximum=mass_1[1]), - mass_1=Constraint(name='mass_1', minimum=mass_2[0], maximum=mass_2[1]))) - - lalinf_prior = BBHPriorDict(dictionary=dict( - mass_ratio=Constraint(name='mass_ratio', minimum=mass_ratio[0], maximum=mass_ratio[1]), - chirp_mass=Constraint(name='chirp_mass', minimum=chirp_mass[0], maximum=chirp_mass[1]), - mass_2=Uniform(name='mass_2', minimum=mass_1[0], maximum=mass_1[1]), - mass_1=Uniform(name='mass_1', minimum=mass_2[0], maximum=mass_2[1]))) + bilby_prior = BBHPriorDict( + dictionary=dict( + chirp_mass=Uniform( + name="chirp_mass", minimum=chirp_mass[0], maximum=chirp_mass[1] + ), + mass_ratio=Uniform( + name="mass_ratio", minimum=mass_ratio[0], maximum=mass_ratio[1] + ), + mass_2=Constraint(name="mass_2", minimum=mass_1[0], maximum=mass_1[1]), + mass_1=Constraint(name="mass_1", minimum=mass_2[0], maximum=mass_2[1]), + ) + ) + + lalinf_prior = BBHPriorDict( + dictionary=dict( + mass_ratio=Constraint( + name="mass_ratio", minimum=mass_ratio[0], maximum=mass_ratio[1] + ), + chirp_mass=Constraint( + name="chirp_mass", minimum=chirp_mass[0], maximum=chirp_mass[1] + ), + mass_2=Uniform(name="mass_2", minimum=mass_1[0], maximum=mass_1[1]), + mass_1=Uniform(name="mass_1", minimum=mass_2[0], maximum=mass_2[1]), + ) + ) nsamples = 5000 bilby_samples = bilby_prior.sample(nsamples) bilby_samples, _ = conversion.convert_to_lal_binary_black_hole_parameters( - bilby_samples) + bilby_samples + ) # Quicker way to generate LA prior samples (rather than specifying Constraint) lalinf_samples = [] @@ -162,7 +223,9 @@ class TestPriorConversion(unittest.TestCase): if s["mass_2"] / s["mass_1"] > 0.125: lalinf_samples.append(s) lalinf_samples = pd.DataFrame(lalinf_samples) - lalinf_samples["mass_ratio"] = lalinf_samples["mass_2"] / lalinf_samples["mass_1"] + lalinf_samples["mass_ratio"] = ( + lalinf_samples["mass_2"] / lalinf_samples["mass_1"] + ) # Construct fake result object result = bilby.core.result.Result() @@ -170,12 +233,19 @@ class TestPriorConversion(unittest.TestCase): result.meta_data = dict() result.priors = bilby_prior result.posterior = pd.DataFrame(bilby_samples) - result_converted = bilby.gw.prior.convert_to_flat_in_component_mass_prior(result) + result_converted = bilby.gw.prior.convert_to_flat_in_component_mass_prior( + result + ) if "plot" in sys.argv: # Useful for debugging plt.hist(bilby_samples["mass_ratio"], bins=50, density=True, alpha=0.5) - plt.hist(result_converted.posterior["mass_ratio"], bins=50, density=True, alpha=0.5) + plt.hist( + result_converted.posterior["mass_ratio"], + bins=50, + density=True, + alpha=0.5, + ) plt.hist(lalinf_samples["mass_ratio"], bins=50, alpha=0.5, density=True) plt.show() @@ -185,7 +255,9 @@ class TestPriorConversion(unittest.TestCase): self.assertFalse(ks.pvalue > 0.05) # Check that the non-reweighted posteriors pass a KS test - ks = ks_2samp(result_converted.posterior["mass_ratio"], lalinf_samples["mass_ratio"]) + ks = ks_2samp( + result_converted.posterior["mass_ratio"], lalinf_samples["mass_ratio"] + ) print("Reweighted KS test = ", ks) self.assertTrue(ks.pvalue > 0.001) @@ -194,37 +266,38 @@ class TestPackagedPriors(unittest.TestCase): """ Test that the prepackaged priors load """ def test_aligned(self): - filename = 'aligned_spin_binary_black_holes.prior' + filename = "aligned_spin_binary_black_holes.prior" prior_dict = bilby.gw.prior.BBHPriorDict(filename=filename) - self.assertTrue('chi_1' in prior_dict) - self.assertTrue('chi_2' in prior_dict) + self.assertTrue("chi_1" in prior_dict) + self.assertTrue("chi_2" in prior_dict) def test_precessing(self): - filename = 'precessing_binary_neutron_stars.prior' + filename = "precessing_binary_neutron_stars.prior" prior_dict = bilby.gw.prior.BBHPriorDict(filename=filename) - self.assertTrue('lambda_1' in prior_dict) - self.assertTrue('lambda_2' in prior_dict) + self.assertTrue("lambda_1" in prior_dict) + self.assertTrue("lambda_2" in prior_dict) def test_binary_black_holes(self): - filename = 'binary_black_holes.prior' + filename = "binary_black_holes.prior" prior_dict = bilby.gw.prior.BBHPriorDict(filename=filename) - self.assertTrue('a_1' in prior_dict) + self.assertTrue("a_1" in prior_dict) def test_binary_neutron_stars(self): - filename = 'binary_neutron_stars.prior' + filename = "binary_neutron_stars.prior" prior_dict = bilby.gw.prior.BNSPriorDict(filename=filename) - self.assertTrue('lambda_1' in prior_dict) + self.assertTrue("lambda_1" in prior_dict) class TestBNSPriorDict(unittest.TestCase): - def setUp(self): self.prior_dict = OrderedDict() - self.base_directory =\ - '/'.join(os.path.dirname( - os.path.abspath(sys.argv[0])).split('/')[:-1]) - self.filename = os.path.join(os.path.dirname(os.path.realpath(__file__)), - 'prior_files/binary_neutron_stars.prior') + self.base_directory = "/".join( + os.path.dirname(os.path.abspath(sys.argv[0])).split("/")[:-1] + ) + self.filename = os.path.join( + os.path.dirname(os.path.realpath(__file__)), + "prior_files/binary_neutron_stars.prior", + ) self.bns_prior_dict = bilby.gw.prior.BNSPriorDict(filename=self.filename) for key, value in self.bns_prior_dict.items(): self.prior_dict[key] = value @@ -237,14 +310,30 @@ class TestBNSPriorDict(unittest.TestCase): def test_create_default_prior(self): default = bilby.gw.prior.BNSPriorDict() - minima = all([self.bns_prior_dict[key].minimum == default[key].minimum - for key in default.keys()]) - maxima = all([self.bns_prior_dict[key].maximum == default[key].maximum - for key in default.keys()]) - names = all([self.bns_prior_dict[key].name == default[key].name - for key in default.keys()]) - boundaries = all([self.bns_prior_dict[key].boundary == default[key].boundary - for key in default.keys()]) + minima = all( + [ + self.bns_prior_dict[key].minimum == default[key].minimum + for key in default.keys() + ] + ) + maxima = all( + [ + self.bns_prior_dict[key].maximum == default[key].maximum + for key in default.keys() + ] + ) + names = all( + [ + self.bns_prior_dict[key].name == default[key].name + for key in default.keys() + ] + ) + boundaries = all( + [ + self.bns_prior_dict[key].boundary == default[key].boundary + for key in default.keys() + ] + ) self.assertTrue(all([minima, maxima, names, boundaries])) @@ -253,61 +342,82 @@ class TestBNSPriorDict(unittest.TestCase): self.assertDictEqual(self.bns_prior_dict, new_dict) def test_redundant_priors_not_in_dict_before(self): - for prior in ['chirp_mass', 'total_mass', 'mass_ratio', - 'symmetric_mass_ratio', 'cos_theta_jn', 'comoving_distance', - 'redshift', 'lambda_tilde', 'delta_lambda_tilde']: + for prior in [ + "chirp_mass", + "total_mass", + "mass_ratio", + "symmetric_mass_ratio", + "cos_theta_jn", + "comoving_distance", + "redshift", + "lambda_tilde", + "delta_lambda_tilde", + ]: self.assertTrue(self.bns_prior_dict.test_redundancy(prior)) def test_redundant_priors_already_in_dict(self): - for prior in ['mass_1', 'mass_2', 'chi_1', 'chi_2', - 'theta_jn', 'luminosity_distance', - 'lambda_1', 'lambda_2']: + for prior in [ + "mass_1", + "mass_2", + "chi_1", + "chi_2", + "theta_jn", + "luminosity_distance", + "lambda_1", + "lambda_2", + ]: self.assertTrue(self.bns_prior_dict.test_redundancy(prior)) def test_correct_not_redundant_priors_masses(self): - del self.bns_prior_dict['mass_2'] - for prior in ['mass_2', 'chirp_mass', 'total_mass', 'symmetric_mass_ratio']: + del self.bns_prior_dict["mass_2"] + for prior in ["mass_2", "chirp_mass", "total_mass", "symmetric_mass_ratio"]: self.assertFalse(self.bns_prior_dict.test_redundancy(prior)) def test_correct_not_redundant_priors_spin_magnitudes(self): - del self.bns_prior_dict['chi_2'] - self.assertFalse(self.bns_prior_dict.test_redundancy('chi_2')) + del self.bns_prior_dict["chi_2"] + self.assertFalse(self.bns_prior_dict.test_redundancy("chi_2")) def test_correct_not_redundant_priors_inclination(self): - del self.bns_prior_dict['theta_jn'] - for prior in ['theta_jn', 'cos_theta_jn']: + del self.bns_prior_dict["theta_jn"] + for prior in ["theta_jn", "cos_theta_jn"]: self.assertFalse(self.bns_prior_dict.test_redundancy(prior)) def test_correct_not_redundant_priors_distance(self): - del self.bns_prior_dict['luminosity_distance'] - for prior in ['luminosity_distance', 'comoving_distance', - 'redshift']: + del self.bns_prior_dict["luminosity_distance"] + for prior in ["luminosity_distance", "comoving_distance", "redshift"]: self.assertFalse(self.bns_prior_dict.test_redundancy(prior)) def test_correct_not_redundant_priors_tidal(self): - del self.bns_prior_dict['lambda_1'] - for prior in['lambda_1', 'lambda_tilde', 'delta_lambda_tilde']: + del self.bns_prior_dict["lambda_1"] + for prior in ["lambda_1", "lambda_tilde", "delta_lambda_tilde"]: self.assertFalse(self.bns_prior_dict.test_redundancy(prior)) def test_add_unrelated_prior(self): - self.assertFalse(self.bns_prior_dict.test_redundancy('abc')) + self.assertFalse(self.bns_prior_dict.test_redundancy("abc")) def test_test_has_redundant_priors(self): self.assertFalse(self.bns_prior_dict.test_has_redundant_keys()) - for prior in ['chirp_mass', 'total_mass', 'mass_ratio', 'symmetric_mass_ratio', - 'cos_theta_jn', 'comoving_distance', 'redshift']: + for prior in [ + "chirp_mass", + "total_mass", + "mass_ratio", + "symmetric_mass_ratio", + "cos_theta_jn", + "comoving_distance", + "redshift", + ]: self.bns_prior_dict[prior] = 0 self.assertTrue(self.bns_prior_dict.test_has_redundant_keys()) del self.bns_prior_dict[prior] def test_add_constraint_prior_not_redundant(self): - self.bns_prior_dict['chirp_mass'] = bilby.prior.Constraint( - minimum=1, maximum=2, name='chirp_mass') + self.bns_prior_dict["chirp_mass"] = bilby.prior.Constraint( + minimum=1, maximum=2, name="chirp_mass" + ) self.assertFalse(self.bns_prior_dict.test_has_redundant_keys()) class TestCalibrationPrior(unittest.TestCase): - def setUp(self): self.minimum_frequency = 20 self.maximum_frequency = 1024 @@ -317,81 +427,92 @@ class TestCalibrationPrior(unittest.TestCase): amplitude_sigma = 0.1 phase_sigma = 0.1 n_nodes = 9 - label = 'test' + label = "test" test = bilby.gw.prior.CalibrationPriorDict.constant_uncertainty_spline( - amplitude_sigma, phase_sigma, self.minimum_frequency, - self.maximum_frequency, n_nodes, label) + amplitude_sigma, + phase_sigma, + self.minimum_frequency, + self.maximum_frequency, + n_nodes, + label, + ) self.assertEqual(len(test), n_nodes * 3) class TestUniformComovingVolumePrior(unittest.TestCase): - def setUp(self): pass def test_minimum(self): prior = bilby.gw.prior.UniformComovingVolume( - minimum=10, maximum=10000, name='luminosity_distance') + minimum=10, maximum=10000, name="luminosity_distance" + ) self.assertEqual(prior.minimum, 10) def test_maximum(self): prior = bilby.gw.prior.UniformComovingVolume( - minimum=10, maximum=10000, name='luminosity_distance') + minimum=10, maximum=10000, name="luminosity_distance" + ) self.assertEqual(prior.maximum, 10000) def test_zero_minimum_works(self): prior = bilby.gw.prior.UniformComovingVolume( - minimum=0, maximum=10000, name='luminosity_distance') + minimum=0, maximum=10000, name="luminosity_distance" + ) self.assertEqual(prior.minimum, 0) def test_specify_cosmology(self): prior = bilby.gw.prior.UniformComovingVolume( - minimum=10, maximum=10000, name='luminosity_distance', - cosmology='Planck13') + minimum=10, maximum=10000, name="luminosity_distance", cosmology="Planck13" + ) self.assertEqual(repr(prior.cosmology), repr(cosmology.Planck13)) def test_comoving_prior_creation(self): prior = bilby.gw.prior.UniformComovingVolume( - minimum=10, maximum=1000, name='comoving_distance') - self.assertEqual(prior.latex_label, '$d_C$') + minimum=10, maximum=1000, name="comoving_distance" + ) + self.assertEqual(prior.latex_label, "$d_C$") def test_redshift_prior_creation(self): prior = bilby.gw.prior.UniformComovingVolume( - minimum=0.1, maximum=1, name='redshift') - self.assertEqual(prior.latex_label, '$z$') + minimum=0.1, maximum=1, name="redshift" + ) + self.assertEqual(prior.latex_label, "$z$") def test_redshift_to_luminosity_distance(self): prior = bilby.gw.prior.UniformComovingVolume( - minimum=0.1, maximum=1, name='redshift') - new_prior = prior.get_corresponding_prior('luminosity_distance') - self.assertEqual(new_prior.name, 'luminosity_distance') + minimum=0.1, maximum=1, name="redshift" + ) + new_prior = prior.get_corresponding_prior("luminosity_distance") + self.assertEqual(new_prior.name, "luminosity_distance") def test_luminosity_distance_to_redshift(self): prior = bilby.gw.prior.UniformComovingVolume( - minimum=10, maximum=10000, name='luminosity_distance') - new_prior = prior.get_corresponding_prior('redshift') - self.assertEqual(new_prior.name, 'redshift') + minimum=10, maximum=10000, name="luminosity_distance" + ) + new_prior = prior.get_corresponding_prior("redshift") + self.assertEqual(new_prior.name, "redshift") def test_luminosity_distance_to_comoving_distance(self): prior = bilby.gw.prior.UniformComovingVolume( - minimum=10, maximum=10000, name='luminosity_distance') - new_prior = prior.get_corresponding_prior('comoving_distance') - self.assertEqual(new_prior.name, 'comoving_distance') + minimum=10, maximum=10000, name="luminosity_distance" + ) + new_prior = prior.get_corresponding_prior("comoving_distance") + self.assertEqual(new_prior.name, "comoving_distance") class TestAlignedSpin(unittest.TestCase): - def setUp(self): pass def test_default_prior_matches_analytic(self): prior = bilby.gw.prior.AlignedSpin() chis = np.linspace(-1, 1, 20) - analytic = - np.log(np.abs(chis)) / 2 + analytic = -np.log(np.abs(chis)) / 2 max_difference = max(abs(analytic - prior.prob(chis))) self.assertAlmostEqual(max_difference, 0, 2) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/test/gw_result_test.py b/test/gw_result_test.py index 4c6c64fac62bea842a72ed942c4e80586c79dc95..12b30cd21de10cc28e6d7f47734d84d84b6d827c 100644 --- a/test/gw_result_test.py +++ b/test/gw_result_test.py @@ -8,11 +8,10 @@ import bilby class TestCBCResult(unittest.TestCase): - def setUp(self): bilby.utils.command_line_args.bilby_test_mode = False priors = bilby.gw.prior.BBHPriorDict() - priors['geocent_time'] = 2 + priors["geocent_time"] = 2 injection_parameters = priors.sample() self.meta_data = dict( likelihood=dict( @@ -21,11 +20,12 @@ class TestCBCResult(unittest.TestCase): time_marginalization=True, frequency_domain_source_model=bilby.gw.source.lal_binary_black_hole, waveform_arguments=dict( - reference_frequency=20.0, - waveform_approximant='IMRPhenomPv2'), + reference_frequency=20.0, waveform_approximant="IMRPhenomPv2" + ), interferometers=dict( H1=dict(optimal_SNR=1, parameters=injection_parameters), - L1=dict(optimal_SNR=1, parameters=injection_parameters)), + L1=dict(optimal_SNR=1, parameters=injection_parameters), + ), sampling_frequency=4096, duration=4, start_time=0, @@ -34,12 +34,16 @@ class TestCBCResult(unittest.TestCase): ) ) self.result = bilby.gw.result.CBCResult( - label='label', outdir='outdir', sampler='nestle', - search_parameter_keys=list(priors.keys()), fixed_parameter_keys=list(), - priors=priors, sampler_kwargs=dict(test='test', func=lambda x: x), + label="label", + outdir="outdir", + sampler="nestle", + search_parameter_keys=list(priors.keys()), + fixed_parameter_keys=list(), + priors=priors, + sampler_kwargs=dict(test="test", func=lambda x: x), injection_parameters=injection_parameters, meta_data=self.meta_data, - posterior=pd.DataFrame(priors.sample(100)) + posterior=pd.DataFrame(priors.sample(100)), ) if not os.path.isdir(self.result.outdir): os.mkdir(self.result.outdir) @@ -57,133 +61,147 @@ class TestCBCResult(unittest.TestCase): def test_phase_marginalization(self): self.assertEqual( self.result.phase_marginalization, - self.meta_data['likelihood']['phase_marginalization']) + self.meta_data["likelihood"]["phase_marginalization"], + ) def test_phase_marginalization_unset(self): - self.result.meta_data['likelihood'].pop('phase_marginalization') + self.result.meta_data["likelihood"].pop("phase_marginalization") with self.assertRaises(AttributeError): self.result.phase_marginalization def test_time_marginalization(self): self.assertEqual( self.result.time_marginalization, - self.meta_data['likelihood']['time_marginalization']) + self.meta_data["likelihood"]["time_marginalization"], + ) def test_time_marginalization_unset(self): - self.result.meta_data['likelihood'].pop('time_marginalization') + self.result.meta_data["likelihood"].pop("time_marginalization") with self.assertRaises(AttributeError): self.result.time_marginalization def test_distance_marginalization(self): self.assertEqual( self.result.distance_marginalization, - self.meta_data['likelihood']['distance_marginalization']) + self.meta_data["likelihood"]["distance_marginalization"], + ) def test_distance_marginalization_unset(self): - self.result.meta_data['likelihood'].pop('distance_marginalization') + self.result.meta_data["likelihood"].pop("distance_marginalization") with self.assertRaises(AttributeError): self.result.distance_marginalization def test_reference_frequency(self): self.assertEqual( self.result.reference_frequency, - self.meta_data['likelihood']['waveform_arguments']['reference_frequency']) + self.meta_data["likelihood"]["waveform_arguments"]["reference_frequency"], + ) def test_reference_frequency_unset(self): - self.result.meta_data['likelihood']['waveform_arguments'].pop('reference_frequency') + self.result.meta_data["likelihood"]["waveform_arguments"].pop( + "reference_frequency" + ) with self.assertRaises(AttributeError): self.result.reference_frequency def test_sampling_frequency(self): self.assertEqual( self.result.sampling_frequency, - self.meta_data['likelihood']['sampling_frequency']) + self.meta_data["likelihood"]["sampling_frequency"], + ) def test_sampling_frequency_unset(self): - self.result.meta_data['likelihood'].pop('sampling_frequency') + self.result.meta_data["likelihood"].pop("sampling_frequency") with self.assertRaises(AttributeError): self.result.sampling_frequency def test_duration(self): - self.assertEqual( - self.result.duration, - self.meta_data['likelihood']['duration']) + self.assertEqual(self.result.duration, self.meta_data["likelihood"]["duration"]) def test_duration_unset(self): - self.result.meta_data['likelihood'].pop('duration') + self.result.meta_data["likelihood"].pop("duration") with self.assertRaises(AttributeError): self.result.duration def test_start_time(self): self.assertEqual( - self.result.start_time, - self.meta_data['likelihood']['start_time']) + self.result.start_time, self.meta_data["likelihood"]["start_time"] + ) def test_start_time_unset(self): - self.result.meta_data['likelihood'].pop('start_time') + self.result.meta_data["likelihood"].pop("start_time") with self.assertRaises(AttributeError): self.result.start_time def test_waveform_approximant(self): self.assertEqual( self.result.waveform_approximant, - self.meta_data['likelihood']['waveform_arguments']['waveform_approximant']) + self.meta_data["likelihood"]["waveform_arguments"]["waveform_approximant"], + ) def test_waveform_approximant_unset(self): - self.result.meta_data['likelihood']['waveform_arguments'].pop('waveform_approximant') + self.result.meta_data["likelihood"]["waveform_arguments"].pop( + "waveform_approximant" + ) with self.assertRaises(AttributeError): self.result.waveform_approximant def test_waveform_arguments(self): self.assertEqual( self.result.waveform_arguments, - self.meta_data['likelihood']['waveform_arguments']) + self.meta_data["likelihood"]["waveform_arguments"], + ) def test_frequency_domain_source_model(self): self.assertEqual( self.result.frequency_domain_source_model, - self.meta_data['likelihood']['frequency_domain_source_model']) + self.meta_data["likelihood"]["frequency_domain_source_model"], + ) def test_frequency_domain_source_model_unset(self): - self.result.meta_data['likelihood'].pop('frequency_domain_source_model') + self.result.meta_data["likelihood"].pop("frequency_domain_source_model") with self.assertRaises(AttributeError): self.result.frequency_domain_source_model def test_parameter_conversion(self): self.assertEqual( self.result.parameter_conversion, - self.meta_data['likelihood']['parameter_conversion']) + self.meta_data["likelihood"]["parameter_conversion"], + ) def test_parameter_conversion_unset(self): - self.result.meta_data['likelihood'].pop('parameter_conversion') + self.result.meta_data["likelihood"].pop("parameter_conversion") with self.assertRaises(AttributeError): self.result.parameter_conversion def test_waveform_generator_class(self): self.assertEqual( self.result.waveform_generator_class, - self.meta_data['likelihood']['waveform_generator_class']) + self.meta_data["likelihood"]["waveform_generator_class"], + ) def test_waveform_generator_class_unset(self): - self.result.meta_data['likelihood'].pop('waveform_generator_class') + self.result.meta_data["likelihood"].pop("waveform_generator_class") with self.assertRaises(AttributeError): self.result.waveform_generator_class def test_interferometer_names(self): self.assertEqual( self.result.interferometers, - [name for name in self.meta_data['likelihood']['interferometers']]) + [name for name in self.meta_data["likelihood"]["interferometers"]], + ) def test_detector_injection_properties(self): self.assertEqual( - self.result.detector_injection_properties('H1'), - self.meta_data['likelihood']['interferometers']['H1']) + self.result.detector_injection_properties("H1"), + self.meta_data["likelihood"]["interferometers"]["H1"], + ) def test_detector_injection_properties_no_injection(self): self.assertEqual( - self.result.detector_injection_properties('not_a_detector'), - None) + self.result.detector_injection_properties("not_a_detector"), None + ) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/test/gw_source_test.py b/test/gw_source_test.py index 697616fa9c5758e8611c441d1a402c60e463af3d..93af82450c2e21c5dacba696e0ef9dcb5f1fd0de 100644 --- a/test/gw_source_test.py +++ b/test/gw_source_test.py @@ -8,19 +8,30 @@ import bilby class TestLalBBH(unittest.TestCase): - def setUp(self): self.parameters = dict( - mass_1=30.0, mass_2=30.0, luminosity_distance=400.0, a_1=0.4, - tilt_1=0.2, phi_12=1.0, a_2=0.8, tilt_2=2.7, phi_jl=2.9, - theta_jn=0.3, phase=0.0) + mass_1=30.0, + mass_2=30.0, + luminosity_distance=400.0, + a_1=0.4, + tilt_1=0.2, + phi_12=1.0, + a_2=0.8, + tilt_2=2.7, + phi_jl=2.9, + theta_jn=0.3, + phase=0.0, + ) self.waveform_kwargs = dict( - waveform_approximant='IMRPhenomPv2', reference_frequency=50.0, - minimum_frequency=20.0, catch_waveform_errors=True) + waveform_approximant="IMRPhenomPv2", + reference_frequency=50.0, + minimum_frequency=20.0, + catch_waveform_errors=True, + ) self.frequency_array = bilby.core.utils.create_frequency_series(2048, 4) self.bad_parameters = copy(self.parameters) - self.bad_parameters['mass_1'] = -30. - + self.bad_parameters["mass_1"] = -30.0 + def tearDown(self): del self.parameters del self.waveform_kwargs @@ -31,25 +42,35 @@ class TestLalBBH(unittest.TestCase): self.parameters.update(self.waveform_kwargs) self.assertIsInstance( bilby.gw.source.lal_binary_black_hole( - self.frequency_array, **self.parameters), dict) + self.frequency_array, **self.parameters + ), + dict, + ) def test_waveform_error_catching(self): self.bad_parameters.update(self.waveform_kwargs) - self.assertIsNone(bilby.gw.source.lal_binary_black_hole( - self.frequency_array, **self.bad_parameters)) + self.assertIsNone( + bilby.gw.source.lal_binary_black_hole( + self.frequency_array, **self.bad_parameters + ) + ) def test_waveform_error_raising(self): raise_error_parameters = copy(self.bad_parameters) raise_error_parameters.update(self.waveform_kwargs) - raise_error_parameters['catch_waveform_errors']=False + raise_error_parameters["catch_waveform_errors"] = False with self.assertRaises(Exception): bilby.gw.source.lal_binary_black_hole( - self.frequency_array, **raise_error_parameters) + self.frequency_array, **raise_error_parameters + ) def test_lal_bbh_works_without_waveform_parameters(self): self.assertIsInstance( bilby.gw.source.lal_binary_black_hole( - self.frequency_array, **self.parameters), dict) + self.frequency_array, **self.parameters + ), + dict, + ) # Removed due to issue with SimInspiralFD - see https://git.ligo.org/lscsoft/lalsuite/issues/153 # def test_lal_bbh_works_with_time_domain_approximant(self): @@ -61,15 +82,27 @@ class TestLalBBH(unittest.TestCase): class TestLalBNS(unittest.TestCase): - def setUp(self): self.parameters = dict( - mass_1=1.4, mass_2=1.4, luminosity_distance=400.0, a_1=0.4, - a_2=0.3, tilt_1=0.2, tilt_2=1.7, phi_jl=0.2, phi_12=0.9, - theta_jn=1.7, phase=0.0, lambda_1=100.0, lambda_2=100.0) + mass_1=1.4, + mass_2=1.4, + luminosity_distance=400.0, + a_1=0.4, + a_2=0.3, + tilt_1=0.2, + tilt_2=1.7, + phi_jl=0.2, + phi_12=0.9, + theta_jn=1.7, + phase=0.0, + lambda_1=100.0, + lambda_2=100.0, + ) self.waveform_kwargs = dict( - waveform_approximant='IMRPhenomPv2_NRTidal', - reference_frequency=50.0, minimum_frequency=20.0) + waveform_approximant="IMRPhenomPv2_NRTidal", + reference_frequency=50.0, + minimum_frequency=20.0, + ) self.frequency_array = bilby.core.utils.create_frequency_series(2048, 4) def tearDown(self): @@ -81,31 +114,44 @@ class TestLalBNS(unittest.TestCase): self.parameters.update(self.waveform_kwargs) self.assertIsInstance( bilby.gw.source.lal_binary_neutron_star( - self.frequency_array, **self.parameters), dict) + self.frequency_array, **self.parameters + ), + dict, + ) def test_lal_bns_works_without_waveform_parameters(self): self.assertIsInstance( bilby.gw.source.lal_binary_neutron_star( - self.frequency_array, **self.parameters), dict) + self.frequency_array, **self.parameters + ), + dict, + ) def test_fails_without_tidal_parameters(self): - self.parameters.pop('lambda_1') - self.parameters.pop('lambda_2') + self.parameters.pop("lambda_1") + self.parameters.pop("lambda_2") self.parameters.update(self.waveform_kwargs) with self.assertRaises(TypeError): bilby.gw.source.lal_binary_neutron_star( - self.frequency_array, **self.parameters) + self.frequency_array, **self.parameters + ) class TestEccentricLalBBH(unittest.TestCase): - def setUp(self): self.parameters = dict( - mass_1=30.0, mass_2=30.0, luminosity_distance=400.0, theta_jn=0.0, - phase=0.0, eccentricity=0.1) + mass_1=30.0, + mass_2=30.0, + luminosity_distance=400.0, + theta_jn=0.0, + phase=0.0, + eccentricity=0.1, + ) self.waveform_kwargs = dict( - waveform_approximant='EccentricFD', reference_frequency=10.0, - minimum_frequency=10.0) + waveform_approximant="EccentricFD", + reference_frequency=10.0, + minimum_frequency=10.0, + ) self.frequency_array = bilby.core.utils.create_frequency_series(2048, 4) def tearDown(self): @@ -117,25 +163,31 @@ class TestEccentricLalBBH(unittest.TestCase): self.parameters.update(self.waveform_kwargs) self.assertIsInstance( bilby.gw.source.lal_eccentric_binary_black_hole_no_spins( - self.frequency_array, **self.parameters), dict) + self.frequency_array, **self.parameters + ), + dict, + ) def test_lal_ebbh_works_without_waveform_parameters(self): self.assertIsInstance( bilby.gw.source.lal_eccentric_binary_black_hole_no_spins( - self.frequency_array, **self.parameters), dict) + self.frequency_array, **self.parameters + ), + dict, + ) def test_fails_without_eccentricity(self): - self.parameters.pop('eccentricity') + self.parameters.pop("eccentricity") self.parameters.update(self.waveform_kwargs) with self.assertRaises(TypeError): bilby.gw.source.lal_eccentric_binary_black_hole_no_spins( - self.frequency_array, **self.parameters) + self.frequency_array, **self.parameters + ) class TestROQBBH(unittest.TestCase): - def setUp(self): - roq_dir = '/roq_basis' + roq_dir = "/roq_basis" fnodes_linear_file = "{}/fnodes_linear.npy".format(roq_dir) fnodes_linear = np.load(fnodes_linear_file).T @@ -143,14 +195,25 @@ class TestROQBBH(unittest.TestCase): fnodes_quadratic = np.load(fnodes_quadratic_file).T self.parameters = dict( - mass_1=30.0, mass_2=30.0, luminosity_distance=400.0, a_1=0.0, - tilt_1=0.0, phi_12=0.0, a_2=0.0, tilt_2=0.0, phi_jl=0.0, - theta_jn=0.0, phase=0.0) + mass_1=30.0, + mass_2=30.0, + luminosity_distance=400.0, + a_1=0.0, + tilt_1=0.0, + phi_12=0.0, + a_2=0.0, + tilt_2=0.0, + phi_jl=0.0, + theta_jn=0.0, + phase=0.0, + ) self.waveform_kwargs = dict( frequency_nodes_linear=fnodes_linear, frequency_nodes_quadratic=fnodes_quadratic, - reference_frequency=50., minimum_frequency=20., - approximant='IMRPhenomPv2') + reference_frequency=50.0, + minimum_frequency=20.0, + approximant="IMRPhenomPv2", + ) self.frequency_array = bilby.core.utils.create_frequency_series(2048, 4) def tearDown(self): @@ -161,15 +224,16 @@ class TestROQBBH(unittest.TestCase): def test_roq_runs_valid_parameters(self): self.parameters.update(self.waveform_kwargs) self.assertIsInstance( - bilby.gw.source.roq(self.frequency_array, **self.parameters), dict) + bilby.gw.source.roq(self.frequency_array, **self.parameters), dict + ) def test_roq_fails_without_frequency_nodes(self): self.parameters.update(self.waveform_kwargs) - del self.parameters['frequency_nodes_linear'] - del self.parameters['frequency_nodes_quadratic'] + del self.parameters["frequency_nodes_linear"] + del self.parameters["frequency_nodes_quadratic"] with self.assertRaises(KeyError): bilby.gw.source.roq(self.frequency_array, **self.parameters) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/test/gw_utils_test.py b/test/gw_utils_test.py index e9b7b6262c156dde1928c408f7d651810dd16462..c44a65cd2c6328336353df24f2e767c5cbe59bfb 100644 --- a/test/gw_utils_test.py +++ b/test/gw_utils_test.py @@ -14,9 +14,8 @@ from bilby.gw import utils as gwutils class TestGWUtils(unittest.TestCase): - def setUp(self): - self.outdir = 'outdir' + self.outdir = "outdir" bilby.core.utils.check_directory_exists_and_if_not_mkdir(self.outdir) def tearDown(self): @@ -35,7 +34,7 @@ class TestGWUtils(unittest.TestCase): freq_data = np.array([1, 2, 3]) df = 0.1 psd = gwutils.psd_from_freq_series(freq_data, df) - self.assertTrue(np.all(psd == (freq_data * 2 * df ** 0.5)**2)) + self.assertTrue(np.all(psd == (freq_data * 2 * df ** 0.5) ** 2)) def test_time_delay_from_geocenter(self): """ @@ -47,22 +46,23 @@ class TestGWUtils(unittest.TestCase): ra = 0.5 dec = 0.2 time = 10 - self.assertEqual( - gwutils.time_delay_geocentric(det1, det1, ra, dec, time), 0) + self.assertEqual(gwutils.time_delay_geocentric(det1, det1, ra, dec, time), 0) self.assertAlmostEqual( gwutils.time_delay_geocentric(det1, det2, ra, dec, time), - 1.3253791114055397e-10, 14) + 1.3253791114055397e-10, + 14, + ) def test_get_polarization_tensor(self): ra = 1 dec = 2.0 time = 10 psi = 0.1 - for mode in ['plus', 'cross', 'breathing', 'longitudinal', 'x', 'y']: + for mode in ["plus", "cross", "breathing", "longitudinal", "x", "y"]: p = gwutils.get_polarization_tensor(ra, dec, time, psi, mode) self.assertEqual(p.shape, (3, 3)) with self.assertRaises(ValueError): - gwutils.get_polarization_tensor(ra, dec, time, psi, 'not-a-mode') + gwutils.get_polarization_tensor(ra, dec, time, psi, "not-a-mode") def test_inner_product(self): aa = np.array([1, 2, 3]) @@ -84,7 +84,8 @@ class TestGWUtils(unittest.TestCase): self.assertEqual( gwutils.optimal_snr_squared(aa, psd, duration), - gwutils.noise_weighted_inner_product(aa, aa, psd, duration)) + gwutils.noise_weighted_inner_product(aa, aa, psd, duration), + ) def test_matched_filter_snr(self): signal = np.array([1e-23, 2e-23, 3e-23]) @@ -95,72 +96,86 @@ class TestGWUtils(unittest.TestCase): duration = 4 mfsnr = gwutils.matched_filter_snr( - signal, frequency_domain_strain, psd, duration) + signal, frequency_domain_strain, psd, duration + ) self.assertEqual(mfsnr, 25.510869054168282) def test_get_event_time(self): - events = ['GW150914', 'GW151012', 'GW151226', 'GW170104', 'GW170608', - 'GW170729', 'GW170809', 'GW170814', 'GW170817', 'GW170818', - 'GW170823'] + events = [ + "GW150914", + "GW151012", + "GW151226", + "GW170104", + "GW170608", + "GW170729", + "GW170809", + "GW170814", + "GW170817", + "GW170818", + "GW170823", + ] for event in events: self.assertTrue(isinstance(gwutils.get_event_time(event), float)) - self.assertTrue(gwutils.get_event_time('GW010290') is None) + self.assertTrue(gwutils.get_event_time("GW010290") is None) def test_read_frame_file(self): start_time = 0 end_time = 10 - channel = 'H1:GDS-CALIB_STRAIN' + channel = "H1:GDS-CALIB_STRAIN" N = 100 times = np.linspace(start_time, end_time, N) data = np.random.normal(0, 1, N) ts = gwpy.timeseries.TimeSeries(data=data, times=times, t0=0) ts.channel = gwpy.detector.Channel(channel) ts.name = channel - filename = os.path.join(self.outdir, 'test.gwf') - ts.write(filename, format='gwf') + filename = os.path.join(self.outdir, "test.gwf") + ts.write(filename, format="gwf") # Check reading without time limits strain = gwutils.read_frame_file( - filename, start_time=None, end_time=None, channel=channel) + filename, start_time=None, end_time=None, channel=channel + ) self.assertEqual(strain.channel.name, channel) - self.assertTrue(np.all(strain.value==data[:-1])) + self.assertTrue(np.all(strain.value == data[:-1])) # Check reading with time limits start_cut = 2 end_cut = 8 strain = gwutils.read_frame_file( - filename, start_time=start_cut, end_time=end_cut, channel=channel) + filename, start_time=start_cut, end_time=end_cut, channel=channel + ) idxs = (times > start_cut) & (times < end_cut) # Dropping the last element - for some reason gwpy drops the last element when reading in data - self.assertTrue(np.all(strain.value==data[idxs][:-1])) + self.assertTrue(np.all(strain.value == data[idxs][:-1])) # Check reading with unknown channels - strain = gwutils.read_frame_file( - filename, start_time=None, end_time=None) - self.assertTrue(np.all(strain.value==data[:-1])) + strain = gwutils.read_frame_file(filename, start_time=None, end_time=None) + self.assertTrue(np.all(strain.value == data[:-1])) # Check reading with incorrect channel strain = gwutils.read_frame_file( - filename, start_time=None, end_time=None, channel='WRONG') - self.assertTrue(np.all(strain.value==data[:-1])) + filename, start_time=None, end_time=None, channel="WRONG" + ) + self.assertTrue(np.all(strain.value == data[:-1])) ts = gwpy.timeseries.TimeSeries(data=data, times=times, t0=0) - ts.name = 'NOT-A-KNOWN-CHANNEL' - ts.write(filename, format='gwf') - strain = gwutils.read_frame_file( - filename, start_time=None, end_time=None) + ts.name = "NOT-A-KNOWN-CHANNEL" + ts.write(filename, format="gwf") + strain = gwutils.read_frame_file(filename, start_time=None, end_time=None) self.assertEqual(strain, None) def test_convert_args_list_to_float(self): self.assertEqual( - gwutils.convert_args_list_to_float(1, '2', 3.0), [1.0, 2.0, 3.0]) + gwutils.convert_args_list_to_float(1, "2", 3.0), [1.0, 2.0, 3.0] + ) with self.assertRaises(ValueError): - gwutils.convert_args_list_to_float(1, '2', 'ten') + gwutils.convert_args_list_to_float(1, "2", "ten") def test_lalsim_SimInspiralTransformPrecessingNewInitialConditions(self): - a = gwutils.lalsim_SimInspiralTransformPrecessingNewInitialConditions( - 0.1, 0, 0.6, 0.5, 0.6, 0.1, 0.8, 30.6, 23.2, 50, 0) + a = gwutils.lalsim_SimInspiralTransformPrecessingNewInitialConditions( + 0.1, 0, 0.6, 0.5, 0.6, 0.1, 0.8, 30.6, 23.2, 50, 0 + ) self.assertTrue(len(a) == 7) def test_get_approximant(self): @@ -169,22 +184,79 @@ class TestGWUtils(unittest.TestCase): def test_lalsim_SimInspiralChooseFDWaveform(self): a = gwutils.lalsim_SimInspiralChooseFDWaveform( - 35.2, 20.4, 0.1, 0.2, 0.2, 0.2, 0.2, 0.1, 1000, 2, 2.3, - 45., 0.1, 10, 0.01, 10, 1000, 20, None, lalsim.IMRPhenomPv2) + 35.2, + 20.4, + 0.1, + 0.2, + 0.2, + 0.2, + 0.2, + 0.1, + 1000, + 2, + 2.3, + 45.0, + 0.1, + 10, + 0.01, + 10, + 1000, + 20, + None, + lalsim.IMRPhenomPv2, + ) self.assertEqual(len(a), 2) self.assertEqual(type(a[0]), lal.COMPLEX16FrequencySeries) self.assertEqual(type(a[1]), lal.COMPLEX16FrequencySeries) with self.assertRaises(RuntimeError): _ = gwutils.lalsim_SimInspiralChooseFDWaveform( - 35.2, 20.4, 0.1, 0.2, 0.2, 0.2, 0.2, 0.1, 1000, 2, 2.3, - 45., 0.1, 10, 0.01, 10, 1000, 20, None, 'Fail') + 35.2, + 20.4, + 0.1, + 0.2, + 0.2, + 0.2, + 0.2, + 0.1, + 1000, + 2, + 2.3, + 45.0, + 0.1, + 10, + 0.01, + 10, + 1000, + 20, + None, + "Fail", + ) with self.assertRaises(ValueError): _ = gwutils.lalsim_SimInspiralChooseFDWaveform( - 35.2, 20.4, 0.1, 0.2, 0.2, 0.2, 0.2, 0.1, 1000, 2, 2.3, - 45., 0.1, 10, 0.01, 10, 1000, 20, None, 1.5) - - -if __name__ == '__main__': + 35.2, + 20.4, + 0.1, + 0.2, + 0.2, + 0.2, + 0.2, + 0.1, + 1000, + 2, + 2.3, + 45.0, + 0.1, + 10, + 0.01, + 10, + 1000, + 20, + None, + 1.5, + ) + + +if __name__ == "__main__": unittest.main() diff --git a/test/hyper_pe_test.py b/test/hyper_pe_test.py index e7872df9bb939fe3b92688f661241d0c62ec1cb0..12773802008d4d64dafed5fc647953472574d50b 100644 --- a/test/hyper_pe_test.py +++ b/test/hyper_pe_test.py @@ -5,15 +5,14 @@ import bilby.hyper as hyp class TestHyperLikelihood(unittest.TestCase): - def setUp(self): - self.keys = ['a', 'b', 'c'] + self.keys = ["a", "b", "c"] self.lengths = [300, 400, 500] self.posteriors = list() for ii, length in enumerate(self.lengths): self.posteriors.append( - pd.DataFrame( - {key: np.random.normal(0, 1, length) for key in self.keys})) + pd.DataFrame({key: np.random.normal(0, 1, length) for key in self.keys}) + ) self.log_evidences = [2, 2, 2] self.model = hyp.model.Model(list()) self.sampling_model = hyp.model.Model(list()) @@ -26,42 +25,58 @@ class TestHyperLikelihood(unittest.TestCase): def test_evidence_factor_with_evidences(self): like = hyp.likelihood.HyperparameterLikelihood( - self.posteriors, self.model, self.sampling_model, - log_evidences=self.log_evidences) + self.posteriors, + self.model, + self.sampling_model, + log_evidences=self.log_evidences, + ) self.assertEqual(like.evidence_factor, 6) def test_evidence_factor_without_evidences(self): like = hyp.likelihood.HyperparameterLikelihood( - self.posteriors, self.model, self.sampling_model) + self.posteriors, self.model, self.sampling_model + ) self.assertTrue(np.isnan(like.evidence_factor)) def test_len_samples_with_max_samples(self): like = hyp.likelihood.HyperparameterLikelihood( - self.posteriors, self.model, self.sampling_model, - log_evidences=self.log_evidences, max_samples=10) + self.posteriors, + self.model, + self.sampling_model, + log_evidences=self.log_evidences, + max_samples=10, + ) self.assertEqual(like.samples_per_posterior, 10) def test_len_samples_without_max_samples(self): like = hyp.likelihood.HyperparameterLikelihood( - self.posteriors, self.model, self.sampling_model, - log_evidences=self.log_evidences) + self.posteriors, + self.model, + self.sampling_model, + log_evidences=self.log_evidences, + ) self.assertEqual(like.samples_per_posterior, min(self.lengths)) def test_resample_with_max_samples(self): like = hyp.likelihood.HyperparameterLikelihood( - self.posteriors, self.model, self.sampling_model, - log_evidences=self.log_evidences) + self.posteriors, + self.model, + self.sampling_model, + log_evidences=self.log_evidences, + ) resampled = like.resample_posteriors() - self.assertEqual(resampled['a'].shape, - (len(self.lengths), min(self.lengths))) + self.assertEqual(resampled["a"].shape, (len(self.lengths), min(self.lengths))) def test_resample_without_max_samples(self): like = hyp.likelihood.HyperparameterLikelihood( - self.posteriors, self.model, self.sampling_model, - log_evidences=self.log_evidences) + self.posteriors, + self.model, + self.sampling_model, + log_evidences=self.log_evidences, + ) resampled = like.resample_posteriors(10) - self.assertEqual(resampled['a'].shape, (len(self.lengths), 10)) + self.assertEqual(resampled["a"].shape, (len(self.lengths), 10)) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/test/likelihood_test.py b/test/likelihood_test.py index 3bc3d0b97b541af86b7d3dd10bc8e2941a82801d..49cb5db2184b3e37ac13f54f1c46e2be39a3a7a8 100644 --- a/test/likelihood_test.py +++ b/test/likelihood_test.py @@ -1,18 +1,24 @@ from __future__ import absolute_import + # import bilby import unittest from mock import MagicMock import mock import numpy as np from bilby.core.likelihood import ( - Likelihood, GaussianLikelihood, PoissonLikelihood, StudentTLikelihood, - Analytical1DLikelihood, ExponentialLikelihood, + Likelihood, + GaussianLikelihood, + PoissonLikelihood, + StudentTLikelihood, + Analytical1DLikelihood, + ExponentialLikelihood, AnalyticalMultidimensionalCovariantGaussian, - AnalyticalMultidimensionalBimodalCovariantGaussian, JointLikelihood) + AnalyticalMultidimensionalBimodalCovariantGaussian, + JointLikelihood, +) class TestLikelihoodBase(unittest.TestCase): - def setUp(self): self.likelihood = Likelihood() @@ -20,8 +26,8 @@ class TestLikelihoodBase(unittest.TestCase): del self.likelihood def test_repr(self): - self.likelihood = Likelihood(parameters=['a', 'b']) - expected = 'Likelihood(parameters=[\'a\', \'b\'])' + self.likelihood = Likelihood(parameters=["a", "b"]) + expected = "Likelihood(parameters=['a', 'b'])" self.assertEqual(expected, repr(self.likelihood)) def test_base_log_likelihood(self): @@ -47,7 +53,6 @@ class TestLikelihoodBase(unittest.TestCase): class TestAnalytical1DLikelihood(unittest.TestCase): - def setUp(self): self.x = np.arange(start=0, stop=100, step=1) self.y = np.arange(start=0, stop=100, step=1) @@ -58,9 +63,11 @@ class TestAnalytical1DLikelihood(unittest.TestCase): self.func = test_func self.parameter1_value = 4 self.parameter2_value = 7 - self.analytical_1d_likelihood = Analytical1DLikelihood(x=self.x, y=self.y, func=self.func) - self.analytical_1d_likelihood.parameters['parameter1'] = self.parameter1_value - self.analytical_1d_likelihood.parameters['parameter2'] = self.parameter2_value + self.analytical_1d_likelihood = Analytical1DLikelihood( + x=self.x, y=self.y, func=self.func + ) + self.analytical_1d_likelihood.parameters["parameter1"] = self.parameter1_value + self.analytical_1d_likelihood.parameters["parameter2"] = self.parameter2_value def tearDown(self): del self.x @@ -122,9 +129,12 @@ class TestAnalytical1DLikelihood(unittest.TestCase): self.analytical_1d_likelihood.func = new_func def test_parameters(self): - expected_parameters = dict(parameter1=self.parameter1_value, - parameter2=self.parameter2_value) - self.assertDictEqual(expected_parameters, self.analytical_1d_likelihood.parameters) + expected_parameters = dict( + parameter1=self.parameter1_value, parameter2=self.parameter2_value + ) + self.assertDictEqual( + expected_parameters, self.analytical_1d_likelihood.parameters + ) def test_n(self): self.assertEqual(len(self.x), self.analytical_1d_likelihood.n) @@ -137,18 +147,22 @@ class TestAnalytical1DLikelihood(unittest.TestCase): def test_model_parameters(self): sigma = 5 self.analytical_1d_likelihood.sigma = sigma - self.analytical_1d_likelihood.parameters['sigma'] = sigma - expected_model_parameters = dict(parameter1=self.parameter1_value, - parameter2=self.parameter2_value) - self.assertDictEqual(expected_model_parameters, self.analytical_1d_likelihood.model_parameters) + self.analytical_1d_likelihood.parameters["sigma"] = sigma + expected_model_parameters = dict( + parameter1=self.parameter1_value, parameter2=self.parameter2_value + ) + self.assertDictEqual( + expected_model_parameters, self.analytical_1d_likelihood.model_parameters + ) def test_repr(self): - expected = 'Analytical1DLikelihood(x={}, y={}, func={})'.format(self.x, self.y, self.func.__name__) + expected = "Analytical1DLikelihood(x={}, y={}, func={})".format( + self.x, self.y, self.func.__name__ + ) self.assertEqual(expected, repr(self.analytical_1d_likelihood)) class TestGaussianLikelihood(unittest.TestCase): - def setUp(self): self.N = 100 self.sigma = 0.1 @@ -168,57 +182,51 @@ class TestGaussianLikelihood(unittest.TestCase): del self.function def test_known_sigma(self): - likelihood = GaussianLikelihood( - self.x, self.y, self.function, self.sigma) - likelihood.parameters['m'] = 2 - likelihood.parameters['c'] = 0 + likelihood = GaussianLikelihood(self.x, self.y, self.function, self.sigma) + likelihood.parameters["m"] = 2 + likelihood.parameters["c"] = 0 likelihood.log_likelihood() self.assertEqual(likelihood.sigma, self.sigma) def test_known_array_sigma(self): sigma_array = np.ones(self.N) * self.sigma - likelihood = GaussianLikelihood( - self.x, self.y, self.function, sigma_array) - likelihood.parameters['m'] = 2 - likelihood.parameters['c'] = 0 + likelihood = GaussianLikelihood(self.x, self.y, self.function, sigma_array) + likelihood.parameters["m"] = 2 + likelihood.parameters["c"] = 0 likelihood.log_likelihood() self.assertTrue(type(likelihood.sigma) == type(sigma_array)) self.assertTrue(all(likelihood.sigma == sigma_array)) def test_set_sigma_None(self): - likelihood = GaussianLikelihood( - self.x, self.y, self.function, sigma=None) - likelihood.parameters['m'] = 2 - likelihood.parameters['c'] = 0 + likelihood = GaussianLikelihood(self.x, self.y, self.function, sigma=None) + likelihood.parameters["m"] = 2 + likelihood.parameters["c"] = 0 self.assertTrue(likelihood.sigma is None) with self.assertRaises(TypeError): likelihood.log_likelihood() def test_sigma_float(self): - likelihood = GaussianLikelihood( - self.x, self.y, self.function, sigma=None) - likelihood.parameters['m'] = 2 - likelihood.parameters['c'] = 0 - likelihood.parameters['sigma'] = 1 + likelihood = GaussianLikelihood(self.x, self.y, self.function, sigma=None) + likelihood.parameters["m"] = 2 + likelihood.parameters["c"] = 0 + likelihood.parameters["sigma"] = 1 likelihood.log_likelihood() self.assertTrue(likelihood.sigma == 1) def test_sigma_other(self): - likelihood = GaussianLikelihood( - self.x, self.y, self.function, sigma=None) + likelihood = GaussianLikelihood(self.x, self.y, self.function, sigma=None) with self.assertRaises(ValueError): - likelihood.sigma = 'test' + likelihood.sigma = "test" def test_repr(self): - likelihood = GaussianLikelihood( - self.x, self.y, self.function, sigma=self.sigma) - expected = 'GaussianLikelihood(x={}, y={}, func={}, sigma={})' \ - .format(self.x, self.y, self.function.__name__, self.sigma) + likelihood = GaussianLikelihood(self.x, self.y, self.function, sigma=self.sigma) + expected = "GaussianLikelihood(x={}, y={}, func={}, sigma={})".format( + self.x, self.y, self.function.__name__, self.sigma + ) self.assertEqual(expected, repr(likelihood)) class TestStudentTLikelihood(unittest.TestCase): - def setUp(self): self.N = 100 self.nu = self.N - 2 @@ -240,55 +248,50 @@ class TestStudentTLikelihood(unittest.TestCase): def test_known_sigma(self): likelihood = StudentTLikelihood( - self.x, self.y, self.function, self.nu, self.sigma) - likelihood.parameters['m'] = 2 - likelihood.parameters['c'] = 0 + self.x, self.y, self.function, self.nu, self.sigma + ) + likelihood.parameters["m"] = 2 + likelihood.parameters["c"] = 0 likelihood.log_likelihood() self.assertEqual(likelihood.sigma, self.sigma) def test_set_nu_none(self): - likelihood = StudentTLikelihood( - self.x, self.y, self.function, nu=None) - likelihood.parameters['m'] = 2 - likelihood.parameters['c'] = 0 + likelihood = StudentTLikelihood(self.x, self.y, self.function, nu=None) + likelihood.parameters["m"] = 2 + likelihood.parameters["c"] = 0 self.assertTrue(likelihood.nu is None) def test_log_likelihood_nu_none(self): - likelihood = StudentTLikelihood( - self.x, self.y, self.function, nu=None) - likelihood.parameters['m'] = 2 - likelihood.parameters['c'] = 0 + likelihood = StudentTLikelihood(self.x, self.y, self.function, nu=None) + likelihood.parameters["m"] = 2 + likelihood.parameters["c"] = 0 with self.assertRaises((ValueError, TypeError)): # ValueError in Python2, TypeError in Python3 likelihood.log_likelihood() def test_log_likelihood_nu_zero(self): - likelihood = StudentTLikelihood( - self.x, self.y, self.function, nu=0) - likelihood.parameters['m'] = 2 - likelihood.parameters['c'] = 0 + likelihood = StudentTLikelihood(self.x, self.y, self.function, nu=0) + likelihood.parameters["m"] = 2 + likelihood.parameters["c"] = 0 with self.assertRaises(ValueError): likelihood.log_likelihood() def test_log_likelihood_nu_negative(self): - likelihood = StudentTLikelihood( - self.x, self.y, self.function, nu=-1) - likelihood.parameters['m'] = 2 - likelihood.parameters['c'] = 0 + likelihood = StudentTLikelihood(self.x, self.y, self.function, nu=-1) + likelihood.parameters["m"] = 2 + likelihood.parameters["c"] = 0 with self.assertRaises(ValueError): likelihood.log_likelihood() def test_setting_nu_positive_does_not_change_class_attribute(self): - likelihood = StudentTLikelihood( - self.x, self.y, self.function, nu=None) - likelihood.parameters['m'] = 2 - likelihood.parameters['c'] = 0 - likelihood.parameters['nu'] = 98 + likelihood = StudentTLikelihood(self.x, self.y, self.function, nu=None) + likelihood.parameters["m"] = 2 + likelihood.parameters["c"] = 0 + likelihood.parameters["nu"] = 98 self.assertTrue(likelihood.nu == 98) def test_lam(self): - likelihood = StudentTLikelihood( - self.x, self.y, self.function, nu=0, sigma=0.5) + likelihood = StudentTLikelihood(self.x, self.y, self.function, nu=0, sigma=0.5) self.assertAlmostEqual(4.0, likelihood.lam) @@ -296,20 +299,21 @@ class TestStudentTLikelihood(unittest.TestCase): nu = 0 sigma = 0.5 likelihood = StudentTLikelihood( - self.x, self.y, self.function, nu=nu, sigma=sigma) - expected = 'StudentTLikelihood(x={}, y={}, func={}, nu={}, sigma={})' \ - .format(self.x, self.y, self.function.__name__, nu, sigma) + self.x, self.y, self.function, nu=nu, sigma=sigma + ) + expected = "StudentTLikelihood(x={}, y={}, func={}, nu={}, sigma={})".format( + self.x, self.y, self.function.__name__, nu, sigma + ) self.assertEqual(expected, repr(likelihood)) class TestPoissonLikelihood(unittest.TestCase): - def setUp(self): self.N = 100 self.mu = 5 self.x = np.linspace(0, 1, self.N) self.y = np.random.poisson(self.mu, self.N) - self.yfloat = np.copy(self.y) * 1. + self.yfloat = np.copy(self.y) * 1.0 self.yneg = np.copy(self.y) self.yneg[0] = -1 @@ -343,13 +347,13 @@ class TestPoissonLikelihood(unittest.TestCase): PoissonLikelihood(self.x, self.yneg, self.function) def test_neg_rate(self): - self.poisson_likelihood.parameters['c'] = -2 + self.poisson_likelihood.parameters["c"] = -2 with self.assertRaises(ValueError): self.poisson_likelihood.log_likelihood() def test_neg_rate_array(self): likelihood = PoissonLikelihood(self.x, self.y, self.function_array) - likelihood.parameters['c'] = -2 + likelihood.parameters["c"] = -2 with self.assertRaises(ValueError): likelihood.log_likelihood() @@ -376,43 +380,50 @@ class TestPoissonLikelihood(unittest.TestCase): self.poisson_likelihood.y = 5.3 def test_log_likelihood_wrong_func_return_type(self): - poisson_likelihood = PoissonLikelihood(x=self.x, y=self.y, func=lambda x: 'test') + poisson_likelihood = PoissonLikelihood( + x=self.x, y=self.y, func=lambda x: "test" + ) with self.assertRaises(ValueError): poisson_likelihood.log_likelihood() def test_log_likelihood_negative_func_return_element(self): - poisson_likelihood = PoissonLikelihood(x=self.x, y=self.y, func=lambda x: np.array([3, 6, -2])) + poisson_likelihood = PoissonLikelihood( + x=self.x, y=self.y, func=lambda x: np.array([3, 6, -2]) + ) with self.assertRaises(ValueError): poisson_likelihood.log_likelihood() def test_log_likelihood_zero_func_return_element(self): - poisson_likelihood = PoissonLikelihood(x=self.x, y=self.y, func=lambda x: np.array([3, 6, 0])) + poisson_likelihood = PoissonLikelihood( + x=self.x, y=self.y, func=lambda x: np.array([3, 6, 0]) + ) self.assertEqual(-np.inf, poisson_likelihood.log_likelihood()) def test_log_likelihood_dummy(self): """ Merely tests if it goes into the right if else bracket """ poisson_likelihood = PoissonLikelihood( - x=self.x, y=self.y, func=lambda x: np.linspace(1, 100, self.N)) - with mock.patch('numpy.sum') as m: + x=self.x, y=self.y, func=lambda x: np.linspace(1, 100, self.N) + ) + with mock.patch("numpy.sum") as m: m.return_value = 1 self.assertEqual(1, poisson_likelihood.log_likelihood()) def test_repr(self): - likelihood = PoissonLikelihood( - self.x, self.y, self.function) - expected = 'PoissonLikelihood(x={}, y={}, func={})'.format(self.x, self.y, self.function.__name__) + likelihood = PoissonLikelihood(self.x, self.y, self.function) + expected = "PoissonLikelihood(x={}, y={}, func={})".format( + self.x, self.y, self.function.__name__ + ) self.assertEqual(expected, repr(likelihood)) class TestExponentialLikelihood(unittest.TestCase): - def setUp(self): self.N = 100 self.mu = 5 self.x = np.linspace(0, 1, self.N) self.y = np.random.exponential(self.mu, self.N) self.yneg = np.copy(self.y) - self.yneg[0] = -1. + self.yneg[0] = -1.0 def test_function(x, c): return c @@ -423,7 +434,8 @@ class TestExponentialLikelihood(unittest.TestCase): self.function = test_function self.function_array = test_function_array self.exponential_likelihood = ExponentialLikelihood( - x=self.x, y=self.y, func=self.function) + x=self.x, y=self.y, func=self.function + ) def tearDown(self): del self.N @@ -440,12 +452,12 @@ class TestExponentialLikelihood(unittest.TestCase): def test_negative_function(self): likelihood = ExponentialLikelihood(self.x, self.y, self.function) - likelihood.parameters['c'] = -1 + likelihood.parameters["c"] = -1 self.assertEqual(likelihood.log_likelihood(), -np.inf) def test_negative_array_function(self): likelihood = ExponentialLikelihood(self.x, self.y, self.function_array) - likelihood.parameters['c'] = -1 + likelihood.parameters["c"] = -1 self.assertEqual(likelihood.log_likelihood(), -np.inf) def test_init_y(self): @@ -482,25 +494,27 @@ class TestExponentialLikelihood(unittest.TestCase): def test_log_likelihood_default(self): """ Merely tests that it ends up at the right place in the code """ exponential_likelihood = ExponentialLikelihood( - x=self.x, y=self.y, func=lambda x: np.array([4.2])) - with mock.patch('numpy.sum') as m: + x=self.x, y=self.y, func=lambda x: np.array([4.2]) + ) + with mock.patch("numpy.sum") as m: m.return_value = 3 self.assertEqual(-3, exponential_likelihood.log_likelihood()) def test_repr(self): - expected = 'ExponentialLikelihood(x={}, y={}, func={})'.format(self.x, self.y, self.function.__name__) + expected = "ExponentialLikelihood(x={}, y={}, func={})".format( + self.x, self.y, self.function.__name__ + ) self.assertEqual(expected, repr(self.exponential_likelihood)) class TestAnalyticalMultidimensionalCovariantGaussian(unittest.TestCase): - def setUp(self): self.cov = [[1, 0, 0], [0, 4, 0], [0, 0, 9]] self.sigma = [1, 2, 3] self.mean = [10, 11, 12] self.likelihood = AnalyticalMultidimensionalCovariantGaussian( - mean=self.mean, - cov=self.cov) + mean=self.mean, cov=self.cov + ) def tearDown(self): del self.cov @@ -525,20 +539,18 @@ class TestAnalyticalMultidimensionalCovariantGaussian(unittest.TestCase): def test_log_likelihood(self): likelihood = AnalyticalMultidimensionalCovariantGaussian(mean=[0], cov=[1]) - self.assertEqual(-np.log(2*np.pi)/2, likelihood.log_likelihood()) + self.assertEqual(-np.log(2 * np.pi) / 2, likelihood.log_likelihood()) class TestAnalyticalMultidimensionalBimodalCovariantGaussian(unittest.TestCase): - def setUp(self): self.cov = [[1, 0, 0], [0, 4, 0], [0, 0, 9]] self.sigma = [1, 2, 3] self.mean_1 = [10, 11, 12] self.mean_2 = [20, 21, 22] self.likelihood = AnalyticalMultidimensionalBimodalCovariantGaussian( - mean_1=self.mean_1, - mean_2=self.mean_2, - cov=self.cov) + mean_1=self.mean_1, mean_2=self.mean_2, cov=self.cov + ) def tearDown(self): del self.cov @@ -566,39 +578,44 @@ class TestAnalyticalMultidimensionalBimodalCovariantGaussian(unittest.TestCase): self.assertEqual(3, self.likelihood.dim) def test_log_likelihood(self): - likelihood = AnalyticalMultidimensionalBimodalCovariantGaussian(mean_1=[0], mean_2=[0], cov=[1]) - self.assertEqual(-np.log(2*np.pi)/2, likelihood.log_likelihood()) + likelihood = AnalyticalMultidimensionalBimodalCovariantGaussian( + mean_1=[0], mean_2=[0], cov=[1] + ) + self.assertEqual(-np.log(2 * np.pi) / 2, likelihood.log_likelihood()) -class TestJointLikelihood(unittest.TestCase): +class TestJointLikelihood(unittest.TestCase): def setUp(self): self.x = np.array([1, 2, 3]) self.y = np.array([1, 2, 3]) self.first_likelihood = GaussianLikelihood( - x=self.x, y=self.y, - func=lambda x, param1, param2: (param1 + param2) * x, sigma=1) + x=self.x, + y=self.y, + func=lambda x, param1, param2: (param1 + param2) * x, + sigma=1, + ) self.second_likelihood = PoissonLikelihood( - x=self.x, y=self.y, - func=lambda x, param2, param3: (param2 + param3) * x) + x=self.x, y=self.y, func=lambda x, param2, param3: (param2 + param3) * x + ) self.third_likelihood = ExponentialLikelihood( - x=self.x, y=self.y, - func=lambda x, param4, param5: (param4 + param5) * x) + x=self.x, y=self.y, func=lambda x, param4, param5: (param4 + param5) * x + ) self.joint_likelihood = JointLikelihood( - self.first_likelihood, self.second_likelihood, - self.third_likelihood) - - self.first_likelihood.parameters['param1'] = 1 - self.first_likelihood.parameters['param2'] = 2 - self.second_likelihood.parameters['param2'] = 2 - self.second_likelihood.parameters['param3'] = 3 - self.third_likelihood.parameters['param4'] = 4 - self.third_likelihood.parameters['param5'] = 5 - - self.joint_likelihood.parameters['param1'] = 1 - self.joint_likelihood.parameters['param2'] = 2 - self.joint_likelihood.parameters['param3'] = 3 - self.joint_likelihood.parameters['param4'] = 4 - self.joint_likelihood.parameters['param5'] = 5 + self.first_likelihood, self.second_likelihood, self.third_likelihood + ) + + self.first_likelihood.parameters["param1"] = 1 + self.first_likelihood.parameters["param2"] = 2 + self.second_likelihood.parameters["param2"] = 2 + self.second_likelihood.parameters["param3"] = 3 + self.third_likelihood.parameters["param4"] = 4 + self.third_likelihood.parameters["param5"] = 5 + + self.joint_likelihood.parameters["param1"] = 1 + self.joint_likelihood.parameters["param2"] = 2 + self.joint_likelihood.parameters["param3"] = 3 + self.joint_likelihood.parameters["param4"] = 4 + self.joint_likelihood.parameters["param5"] = 5 def tearDown(self): del self.x @@ -609,55 +626,69 @@ class TestJointLikelihood(unittest.TestCase): del self.joint_likelihood def test_parameters_consistent_from_init(self): - expected = dict(param1=1, param2=2, param3=3, param4=4, param5=5, ) + expected = dict(param1=1, param2=2, param3=3, param4=4, param5=5,) self.assertDictEqual(expected, self.joint_likelihood.parameters) def test_log_likelihood_correctly_sums(self): - expected = self.first_likelihood.log_likelihood() + \ - self.second_likelihood.log_likelihood() + \ - self.third_likelihood.log_likelihood() + expected = ( + self.first_likelihood.log_likelihood() + + self.second_likelihood.log_likelihood() + + self.third_likelihood.log_likelihood() + ) self.assertEqual(expected, self.joint_likelihood.log_likelihood()) def test_log_likelihood_checks_parameter_updates(self): - self.first_likelihood.parameters['param2'] = 7 - self.second_likelihood.parameters['param2'] = 7 - self.joint_likelihood.parameters['param2'] = 7 - expected = self.first_likelihood.log_likelihood() + \ - self.second_likelihood.log_likelihood() + \ - self.third_likelihood.log_likelihood() + self.first_likelihood.parameters["param2"] = 7 + self.second_likelihood.parameters["param2"] = 7 + self.joint_likelihood.parameters["param2"] = 7 + expected = ( + self.first_likelihood.log_likelihood() + + self.second_likelihood.log_likelihood() + + self.third_likelihood.log_likelihood() + ) self.assertEqual(expected, self.joint_likelihood.log_likelihood()) def test_list_element_parameters_are_updated(self): - self.joint_likelihood.parameters['param2'] = 7 - self.assertEqual(self.joint_likelihood.parameters['param2'], - self.joint_likelihood.likelihoods[0].parameters['param2']) - self.assertEqual(self.joint_likelihood.parameters['param2'], - self.joint_likelihood.likelihoods[1].parameters['param2']) + self.joint_likelihood.parameters["param2"] = 7 + self.assertEqual( + self.joint_likelihood.parameters["param2"], + self.joint_likelihood.likelihoods[0].parameters["param2"], + ) + self.assertEqual( + self.joint_likelihood.parameters["param2"], + self.joint_likelihood.likelihoods[1].parameters["param2"], + ) def test_log_noise_likelihood(self): self.first_likelihood.noise_log_likelihood = MagicMock(return_value=1) self.second_likelihood.noise_log_likelihood = MagicMock(return_value=2) self.third_likelihood.noise_log_likelihood = MagicMock(return_value=3) self.joint_likelihood = JointLikelihood( - self.first_likelihood, self.second_likelihood, - self.third_likelihood) - expected = self.first_likelihood.noise_log_likelihood() + \ - self.second_likelihood.noise_log_likelihood() + \ - self.third_likelihood.noise_log_likelihood() + self.first_likelihood, self.second_likelihood, self.third_likelihood + ) + expected = ( + self.first_likelihood.noise_log_likelihood() + + self.second_likelihood.noise_log_likelihood() + + self.third_likelihood.noise_log_likelihood() + ) self.assertEqual(expected, self.joint_likelihood.noise_log_likelihood()) def test_init_with_list_of_likelihoods(self): with self.assertRaises(ValueError): - JointLikelihood([self.first_likelihood, self.second_likelihood, - self.third_likelihood]) + JointLikelihood( + [self.first_likelihood, self.second_likelihood, self.third_likelihood] + ) def test_setting_single_likelihood(self): self.joint_likelihood.likelihoods = self.first_likelihood - self.assertEqual(self.first_likelihood.log_likelihood(), self.joint_likelihood.log_likelihood()) + self.assertEqual( + self.first_likelihood.log_likelihood(), + self.joint_likelihood.log_likelihood(), + ) def test_setting_likelihood_other(self): with self.assertRaises(ValueError): - self.joint_likelihood.likelihoods = 'test' + self.joint_likelihood.likelihoods = "test" # Appending is not supported # def test_appending(self): @@ -666,5 +697,5 @@ class TestJointLikelihood(unittest.TestCase): # self.assertDictEqual(self.joint_likelihood.parameters, joint_likelihood.parameters) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/test/make_standard_data.py b/test/make_standard_data.py index 458ce69b4652ba7cd90fd90a3c746d055cc0b60f..7b0496182b355badf9a9add14ad9616877cc9018 100644 --- a/test/make_standard_data.py +++ b/test/make_standard_data.py @@ -9,50 +9,59 @@ from bilby.gw.waveform_generator import WaveformGenerator np.random.seed(10) -time_duration = 4. -sampling_frequency = 4096. +time_duration = 4.0 +sampling_frequency = 4096.0 simulation_parameters = dict( - mass_1=36., - mass_2=29., - a_1=0., - a_2=0., - tilt_1=0., - tilt_2=0., - phi_12=0., - phi_jl=0., - luminosity_distance=100., + mass_1=36.0, + mass_2=29.0, + a_1=0.0, + a_2=0.0, + tilt_1=0.0, + tilt_2=0.0, + phi_12=0.0, + phi_jl=0.0, + luminosity_distance=100.0, theta_jn=0.4, phase=1.3, - waveform_approximant='IMRPhenomPv2', - reference_frequency=50., + waveform_approximant="IMRPhenomPv2", + reference_frequency=50.0, ra=1.375, dec=-1.2108, geocent_time=1126259642.413, - psi=2.659 + psi=2.659, ) waveform_generator = WaveformGenerator( - duration=time_duration, sampling_frequency=sampling_frequency, + duration=time_duration, + sampling_frequency=sampling_frequency, frequency_domain_source_model=bilby.gw.source.lal_binary_black_hole, - parameters=simulation_parameters) + parameters=simulation_parameters, +) signal = waveform_generator.frequency_domain_strain() IFO = bilby.gw.detector.get_interferometer_with_fake_noise_and_injection( - name='H1', injection_polarizations=signal, - injection_parameters=simulation_parameters, duration=time_duration, - plot=False, sampling_frequency=sampling_frequency) + name="H1", + injection_polarizations=signal, + injection_parameters=simulation_parameters, + duration=time_duration, + plot=False, + sampling_frequency=sampling_frequency, +) hf_signal_and_noise = IFO.strain_data.frequency_domain_strain frequencies = bilby.core.utils.create_frequency_series( - sampling_frequency=sampling_frequency, duration=time_duration) + sampling_frequency=sampling_frequency, duration=time_duration +) -if __name__ == '__main__': +if __name__ == "__main__": dir_path = os.path.dirname(os.path.realpath(__file__)) - with open(dir_path + '/standard_data.txt', 'w+') as f: + with open(dir_path + "/standard_data.txt", "w+") as f: np.savetxt( f, - np.column_stack([frequencies, - hf_signal_and_noise.view(float).reshape(-1, 2)]), - header='frequency hf_real hf_imag') + np.column_stack( + [frequencies, hf_signal_and_noise.view(float).reshape(-1, 2)] + ), + header="frequency hf_real hf_imag", + ) diff --git a/test/noise_realisation_test.py b/test/noise_realisation_test.py index 15aa404f4d00092fde0d093a3eba6260d961efeb..dbaae44a53fb5e6cb5a352c9f0ea24cddf3bf62d 100644 --- a/test/noise_realisation_test.py +++ b/test/noise_realisation_test.py @@ -6,44 +6,52 @@ import bilby class TestNoiseRealisation(unittest.TestCase): def test_averaged_noise(self): - time_duration = 1. - sampling_frequency = 4096. + time_duration = 1.0 + sampling_frequency = 4096.0 factor = np.sqrt(2 / time_duration) n_avg = 1000 psd_avg = 0 - interferometer = bilby.gw.detector.get_empty_interferometer('H1') + interferometer = bilby.gw.detector.get_empty_interferometer("H1") for x in range(0, n_avg): interferometer.set_strain_data_from_power_spectral_density( - sampling_frequency=sampling_frequency, duration=time_duration) - psd_avg += abs(interferometer.strain_data.frequency_domain_strain)**2 + sampling_frequency=sampling_frequency, duration=time_duration + ) + psd_avg += abs(interferometer.strain_data.frequency_domain_strain) ** 2 psd_avg = psd_avg / n_avg asd_avg = np.sqrt(abs(psd_avg)) * interferometer.frequency_mask - a = np.nan_to_num(interferometer.amplitude_spectral_density_array / factor * interferometer.frequency_mask) + a = np.nan_to_num( + interferometer.amplitude_spectral_density_array + / factor + * interferometer.frequency_mask + ) b = asd_avg self.assertTrue(np.allclose(a, b, rtol=1e-1)) def test_noise_normalisation(self): - duration = 1. - sampling_frequency = 4096. + duration = 1.0 + sampling_frequency = 4096.0 time_array = bilby.core.utils.create_time_series( - sampling_frequency=sampling_frequency, duration=duration) + sampling_frequency=sampling_frequency, duration=duration + ) # generate some toy-model signal for matched filtering SNR testing n_avg = 1000 snr = np.zeros(n_avg) - mu = (np.exp(-(time_array-duration/2.)**2 / (2.*0.1**2)) - * np.sin(2 * np.pi * 100 * time_array)) + mu = np.exp(-((time_array - duration / 2.0) ** 2) / (2.0 * 0.1 ** 2)) * np.sin( + 2 * np.pi * 100 * time_array + ) muf, frequency_array = bilby.core.utils.nfft(mu, sampling_frequency) for x in range(0, n_avg): - interferometer = bilby.gw.detector.get_empty_interferometer('H1') + interferometer = bilby.gw.detector.get_empty_interferometer("H1") interferometer.set_strain_data_from_power_spectral_density( - sampling_frequency=sampling_frequency, duration=duration) + sampling_frequency=sampling_frequency, duration=duration + ) snr[x] = interferometer.matched_filter_snr(signal=muf) self.assertTrue(np.isclose(np.std(snr), 1.00, atol=1e-1)) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/test/other_test.py b/test/other_test.py index b76e15cd37e4878222e097d0c5c7c443ced5b367..53ed7eb2462eab09221f96bddca2d8a99db5f425 100644 --- a/test/other_test.py +++ b/test/other_test.py @@ -10,14 +10,14 @@ import bilby class Test(unittest.TestCase): - outdir = './outdir' + outdir = "./outdir" dir_path = os.path.dirname(os.path.realpath(__file__)) dir_path = os.path.abspath(os.path.join(dir_path, os.path.pardir)) # Run a script to produce standard data msd = {} # A dictionary of variables saved in make_standard_data.py - execfile(dir_path + '/test/make_standard_data.py', msd) - ''' + execfile(dir_path + "/test/make_standard_data.py", msd) + """ @classmethod def setUpClass(self): if os.path.isdir(self.outdir): @@ -35,39 +35,47 @@ class Test(unittest.TestCase): except OSError: logging.warning( "{} not removed prior to tests".format(self.outdir)) - ''' + """ + def test_make_standard_data(self): " Load in the saved standard data and compare with new data " # Load in the saved standard data frequencies_saved, hf_real_saved, hf_imag_saved = np.loadtxt( - self.dir_path + '/test/standard_data.txt').T + self.dir_path + "/test/standard_data.txt" + ).T hf_signal_and_noise_saved = hf_real_saved + 1j * hf_imag_saved - self.assertTrue(np.array_equal( - self.msd['frequencies'], frequencies_saved)) - self.assertAlmostEqual(all( - self.msd['hf_signal_and_noise'] - hf_signal_and_noise_saved), - 0.00000000, 5) + self.assertTrue(np.array_equal(self.msd["frequencies"], frequencies_saved)) + self.assertAlmostEqual( + all(self.msd["hf_signal_and_noise"] - hf_signal_and_noise_saved), + 0.00000000, + 5, + ) def test_recover_luminosity_distance(self): likelihood = bilby.gw.likelihood.GravitationalWaveTransient( - [self.msd['IFO']], self.msd['waveform_generator']) + [self.msd["IFO"]], self.msd["waveform_generator"] + ) priors = {} - for key in self.msd['simulation_parameters']: - priors[key] = self.msd['simulation_parameters'][key] + for key in self.msd["simulation_parameters"]: + priors[key] = self.msd["simulation_parameters"][key] - dL = self.msd['simulation_parameters']['luminosity_distance'] - priors['luminosity_distance'] = bilby.core.prior.Uniform( - name='luminosity_distance', minimum=dL - 10, maximum=dL + 10) + dL = self.msd["simulation_parameters"]["luminosity_distance"] + priors["luminosity_distance"] = bilby.core.prior.Uniform( + name="luminosity_distance", minimum=dL - 10, maximum=dL + 10 + ) result = bilby.core.sampler.run_sampler( - likelihood, priors, sampler='dynesty', verbose=False, npoints=100) + likelihood, priors, sampler="dynesty", verbose=False, npoints=100 + ) self.assertAlmostEqual( - np.mean(result.posterior.luminosity_distance), dL, - delta=3*np.std(result.posterior.luminosity_distance)) + np.mean(result.posterior.luminosity_distance), + dL, + delta=3 * np.std(result.posterior.luminosity_distance), + ) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/test/prior_test.py b/test/prior_test.py index a3c5a312eddb1c2438295b8e29f2fb0c9f16a3c7..280d84b970fe209c7f92d81b6d0357fa5fad4b03 100644 --- a/test/prior_test.py +++ b/test/prior_test.py @@ -9,7 +9,6 @@ import scipy.stats as ss class TestPriorInstantiationWithoutOptionalPriors(unittest.TestCase): - def setUp(self): self.prior = bilby.core.prior.Prior() @@ -41,10 +40,18 @@ class TestPriorInstantiationWithoutOptionalPriors(unittest.TestCase): necessarily the same order as python2 doesn't conserve the order of the arguments. """ - self.prior = bilby.core.prior.Prior(name='test_name', latex_label='test_label', minimum=0, maximum=1, - check_range_nonzero=True, boundary=None) - expected_string = "Prior(name='test_name', latex_label='test_label', unit=None, minimum=0, maximum=1, " \ - "check_range_nonzero=True, boundary=None)" + self.prior = bilby.core.prior.Prior( + name="test_name", + latex_label="test_label", + minimum=0, + maximum=1, + check_range_nonzero=True, + boundary=None, + ) + expected_string = ( + "Prior(name='test_name', latex_label='test_label', unit=None, minimum=0, maximum=1, " + "check_range_nonzero=True, boundary=None)" + ) self.assertTrue(sorted(expected_string) == sorted(self.prior.__repr__())) def test_base_prob(self): @@ -59,7 +66,7 @@ class TestPriorInstantiationWithoutOptionalPriors(unittest.TestCase): self.prior.maximum = 1 val_below = self.prior.minimum - 0.1 val_at_minimum = self.prior.minimum - val_in_prior = (self.prior.minimum + self.prior.maximum) / 2. + val_in_prior = (self.prior.minimum + self.prior.maximum) / 2.0 val_at_maximum = self.prior.maximum val_above = self.prior.maximum + 0.1 self.assertTrue(self.prior.is_in_prior_range(val_at_minimum)) @@ -73,9 +80,8 @@ class TestPriorInstantiationWithoutOptionalPriors(unittest.TestCase): class TestPriorName(unittest.TestCase): - def setUp(self): - self.test_name = 'test_name' + self.test_name = "test_name" self.prior = bilby.core.prior.Prior(self.test_name) def tearDown(self): @@ -89,7 +95,7 @@ class TestPriorName(unittest.TestCase): class TestPriorLatexLabel(unittest.TestCase): def setUp(self): - self.test_name = 'test_name' + self.test_name = "test_name" self.prior = bilby.core.prior.Prior(self.test_name) def tearDown(self): @@ -97,21 +103,20 @@ class TestPriorLatexLabel(unittest.TestCase): del self.prior def test_label_assignment(self): - test_label = 'test_label' - self.prior.latex_label = 'test_label' + test_label = "test_label" + self.prior.latex_label = "test_label" self.assertEqual(test_label, self.prior.latex_label) def test_default_label_assignment(self): - self.prior.name = 'chirp_mass' + self.prior.name = "chirp_mass" self.prior.latex_label = None - self.assertEqual(self.prior.latex_label, '$\mathcal{M}$') + self.assertEqual(self.prior.latex_label, "$\mathcal{M}$") def test_default_label_assignment_default(self): self.assertTrue(self.prior.latex_label, self.prior.name) class TestPriorIsFixed(unittest.TestCase): - def setUp(self): pass @@ -132,7 +137,6 @@ class TestPriorIsFixed(unittest.TestCase): class TestPriorBoundary(unittest.TestCase): - def setUp(self): self.prior = bilby.core.prior.Prior(boundary=None) @@ -140,98 +144,208 @@ class TestPriorBoundary(unittest.TestCase): del self.prior def test_set_boundary_valid(self): - self.prior.boundary = 'periodic' - self.assertEqual(self.prior.boundary, 'periodic') + self.prior.boundary = "periodic" + self.assertEqual(self.prior.boundary, "periodic") def test_set_boundary_invalid(self): with self.assertRaises(ValueError): - self.prior.boundary = 'else' + self.prior.boundary = "else" class TestPriorClasses(unittest.TestCase): - def setUp(self): # set multivariate Gaussian - mvg = bilby.core.prior.MultivariateGaussianDist(names=['testa', 'testb'], - mus=[1, 1], - covs=np.array([[2., 0.5], [0.5, 2.]]), - weights=1.) - mvn = bilby.core.prior.MultivariateGaussianDist(names=['testa', 'testb'], - mus=[1, 1], - covs=np.array([[2., 0.5], [0.5, 2.]]), - weights=1.) - hp_map_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), - 'prior_files/GW150914_testing_skymap.fits') - hp_dist = bilby.gw.prior.HealPixMapPriorDist(hp_map_file, - names=['testra', 'testdec']) - hp_3d_dist = bilby.gw.prior.HealPixMapPriorDist(hp_map_file, - names=['testra', 'testdec', 'testdistance'], distance=True) + mvg = bilby.core.prior.MultivariateGaussianDist( + names=["testa", "testb"], + mus=[1, 1], + covs=np.array([[2.0, 0.5], [0.5, 2.0]]), + weights=1.0, + ) + mvn = bilby.core.prior.MultivariateGaussianDist( + names=["testa", "testb"], + mus=[1, 1], + covs=np.array([[2.0, 0.5], [0.5, 2.0]]), + weights=1.0, + ) + hp_map_file = os.path.join( + os.path.dirname(os.path.realpath(__file__)), + "prior_files/GW150914_testing_skymap.fits", + ) + hp_dist = bilby.gw.prior.HealPixMapPriorDist( + hp_map_file, names=["testra", "testdec"] + ) + hp_3d_dist = bilby.gw.prior.HealPixMapPriorDist( + hp_map_file, names=["testra", "testdec", "testdistance"], distance=True + ) def condition_func(reference_params, test_param): return reference_params.copy() self.priors = [ - bilby.core.prior.DeltaFunction(name='test', unit='unit', peak=1), - bilby.core.prior.Gaussian(name='test', unit='unit', mu=0, sigma=1), - bilby.core.prior.Normal(name='test', unit='unit', mu=0, sigma=1), - bilby.core.prior.PowerLaw(name='test', unit='unit', alpha=0, minimum=0, maximum=1), - bilby.core.prior.PowerLaw(name='test', unit='unit', alpha=-1, minimum=0.5, maximum=1), - bilby.core.prior.PowerLaw(name='test', unit='unit', alpha=2, minimum=1, maximum=1e2), - bilby.core.prior.Uniform(name='test', unit='unit', minimum=0, maximum=1), - bilby.core.prior.LogUniform(name='test', unit='unit', minimum=5e0, maximum=1e2), - bilby.gw.prior.UniformComovingVolume(name='redshift', minimum=0.1, maximum=1.0), - bilby.gw.prior.UniformSourceFrame(name='redshift', minimum=0.1, maximum=1.0), - bilby.core.prior.Sine(name='test', unit='unit'), - bilby.core.prior.Cosine(name='test', unit='unit'), - bilby.core.prior.Interped(name='test', unit='unit', xx=np.linspace(0, 10, 1000), - yy=np.linspace(0, 10, 1000) ** 4, - minimum=3, maximum=5), - bilby.core.prior.TruncatedGaussian(name='test', unit='unit', mu=1, sigma=0.4, minimum=-1, maximum=1), - bilby.core.prior.TruncatedNormal(name='test', unit='unit', mu=1, sigma=0.4, minimum=-1, maximum=1), - bilby.core.prior.HalfGaussian(name='test', unit='unit', sigma=1), - bilby.core.prior.HalfNormal(name='test', unit='unit', sigma=1), - bilby.core.prior.LogGaussian(name='test', unit='unit', mu=0, sigma=1), - bilby.core.prior.LogNormal(name='test', unit='unit', mu=0, sigma=1), - bilby.core.prior.Exponential(name='test', unit='unit', mu=1), - bilby.core.prior.StudentT(name='test', unit='unit', df=3, mu=0, scale=1), - bilby.core.prior.Beta(name='test', unit='unit', alpha=2.0, beta=2.0), - bilby.core.prior.Logistic(name='test', unit='unit', mu=0, scale=1), - bilby.core.prior.Cauchy(name='test', unit='unit', alpha=0, beta=1), - bilby.core.prior.Lorentzian(name='test', unit='unit', alpha=0, beta=1), - bilby.core.prior.Gamma(name='test', unit='unit', k=1, theta=1), - bilby.core.prior.ChiSquared(name='test', unit='unit', nu=2), - bilby.gw.prior.AlignedSpin(name='test', unit='unit'), - bilby.core.prior.MultivariateGaussian(dist=mvg, name='testa', unit='unit'), - bilby.core.prior.MultivariateGaussian(dist=mvg, name='testb', unit='unit'), - bilby.core.prior.MultivariateNormal(dist=mvn, name='testa', unit='unit'), - bilby.core.prior.MultivariateNormal(dist=mvn, name='testb', unit='unit'), - bilby.core.prior.ConditionalDeltaFunction(condition_func=condition_func, name='test', unit='unit', peak=1), - bilby.core.prior.ConditionalGaussian(condition_func=condition_func, name='test', unit='unit', mu=0, sigma=1), - bilby.core.prior.ConditionalPowerLaw(condition_func=condition_func, name='test', unit='unit', alpha=0, minimum=0, maximum=1), - bilby.core.prior.ConditionalPowerLaw(condition_func=condition_func, name='test', unit='unit', alpha=-1, minimum=0.5, maximum=1), - bilby.core.prior.ConditionalPowerLaw(condition_func=condition_func, name='test', unit='unit', alpha=2, minimum=1, maximum=1e2), - bilby.core.prior.ConditionalUniform(condition_func=condition_func, name='test', unit='unit', minimum=0, maximum=1), - bilby.core.prior.ConditionalLogUniform(condition_func=condition_func, name='test', unit='unit', minimum=5e0, maximum=1e2), - bilby.gw.prior.ConditionalUniformComovingVolume(condition_func=condition_func, name='redshift', minimum=0.1, maximum=1.0), - bilby.gw.prior.ConditionalUniformSourceFrame(condition_func=condition_func, name='redshift', minimum=0.1, maximum=1.0), - bilby.core.prior.ConditionalSine(condition_func=condition_func, name='test', unit='unit'), - bilby.core.prior.ConditionalCosine(condition_func=condition_func, name='test', unit='unit'), - bilby.core.prior.ConditionalTruncatedGaussian(condition_func=condition_func, name='test', unit='unit', mu=1, sigma=0.4, minimum=-1, maximum=1), - bilby.core.prior.ConditionalHalfGaussian(condition_func=condition_func, name='test', unit='unit', sigma=1), - bilby.core.prior.ConditionalLogNormal(condition_func=condition_func, name='test', unit='unit', mu=0, sigma=1), - bilby.core.prior.ConditionalExponential(condition_func=condition_func, name='test', unit='unit', mu=1), - bilby.core.prior.ConditionalStudentT(condition_func=condition_func, name='test', unit='unit', df=3, mu=0, scale=1), - bilby.core.prior.ConditionalBeta(condition_func=condition_func, name='test', unit='unit', alpha=2.0, beta=2.0), - bilby.core.prior.ConditionalLogistic(condition_func=condition_func, name='test', unit='unit', mu=0, scale=1), - bilby.core.prior.ConditionalCauchy(condition_func=condition_func, name='test', unit='unit', alpha=0, beta=1), - bilby.core.prior.ConditionalGamma(condition_func=condition_func, name='test', unit='unit', k=1, theta=1), - bilby.core.prior.ConditionalChiSquared(condition_func=condition_func, name='test', unit='unit', nu=2), - bilby.gw.prior.HealPixPrior(dist=hp_dist, name='testra', unit='unit'), - bilby.gw.prior.HealPixPrior(dist=hp_dist, name='testdec', unit='unit'), - bilby.gw.prior.HealPixPrior(dist=hp_3d_dist, name='testra', unit='unit'), - bilby.gw.prior.HealPixPrior(dist=hp_3d_dist, name='testdec', unit='unit'), - bilby.gw.prior.HealPixPrior(dist=hp_3d_dist, name='testdistance', unit='unit') + bilby.core.prior.DeltaFunction(name="test", unit="unit", peak=1), + bilby.core.prior.Gaussian(name="test", unit="unit", mu=0, sigma=1), + bilby.core.prior.Normal(name="test", unit="unit", mu=0, sigma=1), + bilby.core.prior.PowerLaw( + name="test", unit="unit", alpha=0, minimum=0, maximum=1 + ), + bilby.core.prior.PowerLaw( + name="test", unit="unit", alpha=-1, minimum=0.5, maximum=1 + ), + bilby.core.prior.PowerLaw( + name="test", unit="unit", alpha=2, minimum=1, maximum=1e2 + ), + bilby.core.prior.Uniform(name="test", unit="unit", minimum=0, maximum=1), + bilby.core.prior.LogUniform( + name="test", unit="unit", minimum=5e0, maximum=1e2 + ), + bilby.gw.prior.UniformComovingVolume( + name="redshift", minimum=0.1, maximum=1.0 + ), + bilby.gw.prior.UniformSourceFrame( + name="redshift", minimum=0.1, maximum=1.0 + ), + bilby.core.prior.Sine(name="test", unit="unit"), + bilby.core.prior.Cosine(name="test", unit="unit"), + bilby.core.prior.Interped( + name="test", + unit="unit", + xx=np.linspace(0, 10, 1000), + yy=np.linspace(0, 10, 1000) ** 4, + minimum=3, + maximum=5, + ), + bilby.core.prior.TruncatedGaussian( + name="test", unit="unit", mu=1, sigma=0.4, minimum=-1, maximum=1 + ), + bilby.core.prior.TruncatedNormal( + name="test", unit="unit", mu=1, sigma=0.4, minimum=-1, maximum=1 + ), + bilby.core.prior.HalfGaussian(name="test", unit="unit", sigma=1), + bilby.core.prior.HalfNormal(name="test", unit="unit", sigma=1), + bilby.core.prior.LogGaussian(name="test", unit="unit", mu=0, sigma=1), + bilby.core.prior.LogNormal(name="test", unit="unit", mu=0, sigma=1), + bilby.core.prior.Exponential(name="test", unit="unit", mu=1), + bilby.core.prior.StudentT(name="test", unit="unit", df=3, mu=0, scale=1), + bilby.core.prior.Beta(name="test", unit="unit", alpha=2.0, beta=2.0), + bilby.core.prior.Logistic(name="test", unit="unit", mu=0, scale=1), + bilby.core.prior.Cauchy(name="test", unit="unit", alpha=0, beta=1), + bilby.core.prior.Lorentzian(name="test", unit="unit", alpha=0, beta=1), + bilby.core.prior.Gamma(name="test", unit="unit", k=1, theta=1), + bilby.core.prior.ChiSquared(name="test", unit="unit", nu=2), + bilby.gw.prior.AlignedSpin(name="test", unit="unit"), + bilby.core.prior.MultivariateGaussian(dist=mvg, name="testa", unit="unit"), + bilby.core.prior.MultivariateGaussian(dist=mvg, name="testb", unit="unit"), + bilby.core.prior.MultivariateNormal(dist=mvn, name="testa", unit="unit"), + bilby.core.prior.MultivariateNormal(dist=mvn, name="testb", unit="unit"), + bilby.core.prior.ConditionalDeltaFunction( + condition_func=condition_func, name="test", unit="unit", peak=1 + ), + bilby.core.prior.ConditionalGaussian( + condition_func=condition_func, name="test", unit="unit", mu=0, sigma=1 + ), + bilby.core.prior.ConditionalPowerLaw( + condition_func=condition_func, + name="test", + unit="unit", + alpha=0, + minimum=0, + maximum=1, + ), + bilby.core.prior.ConditionalPowerLaw( + condition_func=condition_func, + name="test", + unit="unit", + alpha=-1, + minimum=0.5, + maximum=1, + ), + bilby.core.prior.ConditionalPowerLaw( + condition_func=condition_func, + name="test", + unit="unit", + alpha=2, + minimum=1, + maximum=1e2, + ), + bilby.core.prior.ConditionalUniform( + condition_func=condition_func, + name="test", + unit="unit", + minimum=0, + maximum=1, + ), + bilby.core.prior.ConditionalLogUniform( + condition_func=condition_func, + name="test", + unit="unit", + minimum=5e0, + maximum=1e2, + ), + bilby.gw.prior.ConditionalUniformComovingVolume( + condition_func=condition_func, name="redshift", minimum=0.1, maximum=1.0 + ), + bilby.gw.prior.ConditionalUniformSourceFrame( + condition_func=condition_func, name="redshift", minimum=0.1, maximum=1.0 + ), + bilby.core.prior.ConditionalSine( + condition_func=condition_func, name="test", unit="unit" + ), + bilby.core.prior.ConditionalCosine( + condition_func=condition_func, name="test", unit="unit" + ), + bilby.core.prior.ConditionalTruncatedGaussian( + condition_func=condition_func, + name="test", + unit="unit", + mu=1, + sigma=0.4, + minimum=-1, + maximum=1, + ), + bilby.core.prior.ConditionalHalfGaussian( + condition_func=condition_func, name="test", unit="unit", sigma=1 + ), + bilby.core.prior.ConditionalLogNormal( + condition_func=condition_func, name="test", unit="unit", mu=0, sigma=1 + ), + bilby.core.prior.ConditionalExponential( + condition_func=condition_func, name="test", unit="unit", mu=1 + ), + bilby.core.prior.ConditionalStudentT( + condition_func=condition_func, + name="test", + unit="unit", + df=3, + mu=0, + scale=1, + ), + bilby.core.prior.ConditionalBeta( + condition_func=condition_func, + name="test", + unit="unit", + alpha=2.0, + beta=2.0, + ), + bilby.core.prior.ConditionalLogistic( + condition_func=condition_func, name="test", unit="unit", mu=0, scale=1 + ), + bilby.core.prior.ConditionalCauchy( + condition_func=condition_func, name="test", unit="unit", alpha=0, beta=1 + ), + bilby.core.prior.ConditionalGamma( + condition_func=condition_func, name="test", unit="unit", k=1, theta=1 + ), + bilby.core.prior.ConditionalChiSquared( + condition_func=condition_func, name="test", unit="unit", nu=2 + ), + bilby.gw.prior.HealPixPrior(dist=hp_dist, name="testra", unit="unit"), + bilby.gw.prior.HealPixPrior(dist=hp_dist, name="testdec", unit="unit"), + bilby.gw.prior.HealPixPrior(dist=hp_3d_dist, name="testra", unit="unit"), + bilby.gw.prior.HealPixPrior(dist=hp_3d_dist, name="testdec", unit="unit"), + bilby.gw.prior.HealPixPrior( + dist=hp_3d_dist, name="testdistance", unit="unit" + ), ] def tearDown(self): @@ -268,7 +382,9 @@ class TestPriorClasses(unittest.TestCase): if bilby.core.prior.JointPrior in prior.__class__.__mro__: if not prior.dist.filled_rescale(): continue - self.assertTrue(all((many_samples >= prior.minimum) & (many_samples <= prior.maximum))) + self.assertTrue( + all((many_samples >= prior.minimum) & (many_samples <= prior.maximum)) + ) def test_out_of_bounds_rescaling(self): """Test the the rescaling works as expected.""" @@ -278,25 +394,34 @@ class TestPriorClasses(unittest.TestCase): def test_least_recently_sampled(self): for prior in self.priors: least_recently_sampled_expected = prior.sample() - self.assertEqual(least_recently_sampled_expected, prior.least_recently_sampled) + self.assertEqual( + least_recently_sampled_expected, prior.least_recently_sampled + ) def test_sampling_single(self): """Test that sampling from the prior always returns values within its domain.""" for prior in self.priors: single_sample = prior.sample() - self.assertTrue((single_sample >= prior.minimum) & (single_sample <= prior.maximum)) + self.assertTrue( + (single_sample >= prior.minimum) & (single_sample <= prior.maximum) + ) def test_sampling_many(self): """Test that sampling from the prior always returns values within its domain.""" for prior in self.priors: many_samples = prior.sample(5000) - self.assertTrue((all(many_samples >= prior.minimum)) & (all(many_samples <= prior.maximum))) + self.assertTrue( + (all(many_samples >= prior.minimum)) + & (all(many_samples <= prior.maximum)) + ) def test_probability_above_domain(self): """Test that the prior probability is non-negative in domain of validity and zero outside.""" for prior in self.priors: if prior.maximum != np.inf: - outside_domain = np.linspace(prior.maximum + 1, prior.maximum + 1e4, 1000) + outside_domain = np.linspace( + prior.maximum + 1, prior.maximum + 1e4, 1000 + ) if bilby.core.prior.JointPrior in prior.__class__.__mro__: if not prior.dist.filled_request(): prior.dist.requested_parameters[prior.name] = outside_domain @@ -307,14 +432,16 @@ class TestPriorClasses(unittest.TestCase): """Test that the prior probability is non-negative in domain of validity and zero outside.""" for prior in self.priors: if prior.minimum != -np.inf: - outside_domain = np.linspace(prior.minimum - 1e4, prior.minimum - 1, 1000) + outside_domain = np.linspace( + prior.minimum - 1e4, prior.minimum - 1, 1000 + ) if bilby.core.prior.JointPrior in prior.__class__.__mro__: if not prior.dist.filled_request(): prior.dist.requested_parameters[prior.name] = outside_domain continue self.assertTrue(all(prior.prob(outside_domain) == 0)) - def test_least_recently_sampled(self): + def test_least_recently_sampled_2(self): for prior in self.priors: lrs = prior.sample() self.assertEqual(lrs, prior.least_recently_sampled) @@ -322,15 +449,17 @@ class TestPriorClasses(unittest.TestCase): def test_prob_and_ln_prob(self): for prior in self.priors: sample = prior.sample() - if not bilby.core.prior.JointPrior in prior.__class__.__mro__: + if not bilby.core.prior.JointPrior in prior.__class__.__mro__: # noqa # due to the way that the Multivariate Gaussian prior must sequentially call # the prob and ln_prob functions, it must be ignored in this test. - self.assertAlmostEqual(np.log(prior.prob(sample)), prior.ln_prob(sample), 12) + self.assertAlmostEqual( + np.log(prior.prob(sample)), prior.ln_prob(sample), 12 + ) def test_many_prob_and_many_ln_prob(self): for prior in self.priors: samples = prior.sample(10) - if not bilby.core.prior.JointPrior in prior.__class__.__mro__: + if not bilby.core.prior.JointPrior in prior.__class__.__mro__: # noqa ln_probs = prior.ln_prob(samples) probs = prior.prob(samples) for sample, logp, p in zip(samples, ln_probs, probs): @@ -341,8 +470,10 @@ class TestPriorClasses(unittest.TestCase): domain = np.linspace(0, 1, 100) threshold = 1e-9 for prior in self.priors: - if isinstance(prior, bilby.core.prior.DeltaFunction) or \ - bilby.core.prior.JointPrior in prior.__class__.__mro__: + if ( + isinstance(prior, bilby.core.prior.DeltaFunction) + or bilby.core.prior.JointPrior in prior.__class__.__mro__ + ): continue rescaled = prior.rescale(domain) max_difference = max(np.abs(domain - prior.cdf(rescaled))) @@ -352,136 +483,155 @@ class TestPriorClasses(unittest.TestCase): for prior in self.priors: if prior.maximum != np.inf: outside_domain = np.linspace( - prior.maximum + 1, prior.maximum + 1e4, 1000) + prior.maximum + 1, prior.maximum + 1e4, 1000 + ) self.assertTrue(all(prior.cdf(outside_domain) == 1)) def test_cdf_zero_below_domain(self): for prior in self.priors: - if bilby.core.prior.JointPrior in prior.__class__.__mro__ and prior.maximum == np.inf: + if ( + bilby.core.prior.JointPrior in prior.__class__.__mro__ + and prior.maximum == np.inf + ): continue if prior.minimum != -np.inf: outside_domain = np.linspace( - prior.minimum - 1e4, prior.minimum - 1, 1000) - self.assertTrue(all( - np.nan_to_num(prior.cdf(outside_domain)) == 0)) + prior.minimum - 1e4, prior.minimum - 1, 1000 + ) + self.assertTrue(all(np.nan_to_num(prior.cdf(outside_domain)) == 0)) def test_log_normal_fail(self): with self.assertRaises(ValueError): - bilby.core.prior.LogNormal(name='test', unit='unit', mu=0, sigma=-1) + bilby.core.prior.LogNormal(name="test", unit="unit", mu=0, sigma=-1) def test_studentt_fail(self): with self.assertRaises(ValueError): - bilby.core.prior.StudentT(name='test', unit='unit', df=3, mu=0, scale=-1) + bilby.core.prior.StudentT(name="test", unit="unit", df=3, mu=0, scale=-1) with self.assertRaises(ValueError): - bilby.core.prior.StudentT(name='test', unit='unit', df=0, mu=0, scale=1) + bilby.core.prior.StudentT(name="test", unit="unit", df=0, mu=0, scale=1) def test_beta_fail(self): with self.assertRaises(ValueError): - bilby.core.prior.Beta(name='test', unit='unit', alpha=-2.0, beta=2.0), + bilby.core.prior.Beta(name="test", unit="unit", alpha=-2.0, beta=2.0), with self.assertRaises(ValueError): - bilby.core.prior.Beta(name='test', unit='unit', alpha=2.0, beta=-2.0), + bilby.core.prior.Beta(name="test", unit="unit", alpha=2.0, beta=-2.0), def test_multivariate_gaussian_fail(self): with self.assertRaises(ValueError): # bounds is wrong length - bilby.core.prior.MultivariateGaussianDist(['a', 'b'], - bounds=[(-1., 1.)]) + bilby.core.prior.MultivariateGaussianDist(["a", "b"], bounds=[(-1.0, 1.0)]) with self.assertRaises(ValueError): # bounds has lower value greater than upper - bilby.core.prior.MultivariateGaussianDist(['a', 'b'], - bounds=[(-1., 1.), (1., -1)]) + bilby.core.prior.MultivariateGaussianDist( + ["a", "b"], bounds=[(-1.0, 1.0), (1.0, -1)] + ) with self.assertRaises(TypeError): # bound is not a list/tuple - bilby.core.prior.MultivariateGaussianDist(['a', 'b'], - bounds=[(-1., 1.), 2]) + bilby.core.prior.MultivariateGaussianDist( + ["a", "b"], bounds=[(-1.0, 1.0), 2] + ) with self.assertRaises(ValueError): # bound contains too many values - bilby.core.prior.MultivariateGaussianDist(['a', 'b'], - bounds=[(-1., 1., 4), 2]) + bilby.core.prior.MultivariateGaussianDist( + ["a", "b"], bounds=[(-1.0, 1.0, 4), 2] + ) with self.assertRaises(ValueError): # means is not a list - bilby.core.prior.MultivariateGaussianDist(['a', 'b'], mus=1.) + bilby.core.prior.MultivariateGaussianDist(["a", "b"], mus=1.0) with self.assertRaises(ValueError): # sigmas is not a list - bilby.core.prior.MultivariateGaussianDist(['a', 'b'], sigmas=1.) + bilby.core.prior.MultivariateGaussianDist(["a", "b"], sigmas=1.0) with self.assertRaises(TypeError): # covariances is not a list - bilby.core.prior.MultivariateGaussianDist(['a', 'b'], covs=1.) + bilby.core.prior.MultivariateGaussianDist(["a", "b"], covs=1.0) with self.assertRaises(TypeError): # correlation coefficients is not a list - bilby.core.prior.MultivariateGaussianDist(['a', 'b'], corrcoefs=1.) + bilby.core.prior.MultivariateGaussianDist(["a", "b"], corrcoefs=1.0) with self.assertRaises(ValueError): # wrong number of weights - bilby.core.prior.MultivariateGaussianDist(['a', 'b'], weights=[0.5, 0.5]) + bilby.core.prior.MultivariateGaussianDist(["a", "b"], weights=[0.5, 0.5]) with self.assertRaises(ValueError): # not enough modes set - bilby.core.prior.MultivariateGaussianDist(['a', 'b'], mus=[[1., 2.]], - nmodes=2) + bilby.core.prior.MultivariateGaussianDist( + ["a", "b"], mus=[[1.0, 2.0]], nmodes=2 + ) with self.assertRaises(ValueError): # covariance is the wrong shape - bilby.core.prior.MultivariateGaussianDist(['a', 'b'], - covs=np.array([[[1., 1.], - [1., 1.]]])) + bilby.core.prior.MultivariateGaussianDist( + ["a", "b"], covs=np.array([[[1.0, 1.0], [1.0, 1.0]]]) + ) with self.assertRaises(ValueError): # covariance is the wrong shape - bilby.core.prior.MultivariateGaussianDist(['a', 'b'], - covs=np.array([[[1., 1.]]])) + bilby.core.prior.MultivariateGaussianDist( + ["a", "b"], covs=np.array([[[1.0, 1.0]]]) + ) with self.assertRaises(ValueError): # correlation coefficient matrix is the wrong shape - bilby.core.prior.MultivariateGaussianDist(['a', 'b'], sigmas=[1., 1.], - corrcoefs=np.array([[[[1., 1.], - [1., 1.]]]])) + bilby.core.prior.MultivariateGaussianDist( + ["a", "b"], + sigmas=[1.0, 1.0], + corrcoefs=np.array([[[[1.0, 1.0], [1.0, 1.0]]]]), + ) with self.assertRaises(ValueError): # correlation coefficient matrix is the wrong shape - bilby.core.prior.MultivariateGaussianDist(['a', 'b'], sigmas=[1., 1.], - corrcoefs=np.array([[[1., 1.]]])) + bilby.core.prior.MultivariateGaussianDist( + ["a", "b"], sigmas=[1.0, 1.0], corrcoefs=np.array([[[1.0, 1.0]]]) + ) with self.assertRaises(ValueError): # correlation coefficient has non-unity diagonal value - bilby.core.prior.MultivariateGaussianDist(['a', 'b'], sigmas=[1., 1.], - corrcoefs=np.array([[1., 1.], - [1., 2.]])) + bilby.core.prior.MultivariateGaussianDist( + ["a", "b"], + sigmas=[1.0, 1.0], + corrcoefs=np.array([[1.0, 1.0], [1.0, 2.0]]), + ) with self.assertRaises(ValueError): # correlation coefficient matrix is not symmetric - bilby.core.prior.MultivariateGaussianDist(['a', 'b'], sigmas=[1., 2.], - corrcoefs=np.array([[1., -1.2], - [-0.3, 1.]])) + bilby.core.prior.MultivariateGaussianDist( + ["a", "b"], + sigmas=[1.0, 2.0], + corrcoefs=np.array([[1.0, -1.2], [-0.3, 1.0]]), + ) with self.assertRaises(ValueError): # correlation coefficient matrix is not positive definite - bilby.core.prior.MultivariateGaussianDist(['a', 'b'], sigmas=[1., 2.], - corrcoefs=np.array([[1., -1.3], - [-1.3, 1.]])) + bilby.core.prior.MultivariateGaussianDist( + ["a", "b"], + sigmas=[1.0, 2.0], + corrcoefs=np.array([[1.0, -1.3], [-1.3, 1.0]]), + ) with self.assertRaises(ValueError): # wrong number of sigmas - bilby.core.prior.MultivariateGaussianDist(['a', 'b'], sigmas=[1., 2., 3.], - corrcoefs=np.array([[1., 0.3], - [0.3, 1.]])) + bilby.core.prior.MultivariateGaussianDist( + ["a", "b"], + sigmas=[1.0, 2.0, 3.0], + corrcoefs=np.array([[1.0, 0.3], [0.3, 1.0]]), + ) def test_multivariate_gaussian_covariance(self): """Test that the correlation coefficient/covariance matrices are correct""" - cov = np.array([[4., 0], [0., 9.]]) - mvg = bilby.core.prior.MultivariateGaussianDist(['a', 'b'], covs=cov) + cov = np.array([[4.0, 0], [0.0, 9.0]]) + mvg = bilby.core.prior.MultivariateGaussianDist(["a", "b"], covs=cov) self.assertEqual(mvg.nmodes, 1) self.assertTrue(np.allclose(mvg.covs[0], cov)) self.assertTrue(np.allclose(mvg.sigmas[0], np.sqrt(np.diag(cov)))) self.assertTrue(np.allclose(mvg.corrcoefs[0], np.eye(2))) - corrcoef = np.array([[1., 0.5], [0.5, 1.]]) - sigma = [2., 2.] - mvg = bilby.core.prior.MultivariateGaussianDist(['a', 'b'], - corrcoefs=corrcoef, - sigmas=sigma) + corrcoef = np.array([[1.0, 0.5], [0.5, 1.0]]) + sigma = [2.0, 2.0] + mvg = bilby.core.prior.MultivariateGaussianDist( + ["a", "b"], corrcoefs=corrcoef, sigmas=sigma + ) self.assertTrue(np.allclose(mvg.corrcoefs[0], corrcoef)) self.assertTrue(np.allclose(mvg.sigmas[0], sigma)) self.assertTrue(np.allclose(np.diag(mvg.covs[0]), np.square(sigma))) - self.assertTrue(np.allclose(np.diag(np.fliplr(mvg.covs[0])), 2.*np.ones(2))) + self.assertTrue(np.allclose(np.diag(np.fliplr(mvg.covs[0])), 2.0 * np.ones(2))) def test_fermidirac_fail(self): with self.assertRaises(ValueError): - bilby.core.prior.FermiDirac(name='test', unit='unit', sigma=1.) + bilby.core.prior.FermiDirac(name="test", unit="unit", sigma=1.0) with self.assertRaises(ValueError): - bilby.core.prior.FermiDirac(name='test', unit='unit', sigma=1., mu=-1) + bilby.core.prior.FermiDirac(name="test", unit="unit", sigma=1.0, mu=-1) def test_probability_in_domain(self): """Test that the prior probability is non-negative in domain of validity and zero outside.""" @@ -500,8 +650,12 @@ class TestPriorClasses(unittest.TestCase): if isinstance(prior, bilby.core.prior.DeltaFunction): continue surround_domain = np.linspace(prior.minimum - 1, prior.maximum + 1, 1000) - indomain = (surround_domain >= prior.minimum) | (surround_domain <= prior.maximum) - outdomain = (surround_domain < prior.minimum) | (surround_domain > prior.maximum) + indomain = (surround_domain >= prior.minimum) | ( + surround_domain <= prior.maximum + ) + outdomain = (surround_domain < prior.minimum) | ( + surround_domain > prior.maximum + ) if bilby.core.prior.JointPrior in prior.__class__.__mro__: if not prior.dist.filled_request(): continue @@ -524,17 +678,17 @@ class TestPriorClasses(unittest.TestCase): elif isinstance(prior, bilby.core.prior.StudentT): domain = np.linspace(-1e2, 1e2, 1000) elif isinstance(prior, bilby.core.prior.HalfGaussian): - domain = np.linspace(0., 1e2, 1000) + domain = np.linspace(0.0, 1e2, 1000) elif isinstance(prior, bilby.core.prior.Gamma): - domain = np.linspace(0., 1e2, 5000) + domain = np.linspace(0.0, 1e2, 5000) elif isinstance(prior, bilby.core.prior.LogNormal): - domain = np.linspace(0., 1e2, 1000) + domain = np.linspace(0.0, 1e2, 1000) elif isinstance(prior, bilby.core.prior.Exponential): - domain = np.linspace(0., 1e2, 5000) + domain = np.linspace(0.0, 1e2, 5000) elif isinstance(prior, bilby.core.prior.Logistic): domain = np.linspace(-1e2, 1e2, 1000) elif isinstance(prior, bilby.core.prior.FermiDirac): - domain = np.linspace(0., 1e2, 1000) + domain = np.linspace(0.0, 1e2, 1000) else: domain = np.linspace(prior.minimum, prior.maximum, 1000) self.assertAlmostEqual(np.trapz(prior.prob(domain), domain), 1, 3) @@ -567,21 +721,22 @@ class TestPriorClasses(unittest.TestCase): scipy_lnprob = ss.t.logpdf(domain, 3, loc=0, scale=1) scipy_cdf = ss.t.cdf(domain, 3, loc=0, scale=1) scipy_rescale = ss.t.ppf(rescale_domain, 3, loc=0, scale=1) - elif (isinstance(prior, bilby.core.prior.Gamma) and - not isinstance(prior, bilby.core.prior.ChiSquared)): - domain = np.linspace(0., 1e2, 5000) + elif isinstance(prior, bilby.core.prior.Gamma) and not isinstance( + prior, bilby.core.prior.ChiSquared + ): + domain = np.linspace(0.0, 1e2, 5000) scipy_prob = ss.gamma.pdf(domain, 1, loc=0, scale=1) scipy_lnprob = ss.gamma.logpdf(domain, 1, loc=0, scale=1) scipy_cdf = ss.gamma.cdf(domain, 1, loc=0, scale=1) scipy_rescale = ss.gamma.ppf(rescale_domain, 1, loc=0, scale=1) elif isinstance(prior, bilby.core.prior.LogNormal): - domain = np.linspace(0., 1e2, 1000) + domain = np.linspace(0.0, 1e2, 1000) scipy_prob = ss.lognorm.pdf(domain, 1, scale=1) scipy_lnprob = ss.lognorm.logpdf(domain, 1, scale=1) scipy_cdf = ss.lognorm.cdf(domain, 1, scale=1) scipy_rescale = ss.lognorm.ppf(rescale_domain, 1, scale=1) elif isinstance(prior, bilby.core.prior.Exponential): - domain = np.linspace(0., 1e2, 5000) + domain = np.linspace(0.0, 1e2, 5000) scipy_prob = ss.expon.pdf(domain, scale=1) scipy_lnprob = ss.expon.logpdf(domain, scale=1) scipy_cdf = ss.expon.cdf(domain, scale=1) @@ -593,7 +748,7 @@ class TestPriorClasses(unittest.TestCase): scipy_cdf = ss.logistic.cdf(domain, loc=0, scale=1) scipy_rescale = ss.logistic.ppf(rescale_domain, loc=0, scale=1) elif isinstance(prior, bilby.core.prior.ChiSquared): - domain = np.linspace(0., 1e2, 5000) + domain = np.linspace(0.0, 1e2, 5000) scipy_prob = ss.gamma.pdf(domain, 1, loc=0, scale=2) scipy_lnprob = ss.gamma.logpdf(domain, 1, loc=0, scale=2) scipy_cdf = ss.gamma.cdf(domain, 1, loc=0, scale=2) @@ -607,23 +762,30 @@ class TestPriorClasses(unittest.TestCase): else: continue testTuple = ( - bilby.core.prior.Uniform, bilby.core.prior.Gaussian, - bilby.core.prior.Cauchy, bilby.core.prior.StudentT, - bilby.core.prior.Exponential, bilby.core.prior.Logistic, - bilby.core.prior.LogNormal, bilby.core.prior.Gamma, - bilby.core.prior.Beta) + bilby.core.prior.Uniform, + bilby.core.prior.Gaussian, + bilby.core.prior.Cauchy, + bilby.core.prior.StudentT, + bilby.core.prior.Exponential, + bilby.core.prior.Logistic, + bilby.core.prior.LogNormal, + bilby.core.prior.Gamma, + bilby.core.prior.Beta, + ) if isinstance(prior, (testTuple)): np.testing.assert_almost_equal(prior.prob(domain), scipy_prob) np.testing.assert_almost_equal(prior.ln_prob(domain), scipy_lnprob) np.testing.assert_almost_equal(prior.cdf(domain), scipy_cdf) - np.testing.assert_almost_equal(prior.rescale(rescale_domain), scipy_rescale) + np.testing.assert_almost_equal( + prior.rescale(rescale_domain), scipy_rescale + ) def test_unit_setting(self): for prior in self.priors: if isinstance(prior, bilby.gw.prior.Cosmological): self.assertEqual(None, prior.unit) else: - self.assertEqual('unit', prior.unit) + self.assertEqual("unit", prior.unit) def test_eq_different_classes(self): for i in range(len(self.priors)): @@ -634,19 +796,31 @@ class TestPriorClasses(unittest.TestCase): self.assertNotEqual(self.priors[i], self.priors[j]) def test_eq_other_condition(self): - prior_1 = bilby.core.prior.PowerLaw(name='test', unit='unit', alpha=0, minimum=0, maximum=1) - prior_2 = bilby.core.prior.PowerLaw(name='test', unit='unit', alpha=0, minimum=0, maximum=1.5) + prior_1 = bilby.core.prior.PowerLaw( + name="test", unit="unit", alpha=0, minimum=0, maximum=1 + ) + prior_2 = bilby.core.prior.PowerLaw( + name="test", unit="unit", alpha=0, minimum=0, maximum=1.5 + ) self.assertNotEqual(prior_1, prior_2) def test_eq_different_keys(self): - prior_1 = bilby.core.prior.PowerLaw(name='test', unit='unit', alpha=0, minimum=0, maximum=1) - prior_2 = bilby.core.prior.PowerLaw(name='test', unit='unit', alpha=0, minimum=0, maximum=1) + prior_1 = bilby.core.prior.PowerLaw( + name="test", unit="unit", alpha=0, minimum=0, maximum=1 + ) + prior_2 = bilby.core.prior.PowerLaw( + name="test", unit="unit", alpha=0, minimum=0, maximum=1 + ) prior_2.other_key = 5 self.assertNotEqual(prior_1, prior_2) def test_np_array_eq(self): - prior_1 = bilby.core.prior.PowerLaw(name='test', unit='unit', alpha=0, minimum=0, maximum=1) - prior_2 = bilby.core.prior.PowerLaw(name='test', unit='unit', alpha=0, minimum=0, maximum=1) + prior_1 = bilby.core.prior.PowerLaw( + name="test", unit="unit", alpha=0, minimum=0, maximum=1 + ) + prior_2 = bilby.core.prior.PowerLaw( + name="test", unit="unit", alpha=0, minimum=0, maximum=1 + ) prior_1.array_attribute = np.array([1, 2, 3]) prior_2.array_attribute = np.array([2, 2, 3]) self.assertNotEqual(prior_1, prior_2) @@ -656,65 +830,92 @@ class TestPriorClasses(unittest.TestCase): if isinstance(prior, bilby.core.prior.Interped): continue # we cannot test this because of the numpy arrays elif isinstance(prior, bilby.core.prior.MultivariateGaussian): - repr_prior_string = 'bilby.core.prior.' + repr(prior) + repr_prior_string = "bilby.core.prior." + repr(prior) repr_prior_string = repr_prior_string.replace( - 'MultivariateGaussianDist', - 'bilby.core.prior.MultivariateGaussianDist' + "MultivariateGaussianDist", + "bilby.core.prior.MultivariateGaussianDist", ) elif isinstance(prior, bilby.gw.prior.HealPixPrior): - repr_prior_string = 'bilby.gw.prior.'+repr(prior) - repr_prior_string = repr_prior_string.replace('HealPixMapPriorDist', - 'bilby.gw.prior.HealPixMapPriorDist') + repr_prior_string = "bilby.gw.prior." + repr(prior) + repr_prior_string = repr_prior_string.replace( + "HealPixMapPriorDist", "bilby.gw.prior.HealPixMapPriorDist" + ) elif isinstance(prior, bilby.gw.prior.UniformComovingVolume): - repr_prior_string = 'bilby.gw.prior.' + repr(prior) - elif 'Conditional' in prior.__class__.__name__: - continue # This feature does not exist because we cannot recreate the condition function + repr_prior_string = "bilby.gw.prior." + repr(prior) + elif "Conditional" in prior.__class__.__name__: + continue # This feature does not exist because we cannot recreate the condition function else: - repr_prior_string = 'bilby.core.prior.' + repr(prior) + repr_prior_string = "bilby.core.prior." + repr(prior) repr_prior = eval(repr_prior_string, None, dict(inf=np.inf)) self.assertEqual(prior, repr_prior) def test_set_maximum_setting(self): for prior in self.priors: - if isinstance(prior, ( - bilby.core.prior.DeltaFunction, bilby.core.prior.Gaussian, - bilby.core.prior.HalfGaussian, bilby.core.prior.LogNormal, - bilby.core.prior.Exponential, bilby.core.prior.StudentT, - bilby.core.prior.Logistic, bilby.core.prior.Cauchy, - bilby.core.prior.Gamma, bilby.core.prior.MultivariateGaussian, - bilby.core.prior.FermiDirac, bilby.gw.prior.HealPixPrior)): + if isinstance( + prior, + ( + bilby.core.prior.DeltaFunction, + bilby.core.prior.Gaussian, + bilby.core.prior.HalfGaussian, + bilby.core.prior.LogNormal, + bilby.core.prior.Exponential, + bilby.core.prior.StudentT, + bilby.core.prior.Logistic, + bilby.core.prior.Cauchy, + bilby.core.prior.Gamma, + bilby.core.prior.MultivariateGaussian, + bilby.core.prior.FermiDirac, + bilby.gw.prior.HealPixPrior, + ), + ): continue prior.maximum = (prior.maximum + prior.minimum) / 2 self.assertTrue(max(prior.sample(10000)) < prior.maximum) def test_set_minimum_setting(self): for prior in self.priors: - if isinstance(prior, ( - bilby.core.prior.DeltaFunction, bilby.core.prior.Gaussian, - bilby.core.prior.HalfGaussian, bilby.core.prior.LogNormal, - bilby.core.prior.Exponential, bilby.core.prior.StudentT, - bilby.core.prior.Logistic, bilby.core.prior.Cauchy, - bilby.core.prior.Gamma, bilby.core.prior.MultivariateGaussian, - bilby.core.prior.FermiDirac, bilby.gw.prior.HealPixPrior)): + if isinstance( + prior, + ( + bilby.core.prior.DeltaFunction, + bilby.core.prior.Gaussian, + bilby.core.prior.HalfGaussian, + bilby.core.prior.LogNormal, + bilby.core.prior.Exponential, + bilby.core.prior.StudentT, + bilby.core.prior.Logistic, + bilby.core.prior.Cauchy, + bilby.core.prior.Gamma, + bilby.core.prior.MultivariateGaussian, + bilby.core.prior.FermiDirac, + bilby.gw.prior.HealPixPrior, + ), + ): continue prior.minimum = (prior.maximum + prior.minimum) / 2 self.assertTrue(min(prior.sample(10000)) > prior.minimum) class TestPriorDict(unittest.TestCase): - def setUp(self): - self.first_prior = bilby.core.prior.Uniform(name='a', minimum=0, maximum=1, unit='kg', boundary=None) - self.second_prior = bilby.core.prior.PowerLaw(name='b', alpha=3, minimum=1, maximum=2, unit='m/s', - boundary=None) - self.third_prior = bilby.core.prior.DeltaFunction(name='c', peak=42, unit='m') - self.priors = dict(mass=self.first_prior, - speed=self.second_prior, - length=self.third_prior) + self.first_prior = bilby.core.prior.Uniform( + name="a", minimum=0, maximum=1, unit="kg", boundary=None + ) + self.second_prior = bilby.core.prior.PowerLaw( + name="b", alpha=3, minimum=1, maximum=2, unit="m/s", boundary=None + ) + self.third_prior = bilby.core.prior.DeltaFunction(name="c", peak=42, unit="m") + self.priors = dict( + mass=self.first_prior, speed=self.second_prior, length=self.third_prior + ) self.prior_set_from_dict = bilby.core.prior.PriorDict(dictionary=self.priors) - self.default_prior_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), - 'prior_files/binary_black_holes.prior') - self.prior_set_from_file = bilby.core.prior.PriorDict(filename=self.default_prior_file) + self.default_prior_file = os.path.join( + os.path.dirname(os.path.realpath(__file__)), + "prior_files/binary_black_holes.prior", + ) + self.prior_set_from_file = bilby.core.prior.PriorDict( + filename=self.default_prior_file + ) def tearDown(self): del self.first_prior @@ -746,30 +947,59 @@ class TestPriorDict(unittest.TestCase): def test_read_from_file(self): expected = dict( mass_1=bilby.core.prior.Uniform( - name='mass_1', minimum=5, maximum=100, unit='$M_{\\odot}$', boundary=None), + name="mass_1", + minimum=5, + maximum=100, + unit="$M_{\\odot}$", + boundary=None, + ), mass_2=bilby.core.prior.Uniform( - name='mass_2', minimum=5, maximum=100, unit='$M_{\\odot}$', boundary=None), - mass_ratio=bilby.core.prior.Constraint(name='mass_ratio', minimum=0.125, maximum=1, latex_label='$q$', - unit=None), - a_1=bilby.core.prior.Uniform(name='a_1', minimum=0, maximum=0.8, boundary='reflective'), - a_2=bilby.core.prior.Uniform(name='a_2', minimum=0, maximum=0.8, boundary='reflective'), - tilt_1=bilby.core.prior.Sine(name='tilt_1', boundary='reflective'), - tilt_2=bilby.core.prior.Sine(name='tilt_2', boundary='reflective'), + name="mass_2", + minimum=5, + maximum=100, + unit="$M_{\\odot}$", + boundary=None, + ), + mass_ratio=bilby.core.prior.Constraint( + name="mass_ratio", + minimum=0.125, + maximum=1, + latex_label="$q$", + unit=None, + ), + a_1=bilby.core.prior.Uniform( + name="a_1", minimum=0, maximum=0.8, boundary="reflective" + ), + a_2=bilby.core.prior.Uniform( + name="a_2", minimum=0, maximum=0.8, boundary="reflective" + ), + tilt_1=bilby.core.prior.Sine(name="tilt_1", boundary="reflective"), + tilt_2=bilby.core.prior.Sine(name="tilt_2", boundary="reflective"), phi_12=bilby.core.prior.Uniform( - name='phi_12', minimum=0, maximum=2 * np.pi, boundary='periodic'), + name="phi_12", minimum=0, maximum=2 * np.pi, boundary="periodic" + ), phi_jl=bilby.core.prior.Uniform( - name='phi_jl', minimum=0, maximum=2 * np.pi, boundary='periodic'), + name="phi_jl", minimum=0, maximum=2 * np.pi, boundary="periodic" + ), luminosity_distance=bilby.gw.prior.UniformSourceFrame( - name='luminosity_distance', minimum=1e2, - maximum=5e3, unit='Mpc', boundary=None), - dec=bilby.core.prior.Cosine(name='dec', boundary='reflective'), + name="luminosity_distance", + minimum=1e2, + maximum=5e3, + unit="Mpc", + boundary=None, + ), + dec=bilby.core.prior.Cosine(name="dec", boundary="reflective"), ra=bilby.core.prior.Uniform( - name='ra', minimum=0, maximum=2 * np.pi, boundary='periodic'), - theta_jn=bilby.core.prior.Sine(name='theta_jn', boundary='reflective'), - psi=bilby.core.prior.Uniform(name='psi', minimum=0, maximum=np.pi, boundary='periodic'), + name="ra", minimum=0, maximum=2 * np.pi, boundary="periodic" + ), + theta_jn=bilby.core.prior.Sine(name="theta_jn", boundary="reflective"), + psi=bilby.core.prior.Uniform( + name="psi", minimum=0, maximum=np.pi, boundary="periodic" + ), phase=bilby.core.prior.Uniform( - name='phase', minimum=0, maximum=2 * np.pi, boundary='periodic') - ) + name="phase", minimum=0, maximum=2 * np.pi, boundary="periodic" + ), + ) self.assertDictEqual(expected, self.prior_set_from_file) def test_to_file(self): @@ -778,37 +1008,46 @@ class TestPriorDict(unittest.TestCase): necessarily the same order as python2 doesn't conserve the order of the arguments. """ - expected = ["length = DeltaFunction(peak=42, name='c', latex_label='c', unit='m')\n", - "speed = PowerLaw(alpha=3, minimum=1, maximum=2, name='b', latex_label='b', " - "unit='m/s', boundary=None)\n", - "mass = Uniform(minimum=0, maximum=1, name='a', latex_label='a', " - "unit='kg', boundary=None)\n"] - self.prior_set_from_dict.to_file(outdir='prior_files', label='to_file_test') - with open('prior_files/to_file_test.prior') as f: + expected = [ + "length = DeltaFunction(peak=42, name='c', latex_label='c', unit='m')\n", + "speed = PowerLaw(alpha=3, minimum=1, maximum=2, name='b', latex_label='b', " + "unit='m/s', boundary=None)\n", + "mass = Uniform(minimum=0, maximum=1, name='a', latex_label='a', " + "unit='kg', boundary=None)\n", + ] + self.prior_set_from_dict.to_file(outdir="prior_files", label="to_file_test") + with open("prior_files/to_file_test.prior") as f: for i, line in enumerate(f.readlines()): - self.assertTrue(any([ - sorted(line) == sorted(expect) for expect in expected])) + self.assertTrue( + any([sorted(line) == sorted(expect) for expect in expected]) + ) def test_from_dict_with_string(self): - string_prior = "PowerLaw(name='b', alpha=3, minimum=1, maximum=2, unit='m/s', " \ - "boundary=None)" - self.priors['speed'] = string_prior + string_prior = ( + "PowerLaw(name='b', alpha=3, minimum=1, maximum=2, unit='m/s', " + "boundary=None)" + ) + self.priors["speed"] = string_prior from_dict = bilby.core.prior.PriorDict(dictionary=self.priors) self.assertDictEqual(self.prior_set_from_dict, from_dict) def test_convert_floats_to_delta_functions(self): - self.prior_set_from_dict['d'] = 5 - self.prior_set_from_dict['e'] = 7.3 - self.prior_set_from_dict['f'] = 'unconvertable' + self.prior_set_from_dict["d"] = 5 + self.prior_set_from_dict["e"] = 7.3 + self.prior_set_from_dict["f"] = "unconvertable" self.prior_set_from_dict.convert_floats_to_delta_functions() - expected = dict(mass=bilby.core.prior.Uniform(name='a', minimum=0, maximum=1, unit='kg', - boundary=None), - speed=bilby.core.prior.PowerLaw(name='b', alpha=3, minimum=1, maximum=2, unit='m/s', - boundary=None), - length=bilby.core.prior.DeltaFunction(name='c', peak=42, unit='m'), - d=bilby.core.prior.DeltaFunction(peak=5), - e=bilby.core.prior.DeltaFunction(peak=7.3), - f='unconvertable') + expected = dict( + mass=bilby.core.prior.Uniform( + name="a", minimum=0, maximum=1, unit="kg", boundary=None + ), + speed=bilby.core.prior.PowerLaw( + name="b", alpha=3, minimum=1, maximum=2, unit="m/s", boundary=None + ), + length=bilby.core.prior.DeltaFunction(name="c", peak=42, unit="m"), + d=bilby.core.prior.DeltaFunction(peak=5), + e=bilby.core.prior.DeltaFunction(peak=7.3), + f="unconvertable", + ) self.assertDictEqual(expected, self.prior_set_from_dict) def test_prior_set_from_dict_but_using_a_string(self): @@ -816,29 +1055,58 @@ class TestPriorDict(unittest.TestCase): expected = bilby.core.prior.PriorDict( dict( mass_1=bilby.core.prior.Uniform( - name='mass_1', minimum=5, maximum=100, unit='$M_{\\odot}$', boundary=None), + name="mass_1", + minimum=5, + maximum=100, + unit="$M_{\\odot}$", + boundary=None, + ), mass_2=bilby.core.prior.Uniform( - name='mass_2', minimum=5, maximum=100, unit='$M_{\\odot}$', boundary=None), - mass_ratio=bilby.core.prior.Constraint(name='mass_ratio', minimum=0.125, maximum=1, latex_label='$q$', - unit=None), - a_1=bilby.core.prior.Uniform(name='a_1', minimum=0, maximum=0.8, boundary='reflective'), - a_2=bilby.core.prior.Uniform(name='a_2', minimum=0, maximum=0.8, boundary='reflective'), - tilt_1=bilby.core.prior.Sine(name='tilt_1', boundary='reflective'), - tilt_2=bilby.core.prior.Sine(name='tilt_2', boundary='reflective'), + name="mass_2", + minimum=5, + maximum=100, + unit="$M_{\\odot}$", + boundary=None, + ), + mass_ratio=bilby.core.prior.Constraint( + name="mass_ratio", + minimum=0.125, + maximum=1, + latex_label="$q$", + unit=None, + ), + a_1=bilby.core.prior.Uniform( + name="a_1", minimum=0, maximum=0.8, boundary="reflective" + ), + a_2=bilby.core.prior.Uniform( + name="a_2", minimum=0, maximum=0.8, boundary="reflective" + ), + tilt_1=bilby.core.prior.Sine(name="tilt_1", boundary="reflective"), + tilt_2=bilby.core.prior.Sine(name="tilt_2", boundary="reflective"), phi_12=bilby.core.prior.Uniform( - name='phi_12', minimum=0, maximum=2 * np.pi, boundary='periodic'), + name="phi_12", minimum=0, maximum=2 * np.pi, boundary="periodic" + ), phi_jl=bilby.core.prior.Uniform( - name='phi_jl', minimum=0, maximum=2 * np.pi, boundary='periodic'), + name="phi_jl", minimum=0, maximum=2 * np.pi, boundary="periodic" + ), luminosity_distance=bilby.gw.prior.UniformSourceFrame( - name='luminosity_distance', minimum=1e2, - maximum=5e3, unit='Mpc', boundary=None), - dec=bilby.core.prior.Cosine(name='dec', boundary='reflective'), + name="luminosity_distance", + minimum=1e2, + maximum=5e3, + unit="Mpc", + boundary=None, + ), + dec=bilby.core.prior.Cosine(name="dec", boundary="reflective"), ra=bilby.core.prior.Uniform( - name='ra', minimum=0, maximum=2 * np.pi, boundary='periodic'), - theta_jn=bilby.core.prior.Sine(name='theta_jn', boundary='reflective'), - psi=bilby.core.prior.Uniform(name='psi', minimum=0, maximum=np.pi, boundary='periodic'), + name="ra", minimum=0, maximum=2 * np.pi, boundary="periodic" + ), + theta_jn=bilby.core.prior.Sine(name="theta_jn", boundary="reflective"), + psi=bilby.core.prior.Uniform( + name="psi", minimum=0, maximum=np.pi, boundary="periodic" + ), phase=bilby.core.prior.Uniform( - name='phase', minimum=0, maximum=2 * np.pi, boundary='periodic') + name="phase", minimum=0, maximum=2 * np.pi, boundary="periodic" + ), ) ) all_keys = set(prior_set.keys()).union(set(expected.keys())) @@ -851,21 +1119,25 @@ class TestPriorDict(unittest.TestCase): def test_sample_subset_correct_size(self): size = 7 - samples = self.prior_set_from_dict.sample_subset(keys=self.prior_set_from_dict.keys(), size=size) + samples = self.prior_set_from_dict.sample_subset( + keys=self.prior_set_from_dict.keys(), size=size + ) self.assertEqual(len(self.prior_set_from_dict), len(samples)) for key in samples: self.assertEqual(size, len(samples[key])) def test_sample_subset_correct_size_when_non_priors_in_dict(self): - self.prior_set_from_dict['asdf'] = 'not_a_prior' - samples = self.prior_set_from_dict.sample_subset(keys=self.prior_set_from_dict.keys()) + self.prior_set_from_dict["asdf"] = "not_a_prior" + samples = self.prior_set_from_dict.sample_subset( + keys=self.prior_set_from_dict.keys() + ) self.assertEqual(len(self.prior_set_from_dict) - 1, len(samples)) def test_sample_subset_with_actual_subset(self): size = 3 - samples = self.prior_set_from_dict.sample_subset(keys=['length'], size=size) - expected = dict(length=np.array([42., 42., 42.])) - self.assertTrue(np.array_equal(expected['length'], samples['length'])) + samples = self.prior_set_from_dict.sample_subset(keys=["length"], size=size) + expected = dict(length=np.array([42.0, 42.0, 42.0])) + self.assertTrue(np.array_equal(expected["length"], samples["length"])) def test_sample_subset_constrained_as_array(self): size = 3 @@ -877,7 +1149,9 @@ class TestPriorDict(unittest.TestCase): def test_sample(self): size = 7 np.random.seed(42) - samples1 = self.prior_set_from_dict.sample_subset(keys=self.prior_set_from_dict.keys(), size=size) + samples1 = self.prior_set_from_dict.sample_subset( + keys=self.prior_set_from_dict.keys(), size=size + ) np.random.seed(42) samples2 = self.prior_set_from_dict.sample(size=size) self.assertEqual(set(samples1.keys()), set(samples2.keys())) @@ -885,22 +1159,34 @@ class TestPriorDict(unittest.TestCase): self.assertTrue(np.array_equal(samples1[key], samples2[key])) def test_prob(self): - samples = self.prior_set_from_dict.sample_subset(keys=['mass', 'speed']) - expected = self.first_prior.prob(samples['mass']) * self.second_prior.prob(samples['speed']) + samples = self.prior_set_from_dict.sample_subset(keys=["mass", "speed"]) + expected = self.first_prior.prob(samples["mass"]) * self.second_prior.prob( + samples["speed"] + ) self.assertEqual(expected, self.prior_set_from_dict.prob(samples)) def test_ln_prob(self): - samples = self.prior_set_from_dict.sample_subset(keys=['mass', 'speed']) - expected = self.first_prior.ln_prob(samples['mass']) + self.second_prior.ln_prob(samples['speed']) + samples = self.prior_set_from_dict.sample_subset(keys=["mass", "speed"]) + expected = self.first_prior.ln_prob( + samples["mass"] + ) + self.second_prior.ln_prob(samples["speed"]) self.assertEqual(expected, self.prior_set_from_dict.ln_prob(samples)) def test_rescale(self): theta = [0.5, 0.5, 0.5] - expected = [self.first_prior.rescale(0.5), - self.second_prior.rescale(0.5), - self.third_prior.rescale(0.5)] - self.assertListEqual(sorted(expected), sorted(self.prior_set_from_dict.rescale( - keys=self.prior_set_from_dict.keys(), theta=theta))) + expected = [ + self.first_prior.rescale(0.5), + self.second_prior.rescale(0.5), + self.third_prior.rescale(0.5), + ] + self.assertListEqual( + sorted(expected), + sorted( + self.prior_set_from_dict.rescale( + keys=self.prior_set_from_dict.keys(), theta=theta + ) + ), + ) def test_redundancy(self): for key in self.prior_set_from_dict.keys(): @@ -909,50 +1195,61 @@ class TestPriorDict(unittest.TestCase): class TestConstraintPriorNormalisation(unittest.TestCase): def setUp(self): - self.priors = dict(mass_1=bilby.core.prior.Uniform(name='mass_1', minimum=5, maximum=10, unit='$M_{\odot}$', - boundary=None), - mass_2=bilby.core.prior.Uniform(name='mass_2', minimum=5, maximum=10, unit='$M_{\odot}$', - boundary=None), - mass_ratio=bilby.core.prior.Constraint(name='mass_ratio', minimum=0, maximum=1)) + self.priors = dict( + mass_1=bilby.core.prior.Uniform( + name="mass_1", minimum=5, maximum=10, unit="$M_{\odot}$", boundary=None + ), + mass_2=bilby.core.prior.Uniform( + name="mass_2", minimum=5, maximum=10, unit="$M_{\odot}$", boundary=None + ), + mass_ratio=bilby.core.prior.Constraint( + name="mass_ratio", minimum=0, maximum=1 + ), + ) self.priors = bilby.core.prior.PriorDict(self.priors) def test_prob_integrate_to_one(self): - keys = ['mass_1', 'mass_2', 'mass_ratio'] + keys = ["mass_1", "mass_2", "mass_ratio"] n = 5000 samples = self.priors.sample_subset(keys=keys, size=n) prob = self.priors.prob(samples, axis=0) - dm1 = self.priors['mass_1'].maximum - self.priors['mass_1'].minimum - dm2 = self.priors['mass_2'].maximum - self.priors['mass_2'].minimum - integral = np.sum(prob * (dm1 * dm2)) / len(samples['mass_1']) + dm1 = self.priors["mass_1"].maximum - self.priors["mass_1"].minimum + dm2 = self.priors["mass_2"].maximum - self.priors["mass_2"].minimum + integral = np.sum(prob * (dm1 * dm2)) / len(samples["mass_1"]) self.assertAlmostEqual(1, integral, 5) class TestLoadPrior(unittest.TestCase): def test_load_prior_with_float(self): - filename = os.path.join(os.path.dirname(os.path.realpath(__file__)), - 'prior_files/prior_with_floats.prior') + filename = os.path.join( + os.path.dirname(os.path.realpath(__file__)), + "prior_files/prior_with_floats.prior", + ) prior = bilby.core.prior.PriorDict(filename) self.assertTrue("mass_1" in prior) self.assertTrue("mass_2" in prior) - self.assertTrue(prior['mass_2'].peak == 20) + self.assertTrue(prior["mass_2"].peak == 20) def test_load_prior_with_parentheses(self): - filename = os.path.join(os.path.dirname(os.path.realpath(__file__)), - 'prior_files/prior_with_parentheses.prior') + filename = os.path.join( + os.path.dirname(os.path.realpath(__file__)), + "prior_files/prior_with_parentheses.prior", + ) prior = bilby.core.prior.PriorDict(filename) - self.assertTrue(isinstance(prior['logA'], bilby.core.prior.Uniform)) + self.assertTrue(isinstance(prior["logA"], bilby.core.prior.Uniform)) class TestFillPrior(unittest.TestCase): - def setUp(self): self.likelihood = Mock() self.likelihood.parameters = dict(a=0, b=0, c=0, d=0, asdf=0, ra=1) self.likelihood.non_standard_sampling_parameter_keys = dict(t=8) self.priors = dict(a=1, b=1.1, c="string", d=bilby.core.prior.Uniform(0, 1)) self.priors = bilby.core.prior.PriorDict(dictionary=self.priors) - self.default_prior_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), - 'prior_files/binary_black_holes.prior') + self.default_prior_file = os.path.join( + os.path.dirname(os.path.realpath(__file__)), + "prior_files/binary_black_holes.prior", + ) self.priors.fill_priors(self.likelihood, self.default_prior_file) def tearDown(self): @@ -960,61 +1257,76 @@ class TestFillPrior(unittest.TestCase): del self.priors def test_prior_instances_are_not_changed_by_parsing(self): - self.assertIsInstance(self.priors['d'], bilby.core.prior.Uniform) + self.assertIsInstance(self.priors["d"], bilby.core.prior.Uniform) def test_parsing_ints_to_delta_priors_class(self): - self.assertIsInstance(self.priors['a'], bilby.core.prior.DeltaFunction) + self.assertIsInstance(self.priors["a"], bilby.core.prior.DeltaFunction) def test_parsing_ints_to_delta_priors_with_right_value(self): - self.assertEqual(self.priors['a'].peak, 1) + self.assertEqual(self.priors["a"].peak, 1) def test_parsing_floats_to_delta_priors_class(self): - self.assertIsInstance(self.priors['b'], bilby.core.prior.DeltaFunction) + self.assertIsInstance(self.priors["b"], bilby.core.prior.DeltaFunction) def test_parsing_floats_to_delta_priors_with_right_value(self): - self.assertAlmostEqual(self.priors['b'].peak, 1.1, 1e-8) + self.assertAlmostEqual(self.priors["b"].peak, 1.1, 1e-8) def test_without_available_default_priors_no_prior_is_set(self): with self.assertRaises(KeyError): - print(self.priors['asdf']) + print(self.priors["asdf"]) def test_with_available_default_priors_a_default_prior_is_set(self): - self.assertIsInstance(self.priors['ra'], bilby.core.prior.Uniform) + self.assertIsInstance(self.priors["ra"], bilby.core.prior.Uniform) class TestCreateDefaultPrior(unittest.TestCase): - def test_none_behaviour(self): - self.assertIsNone(bilby.core.prior.create_default_prior(name='name', default_priors_file=None)) + self.assertIsNone( + bilby.core.prior.create_default_prior(name="name", default_priors_file=None) + ) def test_bbh_params(self): - prior_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'prior_files/binary_black_holes.prior') + prior_file = os.path.join( + os.path.dirname(os.path.realpath(__file__)), + "prior_files/binary_black_holes.prior", + ) prior_set = bilby.core.prior.PriorDict(filename=prior_file) for prior in prior_set: - self.assertEqual(prior_set[prior], bilby.core.prior.create_default_prior(name=prior, - default_priors_file=prior_file)) + self.assertEqual( + prior_set[prior], + bilby.core.prior.create_default_prior( + name=prior, default_priors_file=prior_file + ), + ) def test_unknown_prior(self): - prior_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'prior_files/binary_black_holes.prior') - self.assertIsNone(bilby.core.prior.create_default_prior(name='name', default_priors_file=prior_file)) + prior_file = os.path.join( + os.path.dirname(os.path.realpath(__file__)), + "prior_files/binary_black_holes.prior", + ) + self.assertIsNone( + bilby.core.prior.create_default_prior( + name="name", default_priors_file=prior_file + ) + ) class TestConditionalPrior(unittest.TestCase): - def setUp(self): self.condition_func_call_counter = 0 def condition_func(reference_parameters, test_variable_1, test_variable_2): self.condition_func_call_counter += 1 return {key: value + 1 for key, value in reference_parameters.items()} + self.condition_func = condition_func self.minimum = 0 self.maximum = 5 self.test_variable_1 = 0 self.test_variable_2 = 1 - self.prior = bilby.core.prior.ConditionalBasePrior(condition_func=condition_func, - minimum=self.minimum, - maximum=self.maximum) + self.prior = bilby.core.prior.ConditionalBasePrior( + condition_func=condition_func, minimum=self.minimum, maximum=self.maximum + ) def tearDown(self): del self.condition_func @@ -1026,34 +1338,51 @@ class TestConditionalPrior(unittest.TestCase): del self.prior def test_reference_params(self): - self.assertDictEqual(dict(minimum=self.minimum, maximum=self.maximum), self.prior.reference_params) + self.assertDictEqual( + dict(minimum=self.minimum, maximum=self.maximum), + self.prior.reference_params, + ) def test_required_variables(self): - self.assertListEqual(['test_variable_1', 'test_variable_2'], sorted(self.prior.required_variables)) + self.assertListEqual( + ["test_variable_1", "test_variable_2"], + sorted(self.prior.required_variables), + ) def test_required_variables_no_condition_func(self): - self.prior = bilby.core.prior.ConditionalBasePrior(condition_func=None, - minimum=self.minimum, - maximum=self.maximum) + self.prior = bilby.core.prior.ConditionalBasePrior( + condition_func=None, minimum=self.minimum, maximum=self.maximum + ) self.assertListEqual([], self.prior.required_variables) def test_get_instantiation_dict(self): - expected = dict(minimum=0, maximum=5, name=None, latex_label=None, unit=None, - boundary=None, condition_func=self.condition_func) + expected = dict( + minimum=0, + maximum=5, + name=None, + latex_label=None, + unit=None, + boundary=None, + condition_func=self.condition_func, + ) actual = self.prior.get_instantiation_dict() for key, value in expected.items(): - if key == 'condition_func': + if key == "condition_func": continue self.assertEqual(value, actual[key]) def test_update_conditions_correct_variables(self): - self.prior.update_conditions(test_variable_1=self.test_variable_1, test_variable_2=self.test_variable_2) + self.prior.update_conditions( + test_variable_1=self.test_variable_1, test_variable_2=self.test_variable_2 + ) self.assertEqual(1, self.condition_func_call_counter) self.assertEqual(self.minimum + 1, self.prior.minimum) self.assertEqual(self.maximum + 1, self.prior.maximum) def test_update_conditions_no_variables(self): - self.prior.update_conditions(test_variable_1=self.test_variable_1, test_variable_2=self.test_variable_2) + self.prior.update_conditions( + test_variable_1=self.test_variable_1, test_variable_2=self.test_variable_2 + ) self.prior.update_conditions() self.assertEqual(1, self.condition_func_call_counter) self.assertEqual(self.minimum + 1, self.prior.minimum) @@ -1064,49 +1393,72 @@ class TestConditionalPrior(unittest.TestCase): self.prior.update_conditions(test_parameter_1=self.test_variable_1) def test_sample_calls_update_conditions(self): - with mock.patch.object(self.prior, 'update_conditions') as m: - self.prior.sample(1, - test_parameter_1=self.test_variable_1, - test_parameter_2=self.test_variable_2) - m.assert_called_with(test_parameter_1=self.test_variable_1, test_parameter_2=self.test_variable_2) + with mock.patch.object(self.prior, "update_conditions") as m: + self.prior.sample( + 1, + test_parameter_1=self.test_variable_1, + test_parameter_2=self.test_variable_2, + ) + m.assert_called_with( + test_parameter_1=self.test_variable_1, + test_parameter_2=self.test_variable_2, + ) def test_rescale_calls_update_conditions(self): - with mock.patch.object(self.prior, 'update_conditions') as m: - self.prior.rescale(1, test_parameter_1=self.test_variable_1, - test_parameter_2=self.test_variable_2) - m.assert_called_with(test_parameter_1=self.test_variable_1, - test_parameter_2=self.test_variable_2) + with mock.patch.object(self.prior, "update_conditions") as m: + self.prior.rescale( + 1, + test_parameter_1=self.test_variable_1, + test_parameter_2=self.test_variable_2, + ) + m.assert_called_with( + test_parameter_1=self.test_variable_1, + test_parameter_2=self.test_variable_2, + ) def test_rescale_prob_update_conditions(self): - with mock.patch.object(self.prior, 'update_conditions') as m: - self.prior.prob(1, test_parameter_1=self.test_variable_1, - test_parameter_2=self.test_variable_2) - m.assert_called_with(test_parameter_1=self.test_variable_1, - test_parameter_2=self.test_variable_2) + with mock.patch.object(self.prior, "update_conditions") as m: + self.prior.prob( + 1, + test_parameter_1=self.test_variable_1, + test_parameter_2=self.test_variable_2, + ) + m.assert_called_with( + test_parameter_1=self.test_variable_1, + test_parameter_2=self.test_variable_2, + ) def test_rescale_ln_prob_update_conditions(self): - with mock.patch.object(self.prior, 'update_conditions') as m: - self.prior.ln_prob(1, test_parameter_1=self.test_variable_1, - test_parameter_2=self.test_variable_2) - calls = [mock.call(test_parameter_1=self.test_variable_1, - test_parameter_2=self.test_variable_2), - mock.call()] + with mock.patch.object(self.prior, "update_conditions") as m: + self.prior.ln_prob( + 1, + test_parameter_1=self.test_variable_1, + test_parameter_2=self.test_variable_2, + ) + calls = [ + mock.call( + test_parameter_1=self.test_variable_1, + test_parameter_2=self.test_variable_2, + ), + mock.call(), + ] m.assert_has_calls(calls) def test_reset_to_reference_parameters(self): self.prior.minimum = 10 self.prior.maximum = 20 self.prior.reset_to_reference_parameters() - self.assertEqual(self.prior.reference_params['minimum'], self.prior.minimum) - self.assertEqual(self.prior.reference_params['maximum'], self.prior.maximum) + self.assertEqual(self.prior.reference_params["minimum"], self.prior.minimum) + self.assertEqual(self.prior.reference_params["maximum"], self.prior.maximum) def test_cond_prior_instantiation_no_boundary_prior(self): - prior = bilby.core.prior.ConditionalFermiDirac(condition_func=None, sigma=1, mu=1) + prior = bilby.core.prior.ConditionalFermiDirac( + condition_func=None, sigma=1, mu=1 + ) self.assertIsNone(prior.boundary) class TestConditionalPriorDict(unittest.TestCase): - def setUp(self): def condition_func_1(reference_parameters, var_0): return reference_parameters @@ -1119,18 +1471,36 @@ class TestConditionalPriorDict(unittest.TestCase): self.minimum = 0 self.maximum = 1 - self.prior_0 = bilby.core.prior.Uniform(minimum=self.minimum, maximum=self.maximum) - self.prior_1 = bilby.core.prior.ConditionalUniform(condition_func=condition_func_1, - minimum=self.minimum, maximum=self.maximum) - self.prior_2 = bilby.core.prior.ConditionalUniform(condition_func=condition_func_2, - minimum=self.minimum, maximum=self.maximum) - self.prior_3 = bilby.core.prior.ConditionalUniform(condition_func=condition_func_3, - minimum=self.minimum, maximum=self.maximum) - self.conditional_priors = bilby.core.prior.ConditionalPriorDict(dict(var_3=self.prior_3, var_2=self.prior_2, - var_0=self.prior_0, var_1=self.prior_1)) - self.conditional_priors_manually_set_items = bilby.core.prior.ConditionalPriorDict() + self.prior_0 = bilby.core.prior.Uniform( + minimum=self.minimum, maximum=self.maximum + ) + self.prior_1 = bilby.core.prior.ConditionalUniform( + condition_func=condition_func_1, minimum=self.minimum, maximum=self.maximum + ) + self.prior_2 = bilby.core.prior.ConditionalUniform( + condition_func=condition_func_2, minimum=self.minimum, maximum=self.maximum + ) + self.prior_3 = bilby.core.prior.ConditionalUniform( + condition_func=condition_func_3, minimum=self.minimum, maximum=self.maximum + ) + self.conditional_priors = bilby.core.prior.ConditionalPriorDict( + dict( + var_3=self.prior_3, + var_2=self.prior_2, + var_0=self.prior_0, + var_1=self.prior_1, + ) + ) + self.conditional_priors_manually_set_items = ( + bilby.core.prior.ConditionalPriorDict() + ) self.test_sample = dict(var_0=0.3, var_1=0.4, var_2=0.5, var_3=0.4) - for key, value in dict(var_0=self.prior_0, var_1=self.prior_1, var_2=self.prior_2, var_3=self.prior_3).items(): + for key, value in dict( + var_0=self.prior_0, + var_1=self.prior_1, + var_2=self.prior_2, + var_3=self.prior_3, + ).items(): self.conditional_priors_manually_set_items[key] = value def tearDown(self): @@ -1145,29 +1515,40 @@ class TestConditionalPriorDict(unittest.TestCase): del self.test_sample def test_conditions_resolved_upon_instantiation(self): - self.assertListEqual(['var_0', 'var_1', 'var_2', 'var_3'], self.conditional_priors.sorted_keys) + self.assertListEqual( + ["var_0", "var_1", "var_2", "var_3"], self.conditional_priors.sorted_keys + ) def test_conditions_resolved_setting_items(self): - self.assertListEqual(['var_0', 'var_1', 'var_2', 'var_3'], - self.conditional_priors_manually_set_items.sorted_keys) + self.assertListEqual( + ["var_0", "var_1", "var_2", "var_3"], + self.conditional_priors_manually_set_items.sorted_keys, + ) def test_unconditional_keys_upon_instantiation(self): - self.assertListEqual(['var_0'], self.conditional_priors.unconditional_keys) + self.assertListEqual(["var_0"], self.conditional_priors.unconditional_keys) def test_unconditional_keys_setting_items(self): - self.assertListEqual(['var_0'], self.conditional_priors_manually_set_items.unconditional_keys) + self.assertListEqual( + ["var_0"], self.conditional_priors_manually_set_items.unconditional_keys + ) def test_conditional_keys_upon_instantiation(self): - self.assertListEqual(['var_1', 'var_2', 'var_3'], self.conditional_priors.conditional_keys) + self.assertListEqual( + ["var_1", "var_2", "var_3"], self.conditional_priors.conditional_keys + ) def test_conditional_keys_setting_items(self): - self.assertListEqual(['var_1', 'var_2', 'var_3'], self.conditional_priors_manually_set_items.conditional_keys) + self.assertListEqual( + ["var_1", "var_2", "var_3"], + self.conditional_priors_manually_set_items.conditional_keys, + ) def test_prob(self): self.assertEqual(1, self.conditional_priors.prob(sample=self.test_sample)) def test_prob_illegal_conditions(self): - del self.conditional_priors['var_0'] + del self.conditional_priors["var_0"] with self.assertRaises(bilby.core.prior.IllegalConditionsException): self.conditional_priors.prob(sample=self.test_sample) @@ -1175,156 +1556,238 @@ class TestConditionalPriorDict(unittest.TestCase): self.assertEqual(0, self.conditional_priors.ln_prob(sample=self.test_sample)) def test_ln_prob_illegal_conditions(self): - del self.conditional_priors['var_0'] + del self.conditional_priors["var_0"] with self.assertRaises(bilby.core.prior.IllegalConditionsException): self.conditional_priors.ln_prob(sample=self.test_sample) def test_sample_subset_all_keys(self): with mock.patch("numpy.random.uniform") as m: m.return_value = 0.5 - self.assertDictEqual(dict(var_0=0.5, var_1=0.5, var_2=0.5, var_3=0.5), - self.conditional_priors.sample_subset(keys=['var_0', 'var_1', 'var_2', 'var_3'])) + self.assertDictEqual( + dict(var_0=0.5, var_1=0.5, var_2=0.5, var_3=0.5), + self.conditional_priors.sample_subset( + keys=["var_0", "var_1", "var_2", "var_3"] + ), + ) def test_sample_illegal_subset(self): with mock.patch("numpy.random.uniform") as m: m.return_value = 0.5 with self.assertRaises(bilby.core.prior.IllegalConditionsException): - self.conditional_priors.sample_subset(keys=['var_1']) + self.conditional_priors.sample_subset(keys=["var_1"]) def test_sample_multiple(self): def condition_func(reference_params, a): - return dict(minimum=reference_params['minimum'], - maximum=reference_params['maximum'], - alpha=reference_params['alpha'] * a) + return dict( + minimum=reference_params["minimum"], + maximum=reference_params["maximum"], + alpha=reference_params["alpha"] * a, + ) + priors = bilby.core.prior.ConditionalPriorDict() - priors['a'] = bilby.core.prior.Uniform(minimum=0, maximum=1) - priors['b'] = bilby.core.prior.ConditionalPowerLaw(condition_func=condition_func, minimum=1, maximum=2, - alpha=-2) + priors["a"] = bilby.core.prior.Uniform(minimum=0, maximum=1) + priors["b"] = bilby.core.prior.ConditionalPowerLaw( + condition_func=condition_func, minimum=1, maximum=2, alpha=-2 + ) print(priors.sample(2)) def test_rescale(self): - def condition_func_1_rescale(reference_parameters, var_0): if var_0 == 0.5: - return dict(minimum=reference_parameters['minimum'], maximum=1) + return dict(minimum=reference_parameters["minimum"], maximum=1) return reference_parameters def condition_func_2_rescale(reference_parameters, var_0, var_1): if var_0 == 0.5 and var_1 == 0.5: - return dict(minimum=reference_parameters['minimum'], maximum=1) + return dict(minimum=reference_parameters["minimum"], maximum=1) return reference_parameters def condition_func_3_rescale(reference_parameters, var_1, var_2): if var_1 == 0.5 and var_2 == 0.5: - return dict(minimum=reference_parameters['minimum'], maximum=1) + return dict(minimum=reference_parameters["minimum"], maximum=1) return reference_parameters self.prior_0 = bilby.core.prior.Uniform(minimum=self.minimum, maximum=1) - self.prior_1 = bilby.core.prior.ConditionalUniform(condition_func=condition_func_1_rescale, - minimum=self.minimum, maximum=2) - self.prior_2 = bilby.core.prior.ConditionalUniform(condition_func=condition_func_2_rescale, - minimum=self.minimum, maximum=2) - self.prior_3 = bilby.core.prior.ConditionalUniform(condition_func=condition_func_3_rescale, - minimum=self.minimum, maximum=2) - self.conditional_priors = bilby.core.prior.ConditionalPriorDict(dict(var_3=self.prior_3, var_2=self.prior_2, - var_0=self.prior_0, var_1=self.prior_1)) + self.prior_1 = bilby.core.prior.ConditionalUniform( + condition_func=condition_func_1_rescale, minimum=self.minimum, maximum=2 + ) + self.prior_2 = bilby.core.prior.ConditionalUniform( + condition_func=condition_func_2_rescale, minimum=self.minimum, maximum=2 + ) + self.prior_3 = bilby.core.prior.ConditionalUniform( + condition_func=condition_func_3_rescale, minimum=self.minimum, maximum=2 + ) + self.conditional_priors = bilby.core.prior.ConditionalPriorDict( + dict( + var_3=self.prior_3, + var_2=self.prior_2, + var_0=self.prior_0, + var_1=self.prior_1, + ) + ) ref_variables = [0.5, 0.5, 0.5, 0.5] - res = self.conditional_priors.rescale(keys=list(self.test_sample.keys()), - theta=ref_variables) + res = self.conditional_priors.rescale( + keys=list(self.test_sample.keys()), theta=ref_variables + ) self.assertListEqual(ref_variables, res) def test_rescale_illegal_conditions(self): - del self.conditional_priors['var_0'] + del self.conditional_priors["var_0"] with self.assertRaises(bilby.core.prior.IllegalConditionsException): - self.conditional_priors.rescale(keys=list(self.test_sample.keys()), theta=list(self.test_sample.values())) + self.conditional_priors.rescale( + keys=list(self.test_sample.keys()), + theta=list(self.test_sample.values()), + ) def test_combined_conditions(self): def d_condition_func(reference_params, a, b, c): - return dict(minimum=reference_params['minimum'], maximum=reference_params['maximum']) + return dict( + minimum=reference_params["minimum"], maximum=reference_params["maximum"] + ) def a_condition_func(reference_params, b, c): - return dict(minimum=reference_params['minimum'], maximum=reference_params['maximum']) + return dict( + minimum=reference_params["minimum"], maximum=reference_params["maximum"] + ) priors = bilby.core.prior.ConditionalPriorDict() - priors['a'] = bilby.core.prior.ConditionalUniform(condition_func=a_condition_func, - minimum=0, maximum=1) + priors["a"] = bilby.core.prior.ConditionalUniform( + condition_func=a_condition_func, minimum=0, maximum=1 + ) - priors['b'] = bilby.core.prior.LogUniform(minimum=1, maximum=10) + priors["b"] = bilby.core.prior.LogUniform(minimum=1, maximum=10) - priors['d'] = bilby.core.prior.ConditionalUniform(condition_func=d_condition_func, - minimum=0.0, maximum=1.0) + priors["d"] = bilby.core.prior.ConditionalUniform( + condition_func=d_condition_func, minimum=0.0, maximum=1.0 + ) - priors['c'] = bilby.core.prior.LogUniform(minimum=1, maximum=10) - sample = priors.sample() - res = priors.rescale(['a', 'b', 'd', 'c'], [0.5, 0.5, 0.5, 0.5]) + priors["c"] = bilby.core.prior.LogUniform(minimum=1, maximum=10) + priors.sample() + res = priors.rescale(["a", "b", "d", "c"], [0.5, 0.5, 0.5, 0.5]) print(res) class TestJsonIO(unittest.TestCase): - def setUp(self): - mvg = bilby.core.prior.MultivariateGaussianDist(names=['testa', 'testb'], - mus=[1, 1], - covs=np.array([[2., 0.5], [0.5, 2.]]), - weights=1.) - mvn = bilby.core.prior.MultivariateGaussianDist(names=['testa', 'testb'], - mus=[1, 1], - covs=np.array([[2., 0.5], [0.5, 2.]]), - weights=1.) - hp_map_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), - 'prior_files/GW150914_testing_skymap.fits') - hp_dist = bilby.gw.prior.HealPixMapPriorDist(hp_map_file, - names=['testra', 'testdec']) - hp_3d_dist = bilby.gw.prior.HealPixMapPriorDist(hp_map_file, - names=['testra', 'testdec', 'testdistance'], distance=True) - - self.priors = bilby.core.prior.PriorDict(dict( - a=bilby.core.prior.DeltaFunction(name='test', unit='unit', peak=1), - b=bilby.core.prior.Gaussian(name='test', unit='unit', mu=0, sigma=1), - c=bilby.core.prior.Normal(name='test', unit='unit', mu=0, sigma=1), - d=bilby.core.prior.PowerLaw(name='test', unit='unit', alpha=0, minimum=0, maximum=1), - e=bilby.core.prior.PowerLaw(name='test', unit='unit', alpha=-1, minimum=0.5, maximum=1), - f=bilby.core.prior.PowerLaw(name='test', unit='unit', alpha=2, minimum=1, maximum=1e2), - g=bilby.core.prior.Uniform(name='test', unit='unit', minimum=0, maximum=1), - h=bilby.core.prior.LogUniform(name='test', unit='unit', minimum=5e0, maximum=1e2), - i=bilby.gw.prior.UniformComovingVolume(name='redshift', minimum=0.1, maximum=1.0), - j=bilby.gw.prior.UniformSourceFrame(name='luminosity_distance', minimum=1.0, maximum=1000.0), - k=bilby.core.prior.Sine(name='test', unit='unit'), - l=bilby.core.prior.Cosine(name='test', unit='unit'), - m=bilby.core.prior.Interped(name='test', unit='unit', xx=np.linspace(0, 10, 1000), - yy=np.linspace(0, 10, 1000) ** 4, - minimum=3, maximum=5), - n=bilby.core.prior.TruncatedGaussian(name='test', unit='unit', mu=1, sigma=0.4, minimum=-1, maximum=1), - o=bilby.core.prior.TruncatedNormal(name='test', unit='unit', mu=1, sigma=0.4, minimum=-1, maximum=1), - p=bilby.core.prior.HalfGaussian(name='test', unit='unit', sigma=1), - q=bilby.core.prior.HalfNormal(name='test', unit='unit', sigma=1), - r=bilby.core.prior.LogGaussian(name='test', unit='unit', mu=0, sigma=1), - s=bilby.core.prior.LogNormal(name='test', unit='unit', mu=0, sigma=1), - t=bilby.core.prior.Exponential(name='test', unit='unit', mu=1), - u=bilby.core.prior.StudentT(name='test', unit='unit', df=3, mu=0, scale=1), - v=bilby.core.prior.Beta(name='test', unit='unit', alpha=2.0, beta=2.0), - x=bilby.core.prior.Logistic(name='test', unit='unit', mu=0, scale=1), - y=bilby.core.prior.Cauchy(name='test', unit='unit', alpha=0, beta=1), - z=bilby.core.prior.Lorentzian(name='test', unit='unit', alpha=0, beta=1), - aa=bilby.core.prior.Gamma(name='test', unit='unit', k=1, theta=1), - ab=bilby.core.prior.ChiSquared(name='test', unit='unit', nu=2), - ac=bilby.gw.prior.AlignedSpin(name='test', unit='unit'), - ad=bilby.core.prior.MultivariateGaussian(dist=mvg, name='testa', unit='unit'), - ae=bilby.core.prior.MultivariateGaussian(dist=mvg, name='testb', unit='unit'), - af=bilby.core.prior.MultivariateNormal(dist=mvn, name='testa', unit='unit'), - ag=bilby.core.prior.MultivariateNormal(dist=mvn, name='testb', unit='unit'), - ah=bilby.gw.prior.HealPixPrior(dist=hp_dist, name='testra', unit='unit'), - ai=bilby.gw.prior.HealPixPrior(dist=hp_dist, name='testdec', unit='unit'), - aj=bilby.gw.prior.HealPixPrior(dist=hp_3d_dist, name='testra', unit='unit'), - ak=bilby.gw.prior.HealPixPrior(dist=hp_3d_dist, name='testdec', unit='unit'), - al=bilby.gw.prior.HealPixPrior(dist=hp_3d_dist, name='testdistance', unit='unit') - )) + mvg = bilby.core.prior.MultivariateGaussianDist( + names=["testa", "testb"], + mus=[1, 1], + covs=np.array([[2.0, 0.5], [0.5, 2.0]]), + weights=1.0, + ) + mvn = bilby.core.prior.MultivariateGaussianDist( + names=["testa", "testb"], + mus=[1, 1], + covs=np.array([[2.0, 0.5], [0.5, 2.0]]), + weights=1.0, + ) + hp_map_file = os.path.join( + os.path.dirname(os.path.realpath(__file__)), + "prior_files/GW150914_testing_skymap.fits", + ) + hp_dist = bilby.gw.prior.HealPixMapPriorDist( + hp_map_file, names=["testra", "testdec"] + ) + hp_3d_dist = bilby.gw.prior.HealPixMapPriorDist( + hp_map_file, names=["testra", "testdec", "testdistance"], distance=True + ) + + self.priors = bilby.core.prior.PriorDict( + dict( + aa=bilby.core.prior.DeltaFunction(name="test", unit="unit", peak=1), + bb=bilby.core.prior.Gaussian(name="test", unit="unit", mu=0, sigma=1), + cc=bilby.core.prior.Normal(name="test", unit="unit", mu=0, sigma=1), + dd=bilby.core.prior.PowerLaw( + name="test", unit="unit", alpha=0, minimum=0, maximum=1 + ), + ee=bilby.core.prior.PowerLaw( + name="test", unit="unit", alpha=-1, minimum=0.5, maximum=1 + ), + ff=bilby.core.prior.PowerLaw( + name="test", unit="unit", alpha=2, minimum=1, maximum=1e2 + ), + gg=bilby.core.prior.Uniform( + name="test", unit="unit", minimum=0, maximum=1 + ), + hh=bilby.core.prior.LogUniform( + name="test", unit="unit", minimum=5e0, maximum=1e2 + ), + ii=bilby.gw.prior.UniformComovingVolume( + name="redshift", minimum=0.1, maximum=1.0 + ), + jj=bilby.gw.prior.UniformSourceFrame( + name="luminosity_distance", minimum=1.0, maximum=1000.0 + ), + kk=bilby.core.prior.Sine(name="test", unit="unit"), + ll=bilby.core.prior.Cosine(name="test", unit="unit"), + m=bilby.core.prior.Interped( + name="test", + unit="unit", + xx=np.linspace(0, 10, 1000), + yy=np.linspace(0, 10, 1000) ** 4, + minimum=3, + maximum=5, + ), + nn=bilby.core.prior.TruncatedGaussian( + name="test", unit="unit", mu=1, sigma=0.4, minimum=-1, maximum=1 + ), + oo=bilby.core.prior.TruncatedNormal( + name="test", unit="unit", mu=1, sigma=0.4, minimum=-1, maximum=1 + ), + pp=bilby.core.prior.HalfGaussian(name="test", unit="unit", sigma=1), + qq=bilby.core.prior.HalfNormal(name="test", unit="unit", sigma=1), + rr=bilby.core.prior.LogGaussian(name="test", unit="unit", mu=0, sigma=1), + ss=bilby.core.prior.LogNormal(name="test", unit="unit", mu=0, sigma=1), + tt=bilby.core.prior.Exponential(name="test", unit="unit", mu=1), + uu=bilby.core.prior.StudentT( + name="test", unit="unit", df=3, mu=0, scale=1 + ), + vv=bilby.core.prior.Beta(name="test", unit="unit", alpha=2.0, beta=2.0), + xx=bilby.core.prior.Logistic(name="test", unit="unit", mu=0, scale=1), + yy=bilby.core.prior.Cauchy(name="test", unit="unit", alpha=0, beta=1), + zz=bilby.core.prior.Lorentzian( + name="test", unit="unit", alpha=0, beta=1 + ), + a_=bilby.core.prior.Gamma(name="test", unit="unit", k=1, theta=1), + ab=bilby.core.prior.ChiSquared(name="test", unit="unit", nu=2), + ac=bilby.gw.prior.AlignedSpin(name="test", unit="unit"), + ad=bilby.core.prior.MultivariateGaussian( + dist=mvg, name="testa", unit="unit" + ), + ae=bilby.core.prior.MultivariateGaussian( + dist=mvg, name="testb", unit="unit" + ), + af=bilby.core.prior.MultivariateNormal( + dist=mvn, name="testa", unit="unit" + ), + ag=bilby.core.prior.MultivariateNormal( + dist=mvn, name="testb", unit="unit" + ), + ah=bilby.gw.prior.HealPixPrior( + dist=hp_dist, name="testra", unit="unit" + ), + ai=bilby.gw.prior.HealPixPrior( + dist=hp_dist, name="testdec", unit="unit" + ), + aj=bilby.gw.prior.HealPixPrior( + dist=hp_3d_dist, name="testra", unit="unit" + ), + ak=bilby.gw.prior.HealPixPrior( + dist=hp_3d_dist, name="testdec", unit="unit" + ), + al=bilby.gw.prior.HealPixPrior( + dist=hp_3d_dist, name="testdistance", unit="unit" + ), + ) + ) def test_read_write_to_json(self): """ Interped prior is removed as there is numerical error in the recovered prior.""" self.priors.to_json(outdir="prior_files", label="json_test") - new_priors = bilby.core.prior.PriorDict.from_json(filename="prior_files/json_test_prior.json") + new_priors = bilby.core.prior.PriorDict.from_json( + filename="prior_files/json_test_prior.json" + ) old_interped = self.priors.pop("m") new_interped = new_priors.pop("m") self.assertDictEqual(self.priors, new_priors) @@ -1332,5 +1795,5 @@ class TestJsonIO(unittest.TestCase): self.assertLess(max(abs(old_interped.yy - new_interped.yy)), 1e-15) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/test/proposal_test.py b/test/proposal_test.py index 798f78d69b57515f00e2272c8b903ed6ee4e80d8..8af0df18511ff6d3b3d46c3da7d441f95468607b 100644 --- a/test/proposal_test.py +++ b/test/proposal_test.py @@ -10,7 +10,6 @@ from bilby.core.sampler import proposal class TestSample(unittest.TestCase): - def setUp(self): self.sample = proposal.Sample(dict(a=1, c=2)) @@ -34,17 +33,28 @@ class TestSample(unittest.TestCase): class TestJumpProposal(unittest.TestCase): - def setUp(self): - self.priors = prior.PriorDict(dict(reflective=prior.Uniform(minimum=-0.5, maximum=1, boundary='reflective'), - periodic=prior.Uniform(minimum=-0.5, maximum=1, boundary='periodic'), - default=prior.Uniform(minimum=-0.5, maximum=1))) + self.priors = prior.PriorDict( + dict( + reflective=prior.Uniform( + minimum=-0.5, maximum=1, boundary="reflective" + ), + periodic=prior.Uniform(minimum=-0.5, maximum=1, boundary="periodic"), + default=prior.Uniform(minimum=-0.5, maximum=1), + ) + ) self.sample_above = dict(reflective=1.1, periodic=1.1, default=1.1) self.sample_below = dict(reflective=-0.6, periodic=-0.6, default=-0.6) self.sample_way_above_case1 = dict(reflective=272, periodic=272, default=272) - self.sample_way_above_case2 = dict(reflective=270.1, periodic=270.1, default=270.1) - self.sample_way_below_case1 = dict(reflective=-274, periodic=-274.1, default=-274) - self.sample_way_below_case2 = dict(reflective=-273.1, periodic=-273.1, default=-273.1) + self.sample_way_above_case2 = dict( + reflective=270.1, periodic=270.1, default=270.1 + ) + self.sample_way_below_case1 = dict( + reflective=-274, periodic=-274.1, default=-274 + ) + self.sample_way_below_case2 = dict( + reflective=-273.1, periodic=-273.1, default=-273.1 + ) self.jump_proposal = proposal.JumpProposal(priors=self.priors) def tearDown(self): @@ -63,62 +73,65 @@ class TestJumpProposal(unittest.TestCase): def test_boundary_above_reflective(self): new_sample = self.jump_proposal(self.sample_above) - self.assertAlmostEqual(0.9, new_sample['reflective']) + self.assertAlmostEqual(0.9, new_sample["reflective"]) def test_boundary_above_periodic(self): new_sample = self.jump_proposal(self.sample_above) - self.assertAlmostEqual(-0.4, new_sample['periodic']) + self.assertAlmostEqual(-0.4, new_sample["periodic"]) def test_boundary_above_default(self): new_sample = self.jump_proposal(self.sample_above) - self.assertAlmostEqual(1.1, new_sample['default']) + self.assertAlmostEqual(1.1, new_sample["default"]) def test_boundary_below_reflective(self): new_sample = self.jump_proposal(self.sample_below) - self.assertAlmostEqual(-0.4, new_sample['reflective']) + self.assertAlmostEqual(-0.4, new_sample["reflective"]) def test_boundary_below_periodic(self): new_sample = self.jump_proposal(self.sample_below) - self.assertAlmostEqual(0.9, new_sample['periodic']) + self.assertAlmostEqual(0.9, new_sample["periodic"]) def test_boundary_below_default(self): new_sample = self.jump_proposal(self.sample_below) - self.assertAlmostEqual(-0.6, new_sample['default']) + self.assertAlmostEqual(-0.6, new_sample["default"]) def test_boundary_way_below_reflective_case1(self): new_sample = self.jump_proposal(self.sample_way_below_case1) - self.assertAlmostEqual(0.0, new_sample['reflective']) + self.assertAlmostEqual(0.0, new_sample["reflective"]) def test_boundary_way_below_reflective_case2(self): new_sample = self.jump_proposal(self.sample_way_below_case2) - self.assertAlmostEqual(-0.1, new_sample['reflective']) + self.assertAlmostEqual(-0.1, new_sample["reflective"]) def test_boundary_way_below_periodic(self): new_sample = self.jump_proposal(self.sample_way_below_case2) - self.assertAlmostEqual(-0.1, new_sample['periodic']) + self.assertAlmostEqual(-0.1, new_sample["periodic"]) def test_boundary_way_above_reflective_case1(self): new_sample = self.jump_proposal(self.sample_way_above_case1) - self.assertAlmostEqual(0.0, new_sample['reflective']) + self.assertAlmostEqual(0.0, new_sample["reflective"]) def test_boundary_way_above_reflective_case2(self): new_sample = self.jump_proposal(self.sample_way_above_case2) - self.assertAlmostEqual(0.1, new_sample['reflective']) + self.assertAlmostEqual(0.1, new_sample["reflective"]) def test_boundary_way_above_periodic(self): new_sample = self.jump_proposal(self.sample_way_above_case2) - self.assertAlmostEqual(0.1, new_sample['periodic']) + self.assertAlmostEqual(0.1, new_sample["periodic"]) def test_priors(self): self.assertEqual(self.priors, self.jump_proposal.priors) class TestNormJump(unittest.TestCase): - def setUp(self): - self.priors = prior.PriorDict(dict(reflective=prior.Uniform(minimum=-0.5, maximum=1, boundary='periodic'), - periodic=prior.Uniform(minimum=-0.5, maximum=1, boundary='reflective'), - default=prior.Uniform(minimum=-0.5, maximum=1))) + self.priors = prior.PriorDict( + dict( + reflective=prior.Uniform(minimum=-0.5, maximum=1, boundary="periodic"), + periodic=prior.Uniform(minimum=-0.5, maximum=1, boundary="reflective"), + default=prior.Uniform(minimum=-0.5, maximum=1), + ) + ) self.jump_proposal = proposal.NormJump(step_size=3.0, priors=self.priors) def tearDown(self): @@ -142,13 +155,19 @@ class TestNormJump(unittest.TestCase): class TestEnsembleWalk(unittest.TestCase): - def setUp(self): - self.priors = prior.PriorDict(dict(reflective=prior.Uniform(minimum=-0.5, maximum=1, boundary='reflective'), - periodic=prior.Uniform(minimum=-0.5, maximum=1, boundary='periodic'), - default=prior.Uniform(minimum=-0.5, maximum=1))) - self.jump_proposal = proposal.EnsembleWalk(random_number_generator=random.random, - n_points=4, priors=self.priors) + self.priors = prior.PriorDict( + dict( + reflective=prior.Uniform( + minimum=-0.5, maximum=1, boundary="reflective" + ), + periodic=prior.Uniform(minimum=-0.5, maximum=1, boundary="periodic"), + default=prior.Uniform(minimum=-0.5, maximum=1), + ) + ) + self.jump_proposal = proposal.EnsembleWalk( + random_number_generator=random.random, n_points=4, priors=self.priors + ) def tearDown(self): del self.priors @@ -165,17 +184,22 @@ class TestEnsembleWalk(unittest.TestCase): self.assertEqual(random.random, self.jump_proposal.random_number_generator) def test_get_center_of_mass(self): - samples = [proposal.Sample(dict(reflective=0.1*i, periodic=0.1*i, default=0.1*i)) for i in range(3)] + samples = [ + proposal.Sample(dict(reflective=0.1 * i, periodic=0.1 * i, default=0.1 * i)) + for i in range(3) + ] expected = proposal.Sample(dict(reflective=0.1, periodic=0.1, default=0.1)) actual = self.jump_proposal.get_center_of_mass(samples) for key in samples[0].keys(): self.assertAlmostEqual(expected[key], actual[key]) def test_jump_proposal_call(self): - with mock.patch('random.sample') as m: + with mock.patch("random.sample") as m: self.jump_proposal.random_number_generator = lambda: 2 - m.return_value = [proposal.Sample(dict(periodic=0.3, reflective=0.3, default=0.3)), - proposal.Sample(dict(periodic=0.1, reflective=0.1, default=0.1))] + m.return_value = [ + proposal.Sample(dict(periodic=0.3, reflective=0.3, default=0.3)), + proposal.Sample(dict(periodic=0.1, reflective=0.1, default=0.1)), + ] sample = proposal.Sample(dict(periodic=0.1, reflective=0.1, default=0.1)) new_sample = self.jump_proposal(sample, coordinates=None) expected = proposal.Sample(dict(periodic=0.1, reflective=0.1, default=0.1)) @@ -184,11 +208,16 @@ class TestEnsembleWalk(unittest.TestCase): class TestEnsembleEnsembleStretch(unittest.TestCase): - def setUp(self): - self.priors = prior.PriorDict(dict(reflective=prior.Uniform(minimum=-0.5, maximum=1, boundary='reflective'), - periodic=prior.Uniform(minimum=-0.5, maximum=1, boundary='periodic'), - default=prior.Uniform(minimum=-0.5, maximum=1))) + self.priors = prior.PriorDict( + dict( + reflective=prior.Uniform( + minimum=-0.5, maximum=1, boundary="reflective" + ), + periodic=prior.Uniform(minimum=-0.5, maximum=1, boundary="periodic"), + default=prior.Uniform(minimum=-0.5, maximum=1), + ) + ) self.jump_proposal = proposal.EnsembleStretch(scale=3.0, priors=self.priors) def tearDown(self): @@ -203,41 +232,63 @@ class TestEnsembleEnsembleStretch(unittest.TestCase): self.assertEqual(5.0, self.jump_proposal.scale) def test_jump_proposal_call(self): - with mock.patch('random.choice') as m: - with mock.patch('random.uniform') as n: - second_sample = proposal.Sample(dict(periodic=0.3, reflective=0.3, default=0.3)) + with mock.patch("random.choice") as m: + with mock.patch("random.uniform") as n: + second_sample = proposal.Sample( + dict(periodic=0.3, reflective=0.3, default=0.3) + ) random_number = 0.5 m.return_value = second_sample n.return_value = random_number - sample = proposal.Sample(dict(periodic=0.1, reflective=0.1, default=0.1)) + sample = proposal.Sample( + dict(periodic=0.1, reflective=0.1, default=0.1) + ) new_sample = self.jump_proposal(sample, coordinates=None) - coords = 0.3 - 0.2 * np.exp(random_number * np.log(self.jump_proposal.scale)) - expected = proposal.Sample(dict(periodic=coords, reflective=coords, default=coords)) + coords = 0.3 - 0.2 * np.exp( + random_number * np.log(self.jump_proposal.scale) + ) + expected = proposal.Sample( + dict(periodic=coords, reflective=coords, default=coords) + ) for key, value in new_sample.items(): self.assertAlmostEqual(expected[key], value) def test_log_j_after_call(self): - with mock.patch('random.uniform') as m1: - with mock.patch('numpy.log') as m2: - with mock.patch('numpy.exp') as m3: + with mock.patch("random.uniform") as m1: + with mock.patch("numpy.log") as m2: + with mock.patch("numpy.exp") as m3: m1.return_value = 1 m2.return_value = 1 m3.return_value = 1 - coordinates = [proposal.Sample(dict(periodic=0.3, reflective=0.3, default=0.3)), - proposal.Sample(dict(periodic=0.3, reflective=0.3, default=0.3))] - sample = proposal.Sample(dict(periodic=0.2, reflective=0.2, default=0.2)) - self.jump_proposal(sample=sample, - coordinates=coordinates) + coordinates = [ + proposal.Sample( + dict(periodic=0.3, reflective=0.3, default=0.3) + ), + proposal.Sample( + dict(periodic=0.3, reflective=0.3, default=0.3) + ), + ] + sample = proposal.Sample( + dict(periodic=0.2, reflective=0.2, default=0.2) + ) + self.jump_proposal(sample=sample, coordinates=coordinates) self.assertEqual(3, self.jump_proposal.log_j) class TestDifferentialEvolution(unittest.TestCase): - def setUp(self): - self.priors = prior.PriorDict(dict(reflective=prior.Uniform(minimum=-0.5, maximum=1, boundary='reflective'), - periodic=prior.Uniform(minimum=-0.5, maximum=1, boundary='periodic'), - default=prior.Uniform(minimum=-0.5, maximum=1))) - self.jump_proposal = proposal.DifferentialEvolution(sigma=1e-3, mu=0.5, priors=self.priors) + self.priors = prior.PriorDict( + dict( + reflective=prior.Uniform( + minimum=-0.5, maximum=1, boundary="reflective" + ), + periodic=prior.Uniform(minimum=-0.5, maximum=1, boundary="periodic"), + default=prior.Uniform(minimum=-0.5, maximum=1), + ) + ) + self.jump_proposal = proposal.DifferentialEvolution( + sigma=1e-3, mu=0.5, priors=self.priors + ) def tearDown(self): del self.priors @@ -255,24 +306,35 @@ class TestDifferentialEvolution(unittest.TestCase): self.assertEqual(2, self.jump_proposal.sigma) def test_jump_proposal_call(self): - with mock.patch('random.sample') as m: - with mock.patch('random.gauss') as n: - m.return_value = proposal.Sample(dict(periodic=0.2, reflective=0.2, default=0.2)),\ - proposal.Sample(dict(periodic=0.3, reflective=0.3, default=0.3)) + with mock.patch("random.sample") as m: + with mock.patch("random.gauss") as n: + m.return_value = ( + proposal.Sample(dict(periodic=0.2, reflective=0.2, default=0.2)), + proposal.Sample(dict(periodic=0.3, reflective=0.3, default=0.3)), + ) n.return_value = 1 - sample = proposal.Sample(dict(periodic=0.1, reflective=0.1, default=0.1)) - expected = proposal.Sample(dict(periodic=0.2, reflective=0.2, default=0.2)) + sample = proposal.Sample( + dict(periodic=0.1, reflective=0.1, default=0.1) + ) + expected = proposal.Sample( + dict(periodic=0.2, reflective=0.2, default=0.2) + ) new_sample = self.jump_proposal(sample, coordinates=None) for key, value in new_sample.items(): self.assertAlmostEqual(expected[key], value) class TestEnsembleEigenVector(unittest.TestCase): - def setUp(self): - self.priors = prior.PriorDict(dict(reflective=prior.Uniform(minimum=-0.5, maximum=1, boundary='reflective'), - periodic=prior.Uniform(minimum=-0.5, maximum=1, boundary='periodic'), - default=prior.Uniform(minimum=-0.5, maximum=1))) + self.priors = prior.PriorDict( + dict( + reflective=prior.Uniform( + minimum=-0.5, maximum=1, boundary="reflective" + ), + periodic=prior.Uniform(minimum=-0.5, maximum=1, boundary="periodic"), + default=prior.Uniform(minimum=-0.5, maximum=1), + ) + ) self.jump_proposal = proposal.EnsembleEigenVector(priors=self.priors) def tearDown(self): @@ -292,62 +354,79 @@ class TestEnsembleEigenVector(unittest.TestCase): self.assertIsNone(self.jump_proposal.update_eigenvectors(coordinates=None)) def test_jump_proposal_update_eigenvectors_1_d(self): - coordinates = [proposal.Sample(dict(periodic=0.3)), proposal.Sample(dict(periodic=0.1))] - with mock.patch('numpy.var') as m: + coordinates = [ + proposal.Sample(dict(periodic=0.3)), + proposal.Sample(dict(periodic=0.1)), + ] + with mock.patch("numpy.var") as m: m.return_value = 1 self.jump_proposal.update_eigenvectors(coordinates) self.assertTrue(np.equal(np.array([1]), self.jump_proposal.eigen_values)) self.assertTrue(np.equal(np.array([1]), self.jump_proposal.covariance)) - self.assertTrue(np.equal(np.array([[1.]]), self.jump_proposal.eigen_vectors)) + self.assertTrue( + np.equal(np.array([[1.0]]), self.jump_proposal.eigen_vectors) + ) def test_jump_proposal_update_eigenvectors_n_d(self): - coordinates = [proposal.Sample(dict(periodic=0.3, reflective=0.3, default=0.3)), - proposal.Sample(dict(periodic=0.1, reflective=0.1, default=0.1))] - with mock.patch('numpy.cov') as m: - with mock.patch('numpy.linalg.eigh') as n: + coordinates = [ + proposal.Sample(dict(periodic=0.3, reflective=0.3, default=0.3)), + proposal.Sample(dict(periodic=0.1, reflective=0.1, default=0.1)), + ] + with mock.patch("numpy.cov") as m: + with mock.patch("numpy.linalg.eigh") as n: m.side_effect = lambda x: x n.return_value = 1, 2 self.jump_proposal.update_eigenvectors(coordinates) - self.assertTrue(np.array_equal(np.array([[0.3, 0.1], [0.3, 0.1], [0.3, 0.1]]), self.jump_proposal.covariance)) + self.assertTrue( + np.array_equal( + np.array([[0.3, 0.1], [0.3, 0.1], [0.3, 0.1]]), + self.jump_proposal.covariance, + ) + ) self.assertEqual(1, self.jump_proposal.eigen_values) self.assertEqual(2, self.jump_proposal.eigen_vectors) def test_jump_proposal_call(self): self.jump_proposal.update_eigenvectors = lambda x: None self.jump_proposal.eigen_values = np.array([1, np.nan, np.nan]) - self.jump_proposal.eigen_vectors = np.array([[0.1, np.nan, np.nan], - [0.4, np.nan, np.nan], - [0.7, np.nan, np.nan]]) - with mock.patch('random.randrange') as m: - with mock.patch('random.gauss') as n: + self.jump_proposal.eigen_vectors = np.array( + [[0.1, np.nan, np.nan], [0.4, np.nan, np.nan], [0.7, np.nan, np.nan]] + ) + with mock.patch("random.randrange") as m: + with mock.patch("random.gauss") as n: m.return_value = 0 n.return_value = 1 expected = proposal.Sample() - expected['periodic'] = 0.2 - expected['reflective'] = 0.5 - expected['default'] = 0.8 + expected["periodic"] = 0.2 + expected["reflective"] = 0.5 + expected["default"] = 0.8 sample = proposal.Sample() - sample['periodic'] = 0.1 - sample['reflective'] = 0.1 - sample['default'] = 0.1 + sample["periodic"] = 0.1 + sample["reflective"] = 0.1 + sample["default"] = 0.1 new_sample = self.jump_proposal(sample, coordinates=None) for key, value in new_sample.items(): self.assertAlmostEqual(expected[key], value) class TestSkyLocationWanderJump(unittest.TestCase): - def setUp(self): - self.priors = prior.PriorDict(dict(ra=prior.Uniform(minimum=0.0, maximum=2*np.pi, boundary='periodic'), - dec=prior.Uniform(minimum=0.0, maximum=np.pi, boundary='reflective'))) - self.jump_proposal = bilby.gw.sampler.proposal.SkyLocationWanderJump(priors=self.priors) + self.priors = prior.PriorDict( + dict( + ra=prior.Uniform(minimum=0.0, maximum=2 * np.pi, boundary="periodic"), + dec=prior.Uniform(minimum=0.0, maximum=np.pi, boundary="reflective"), + ) + ) + self.jump_proposal = bilby.gw.sampler.proposal.SkyLocationWanderJump( + priors=self.priors + ) def tearDown(self): del self.priors del self.jump_proposal def test_jump_proposal_call_without_inverse_temperature(self): - with mock.patch('random.gauss') as m: + with mock.patch("random.gauss") as m: m.return_value = 1 sample = proposal.Sample(dict(ra=0.2, dec=-0.5)) expected = proposal.Sample(dict(ra=1.2, dec=0.5)) @@ -357,7 +436,7 @@ class TestSkyLocationWanderJump(unittest.TestCase): m.assert_called_with(0, 1.0 / 2 / np.pi) def test_jump_proposal_call_with_inverse_temperature(self): - with mock.patch('random.gauss') as m: + with mock.patch("random.gauss") as m: m.return_value = 1 sample = proposal.Sample(dict(ra=0.2, dec=-0.5)) expected = proposal.Sample(dict(ra=1.2, dec=0.5)) @@ -368,41 +447,55 @@ class TestSkyLocationWanderJump(unittest.TestCase): class TestCorrelatedPolarisationPhaseJump(unittest.TestCase): - def setUp(self): - self.priors = prior.PriorDict(dict(phase=prior.Uniform(minimum=0.0, maximum=2*np.pi), - psi=prior.Uniform(minimum=0.0, maximum=np.pi))) - self.jump_proposal = bilby.gw.sampler.proposal.CorrelatedPolarisationPhaseJump(priors=self.priors) + self.priors = prior.PriorDict( + dict( + phase=prior.Uniform(minimum=0.0, maximum=2 * np.pi), + psi=prior.Uniform(minimum=0.0, maximum=np.pi), + ) + ) + self.jump_proposal = bilby.gw.sampler.proposal.CorrelatedPolarisationPhaseJump( + priors=self.priors + ) def tearDown(self): del self.priors del self.jump_proposal def test_jump_proposal_call_case_1(self): - with mock.patch('random.random') as m: + with mock.patch("random.random") as m: m.return_value = 0.3 sample = proposal.Sample(dict(phase=0.2, psi=0.5)) alpha = 3.0 * np.pi * 0.3 beta = 0.3 - expected = proposal.Sample(dict(phase=0.5*(alpha-beta), psi=0.5*(alpha+beta))) + expected = proposal.Sample( + dict(phase=0.5 * (alpha - beta), psi=0.5 * (alpha + beta)) + ) self.assertEqual(expected, self.jump_proposal(sample, coordinates=None)) def test_jump_proposal_call_case_2(self): - with mock.patch('random.random') as m: + with mock.patch("random.random") as m: m.return_value = 0.7 sample = proposal.Sample(dict(phase=0.2, psi=0.5)) alpha = 0.7 beta = 3.0 * np.pi * 0.7 - 2 * np.pi - expected = proposal.Sample(dict(phase=0.5*(alpha-beta), psi=0.5*(alpha+beta))) + expected = proposal.Sample( + dict(phase=0.5 * (alpha - beta), psi=0.5 * (alpha + beta)) + ) self.assertEqual(expected, self.jump_proposal(sample)) class TestPolarisationPhaseJump(unittest.TestCase): - def setUp(self): - self.priors = prior.PriorDict(dict(phase=prior.Uniform(minimum=0.0, maximum=2*np.pi), - psi=prior.Uniform(minimum=0.0, maximum=np.pi))) - self.jump_proposal = bilby.gw.sampler.proposal.PolarisationPhaseJump(priors=self.priors) + self.priors = prior.PriorDict( + dict( + phase=prior.Uniform(minimum=0.0, maximum=2 * np.pi), + psi=prior.Uniform(minimum=0.0, maximum=np.pi), + ) + ) + self.jump_proposal = bilby.gw.sampler.proposal.PolarisationPhaseJump( + priors=self.priors + ) def tearDown(self): del self.priors @@ -410,15 +503,18 @@ class TestPolarisationPhaseJump(unittest.TestCase): def test_jump_proposal_call(self): sample = proposal.Sample(dict(phase=0.2, psi=0.5)) - expected = proposal.Sample(dict(phase=0.2+np.pi, psi=0.5+np.pi/2)) + expected = proposal.Sample(dict(phase=0.2 + np.pi, psi=0.5 + np.pi / 2)) self.assertEqual(expected, self.jump_proposal(sample)) class TestDrawFlatPrior(unittest.TestCase): - def setUp(self): - self.priors = prior.PriorDict(dict(phase=prior.Uniform(minimum=0.0, maximum=2*np.pi), - psi=prior.Cosine(minimum=0.0, maximum=np.pi))) + self.priors = prior.PriorDict( + dict( + phase=prior.Uniform(minimum=0.0, maximum=2 * np.pi), + psi=prior.Cosine(minimum=0.0, maximum=np.pi), + ) + ) self.jump_proposal = proposal.DrawFlatPrior(priors=self.priors) def tearDown(self): @@ -426,7 +522,7 @@ class TestDrawFlatPrior(unittest.TestCase): del self.jump_proposal def test_jump_proposal_call(self): - with mock.patch('bilby.core.prior.Uniform.sample') as m: + with mock.patch("bilby.core.prior.Uniform.sample") as m: m.return_value = 0.3 sample = proposal.Sample(dict(phase=0.2, psi=0.5)) expected = proposal.Sample(dict(phase=0.3, psi=0.3)) diff --git a/test/result_test.py b/test/result_test.py index c49f2ad182a568eb2816cbb6b3f12982dfc29397..991456928c91324bd5c25d6ec4356a77c4c88a6b 100644 --- a/test/result_test.py +++ b/test/result_test.py @@ -11,7 +11,6 @@ import bilby class TestJson(unittest.TestCase): - def setUp(self): self.encoder = bilby.core.utils.BilbyJsonEncoder self.decoder = bilby.core.utils.decode_bilby_json @@ -21,55 +20,63 @@ class TestJson(unittest.TestCase): encoded = json.dumps(data, cls=self.encoder) decoded = json.loads(encoded, object_hook=self.decoder) self.assertEqual(data.keys(), decoded.keys()) - self.assertEqual(type(data['x']), type(decoded['x'])) - self.assertTrue(np.all(data['x'] == decoded['x'])) + self.assertEqual(type(data["x"]), type(decoded["x"])) + self.assertTrue(np.all(data["x"] == decoded["x"])) def test_array_encoding(self): data = dict(x=np.array([1, 2, 3.4])) encoded = json.dumps(data, cls=self.encoder) decoded = json.loads(encoded, object_hook=self.decoder) self.assertEqual(data.keys(), decoded.keys()) - self.assertEqual(type(data['x']), type(decoded['x'])) - self.assertTrue(np.all(data['x'] == decoded['x'])) + self.assertEqual(type(data["x"]), type(decoded["x"])) + self.assertTrue(np.all(data["x"] == decoded["x"])) def test_complex_encoding(self): data = dict(x=1 + 3j) encoded = json.dumps(data, cls=self.encoder) decoded = json.loads(encoded, object_hook=self.decoder) self.assertEqual(data.keys(), decoded.keys()) - self.assertEqual(type(data['x']), type(decoded['x'])) - self.assertTrue(np.all(data['x'] == decoded['x'])) + self.assertEqual(type(data["x"]), type(decoded["x"])) + self.assertTrue(np.all(data["x"] == decoded["x"])) def test_dataframe_encoding(self): data = dict(data=pd.DataFrame(dict(x=[3, 4, 5], y=[5, 6, 7]))) encoded = json.dumps(data, cls=self.encoder) decoded = json.loads(encoded, object_hook=self.decoder) self.assertEqual(data.keys(), decoded.keys()) - self.assertEqual(type(data['data']), type(decoded['data'])) - self.assertTrue(np.all(data['data']['x'] == decoded['data']['x'])) - self.assertTrue(np.all(data['data']['y'] == decoded['data']['y'])) + self.assertEqual(type(data["data"]), type(decoded["data"])) + self.assertTrue(np.all(data["data"]["x"] == decoded["data"]["x"])) + self.assertTrue(np.all(data["data"]["y"] == decoded["data"]["y"])) class TestResult(unittest.TestCase): - def setUp(self): np.random.seed(7) bilby.utils.command_line_args.bilby_test_mode = False - priors = bilby.prior.PriorDict(dict( - x=bilby.prior.Uniform(0, 1, 'x', latex_label='$x$', unit='s'), - y=bilby.prior.Uniform(0, 1, 'y', latex_label='$y$', unit='m'), - c=1, - d=2)) + priors = bilby.prior.PriorDict( + dict( + x=bilby.prior.Uniform(0, 1, "x", latex_label="$x$", unit="s"), + y=bilby.prior.Uniform(0, 1, "y", latex_label="$y$", unit="m"), + c=1, + d=2, + ) + ) result = bilby.core.result.Result( - label='label', outdir='outdir', sampler='nestle', - search_parameter_keys=['x', 'y'], fixed_parameter_keys=['c', 'd'], - priors=priors, sampler_kwargs=dict(test='test', func=lambda x: x), + label="label", + outdir="outdir", + sampler="nestle", + search_parameter_keys=["x", "y"], + fixed_parameter_keys=["c", "d"], + priors=priors, + sampler_kwargs=dict(test="test", func=lambda x: x), injection_parameters=dict(x=0.5, y=0.5), - meta_data=dict(test='test')) + meta_data=dict(test="test"), + ) n = 100 - posterior = pd.DataFrame(dict(x=np.random.normal(0, 1, n), - y=np.random.normal(0, 1, n))) + posterior = pd.DataFrame( + dict(x=np.random.normal(0, 1, n), y=np.random.normal(0, 1, n)) + ) result.posterior = posterior result.log_evidence = 10 result.log_evidence_err = 11 @@ -88,47 +95,63 @@ class TestResult(unittest.TestCase): pass def test_result_file_name_default(self): - outdir = 'outdir' - label = 'label' - self.assertEqual(bilby.core.result.result_file_name(outdir, label), - '{}/{}_result.json'.format(outdir, label)) + outdir = "outdir" + label = "label" + self.assertEqual( + bilby.core.result.result_file_name(outdir, label), + "{}/{}_result.json".format(outdir, label), + ) def test_result_file_name_hdf5(self): - outdir = 'outdir' - label = 'label' - self.assertEqual(bilby.core.result.result_file_name(outdir, label, extension='hdf5'), - '{}/{}_result.hdf5'.format(outdir, label)) + outdir = "outdir" + label = "label" + self.assertEqual( + bilby.core.result.result_file_name(outdir, label, extension="hdf5"), + "{}/{}_result.hdf5".format(outdir, label), + ) def test_fail_save_and_load(self): with self.assertRaises(ValueError): bilby.core.result.read_in_result() with self.assertRaises(ValueError): - bilby.core.result.read_in_result(filename='no_file_extension') + bilby.core.result.read_in_result(filename="no_file_extension") with self.assertRaises(IOError): - bilby.core.result.read_in_result(filename='not/a/file.json') + bilby.core.result.read_in_result(filename="not/a/file.json") def test_unset_priors(self): result = bilby.core.result.Result( - label='label', outdir='outdir', sampler='nestle', - search_parameter_keys=['x', 'y'], fixed_parameter_keys=['c', 'd'], - priors=None, sampler_kwargs=dict(test='test'), + label="label", + outdir="outdir", + sampler="nestle", + search_parameter_keys=["x", "y"], + fixed_parameter_keys=["c", "d"], + priors=None, + sampler_kwargs=dict(test="test"), injection_parameters=dict(x=0.5, y=0.5), - meta_data=dict(test='test')) + meta_data=dict(test="test"), + ) with self.assertRaises(ValueError): _ = result.priors self.assertEqual(result.parameter_labels, result.search_parameter_keys) - self.assertEqual(result.parameter_labels_with_unit, result.search_parameter_keys) + self.assertEqual( + result.parameter_labels_with_unit, result.search_parameter_keys + ) def test_unknown_priors_fail(self): with self.assertRaises(ValueError): bilby.core.result.Result( - label='label', outdir='outdir', sampler='nestle', - search_parameter_keys=['x', 'y'], fixed_parameter_keys=['c', 'd'], - priors=['a', 'b'], sampler_kwargs=dict(test='test'), + label="label", + outdir="outdir", + sampler="nestle", + search_parameter_keys=["x", "y"], + fixed_parameter_keys=["c", "d"], + priors=["a", "b"], + sampler_kwargs=dict(test="test"), injection_parameters=dict(x=0.5, y=0.5), - meta_data=dict(test='test')) + meta_data=dict(test="test"), + ) def test_set_samples(self): samples = [1, 2, 3] @@ -156,129 +179,189 @@ class TestResult(unittest.TestCase): _ = self.result.posterior def test_save_and_load_hdf5(self): - self.result.save_to_file(extension='hdf5') + self.result.save_to_file(extension="hdf5") loaded_result = bilby.core.result.read_in_result( - outdir=self.result.outdir, label=self.result.label, extension='hdf5') - self.assertTrue(pd.DataFrame.equals - (self.result.posterior, loaded_result.posterior)) - self.assertTrue(self.result.fixed_parameter_keys == loaded_result.fixed_parameter_keys) - self.assertTrue(self.result.search_parameter_keys == loaded_result.search_parameter_keys) + outdir=self.result.outdir, label=self.result.label, extension="hdf5" + ) + self.assertTrue( + pd.DataFrame.equals(self.result.posterior, loaded_result.posterior) + ) + self.assertTrue( + self.result.fixed_parameter_keys == loaded_result.fixed_parameter_keys + ) + self.assertTrue( + self.result.search_parameter_keys == loaded_result.search_parameter_keys + ) self.assertEqual(self.result.meta_data, loaded_result.meta_data) - self.assertEqual(self.result.injection_parameters, loaded_result.injection_parameters) + self.assertEqual( + self.result.injection_parameters, loaded_result.injection_parameters + ) self.assertEqual(self.result.log_evidence, loaded_result.log_evidence) - self.assertEqual(self.result.log_noise_evidence, loaded_result.log_noise_evidence) + self.assertEqual( + self.result.log_noise_evidence, loaded_result.log_noise_evidence + ) self.assertEqual(self.result.log_evidence_err, loaded_result.log_evidence_err) self.assertEqual(self.result.log_bayes_factor, loaded_result.log_bayes_factor) - self.assertEqual(self.result.priors['x'], loaded_result.priors['x']) - self.assertEqual(self.result.priors['y'], loaded_result.priors['y']) - self.assertEqual(self.result.priors['c'], loaded_result.priors['c']) - self.assertEqual(self.result.priors['d'], loaded_result.priors['d']) + self.assertEqual(self.result.priors["x"], loaded_result.priors["x"]) + self.assertEqual(self.result.priors["y"], loaded_result.priors["y"]) + self.assertEqual(self.result.priors["c"], loaded_result.priors["c"]) + self.assertEqual(self.result.priors["d"], loaded_result.priors["d"]) def test_save_and_load_default(self): self.result.save_to_file() loaded_result = bilby.core.result.read_in_result( - outdir=self.result.outdir, label=self.result.label) - self.assertTrue(np.array_equal - (self.result.posterior.sort_values(by=['x']), - loaded_result.posterior.sort_values(by=['x']))) - self.assertTrue(self.result.fixed_parameter_keys == loaded_result.fixed_parameter_keys) - self.assertTrue(self.result.search_parameter_keys == loaded_result.search_parameter_keys) + outdir=self.result.outdir, label=self.result.label + ) + self.assertTrue( + np.array_equal( + self.result.posterior.sort_values(by=["x"]), + loaded_result.posterior.sort_values(by=["x"]), + ) + ) + self.assertTrue( + self.result.fixed_parameter_keys == loaded_result.fixed_parameter_keys + ) + self.assertTrue( + self.result.search_parameter_keys == loaded_result.search_parameter_keys + ) self.assertEqual(self.result.meta_data, loaded_result.meta_data) - self.assertEqual(self.result.injection_parameters, loaded_result.injection_parameters) + self.assertEqual( + self.result.injection_parameters, loaded_result.injection_parameters + ) self.assertEqual(self.result.log_evidence, loaded_result.log_evidence) - self.assertEqual(self.result.log_noise_evidence, loaded_result.log_noise_evidence) + self.assertEqual( + self.result.log_noise_evidence, loaded_result.log_noise_evidence + ) self.assertEqual(self.result.log_evidence_err, loaded_result.log_evidence_err) self.assertEqual(self.result.log_bayes_factor, loaded_result.log_bayes_factor) - self.assertEqual(self.result.priors['x'], loaded_result.priors['x']) - self.assertEqual(self.result.priors['y'], loaded_result.priors['y']) - self.assertEqual(self.result.priors['c'], loaded_result.priors['c']) - self.assertEqual(self.result.priors['d'], loaded_result.priors['d']) + self.assertEqual(self.result.priors["x"], loaded_result.priors["x"]) + self.assertEqual(self.result.priors["y"], loaded_result.priors["y"]) + self.assertEqual(self.result.priors["c"], loaded_result.priors["c"]) + self.assertEqual(self.result.priors["d"], loaded_result.priors["d"]) def test_save_and_load_gzip(self): self.result.save_to_file(gzip=True) loaded_result = bilby.core.result.read_in_result( - outdir=self.result.outdir, label=self.result.label, gzip=True) - self.assertTrue(np.array_equal - (self.result.posterior.sort_values(by=['x']), - loaded_result.posterior.sort_values(by=['x']))) - self.assertTrue(self.result.fixed_parameter_keys == loaded_result.fixed_parameter_keys) - self.assertTrue(self.result.search_parameter_keys == loaded_result.search_parameter_keys) + outdir=self.result.outdir, label=self.result.label, gzip=True + ) + self.assertTrue( + np.array_equal( + self.result.posterior.sort_values(by=["x"]), + loaded_result.posterior.sort_values(by=["x"]), + ) + ) + self.assertTrue( + self.result.fixed_parameter_keys == loaded_result.fixed_parameter_keys + ) + self.assertTrue( + self.result.search_parameter_keys == loaded_result.search_parameter_keys + ) self.assertEqual(self.result.meta_data, loaded_result.meta_data) - self.assertEqual(self.result.injection_parameters, loaded_result.injection_parameters) + self.assertEqual( + self.result.injection_parameters, loaded_result.injection_parameters + ) self.assertEqual(self.result.log_evidence, loaded_result.log_evidence) - self.assertEqual(self.result.log_noise_evidence, loaded_result.log_noise_evidence) + self.assertEqual( + self.result.log_noise_evidence, loaded_result.log_noise_evidence + ) self.assertEqual(self.result.log_evidence_err, loaded_result.log_evidence_err) self.assertEqual(self.result.log_bayes_factor, loaded_result.log_bayes_factor) - self.assertEqual(self.result.priors['x'], loaded_result.priors['x']) - self.assertEqual(self.result.priors['y'], loaded_result.priors['y']) - self.assertEqual(self.result.priors['c'], loaded_result.priors['c']) - self.assertEqual(self.result.priors['d'], loaded_result.priors['d']) + self.assertEqual(self.result.priors["x"], loaded_result.priors["x"]) + self.assertEqual(self.result.priors["y"], loaded_result.priors["y"]) + self.assertEqual(self.result.priors["c"], loaded_result.priors["c"]) + self.assertEqual(self.result.priors["d"], loaded_result.priors["d"]) def test_save_and_dont_overwrite_default(self): shutil.rmtree( - '{}/{}_result.json.old'.format(self.result.outdir, self.result.label), - ignore_errors=True) + "{}/{}_result.json.old".format(self.result.outdir, self.result.label), + ignore_errors=True, + ) self.result.save_to_file(overwrite=False) self.result.save_to_file(overwrite=False) - self.assertTrue(os.path.isfile( - '{}/{}_result.json.old'.format(self.result.outdir, self.result.label))) + self.assertTrue( + os.path.isfile( + "{}/{}_result.json.old".format(self.result.outdir, self.result.label) + ) + ) def test_save_and_dont_overwrite_hdf5(self): shutil.rmtree( - '{}/{}_result.hdf5.old'.format(self.result.outdir, self.result.label), - ignore_errors=True) - self.result.save_to_file(overwrite=False, extension='hdf5') - self.result.save_to_file(overwrite=False, extension='hdf5') - self.assertTrue(os.path.isfile( - '{}/{}_result.hdf5.old'.format(self.result.outdir, self.result.label))) + "{}/{}_result.hdf5.old".format(self.result.outdir, self.result.label), + ignore_errors=True, + ) + self.result.save_to_file(overwrite=False, extension="hdf5") + self.result.save_to_file(overwrite=False, extension="hdf5") + self.assertTrue( + os.path.isfile( + "{}/{}_result.hdf5.old".format(self.result.outdir, self.result.label) + ) + ) def test_save_and_overwrite_hdf5(self): shutil.rmtree( - '{}/{}_result.hdf5.old'.format(self.result.outdir, self.result.label), - ignore_errors=True) - self.result.save_to_file(overwrite=True, extension='hdf5') - self.result.save_to_file(overwrite=True, extension='hdf5') - self.assertFalse(os.path.isfile( - '{}/{}_result.hdf5.old'.format(self.result.outdir, self.result.label))) + "{}/{}_result.hdf5.old".format(self.result.outdir, self.result.label), + ignore_errors=True, + ) + self.result.save_to_file(overwrite=True, extension="hdf5") + self.result.save_to_file(overwrite=True, extension="hdf5") + self.assertFalse( + os.path.isfile( + "{}/{}_result.hdf5.old".format(self.result.outdir, self.result.label) + ) + ) def test_save_and_overwrite_default(self): shutil.rmtree( - '{}/{}_result.json.old'.format(self.result.outdir, self.result.label), - ignore_errors=True) - self.result.save_to_file(overwrite=True, extension='hdf5') - self.result.save_to_file(overwrite=True, extension='hdf5') - self.assertFalse(os.path.isfile( - '{}/{}_result.h5.old'.format(self.result.outdir, self.result.label))) - - def test_save_and_overwrite_default(self): + "{}/{}_result.json.old".format(self.result.outdir, self.result.label), + ignore_errors=True, + ) + self.result.save_to_file(overwrite=True, extension="hdf5") + self.result.save_to_file(overwrite=True, extension="hdf5") + self.assertFalse( + os.path.isfile( + "{}/{}_result.h5.old".format(self.result.outdir, self.result.label) + ) + ) + + def test_save_and_overwrite_default_2(self): shutil.rmtree( - '{}/{}_result.json.old'.format(self.result.outdir, self.result.label), - ignore_errors=True) + "{}/{}_result.json.old".format(self.result.outdir, self.result.label), + ignore_errors=True, + ) self.result.save_to_file(overwrite=True) self.result.save_to_file(overwrite=True) - self.assertFalse(os.path.isfile( - '{}/{}_result.json.old'.format(self.result.outdir, self.result.label))) + self.assertFalse( + os.path.isfile( + "{}/{}_result.json.old".format(self.result.outdir, self.result.label) + ) + ) def test_save_samples(self): self.result.save_posterior_samples() - filename = '{}/{}_posterior_samples.dat'.format(self.result.outdir, self.result.label) + filename = "{}/{}_posterior_samples.dat".format( + self.result.outdir, self.result.label + ) self.assertTrue(os.path.isfile(filename)) - df = pd.read_csv(filename, sep=' ') + df = pd.read_csv(filename, sep=" ") self.assertTrue(np.allclose(self.result.posterior.values, df.values)) def test_save_samples_from_filename(self): - filename = '{}/{}_posterior_samples_OTHER.dat'.format(self.result.outdir, self.result.label) + filename = "{}/{}_posterior_samples_OTHER.dat".format( + self.result.outdir, self.result.label + ) self.result.save_posterior_samples(filename=filename) self.assertTrue(os.path.isfile(filename)) - df = pd.read_csv(filename, sep=' ') + df = pd.read_csv(filename, sep=" ") self.assertTrue(np.allclose(self.result.posterior.values, df.values)) def test_save_samples_numpy_load(self): self.result.save_posterior_samples() - filename = '{}/{}_posterior_samples.dat'.format(self.result.outdir, self.result.label) + filename = "{}/{}_posterior_samples.dat".format( + self.result.outdir, self.result.label + ) self.assertTrue(os.path.isfile(filename)) data = np.genfromtxt(filename, names=True) - df = pd.read_csv(filename, sep=' ') + df = pd.read_csv(filename, sep=" ") self.assertTrue(len(data.dtype) == len(df.keys())) def test_samples_to_posterior_simple(self): @@ -287,10 +370,9 @@ class TestResult(unittest.TestCase): y = [4, 6, 8] self.result.samples = np.array([x, y]).T self.result.samples_to_posterior() - self.assertTrue(all(self.result.posterior['x'] == x)) - self.assertTrue(all(self.result.posterior['y'] == y)) - self.assertTrue(np.all( - None == self.result.posterior.log_likelihood.values)) + self.assertTrue(all(self.result.posterior["x"] == x)) + self.assertTrue(all(self.result.posterior["y"] == y)) + self.assertTrue(np.all(None == self.result.posterior.log_likelihood.values)) # noqa def test_samples_to_posterior(self): self.result.posterior = None @@ -300,20 +382,25 @@ class TestResult(unittest.TestCase): self.result.samples = np.array([x, y]).T self.result.log_likelihood_evaluations = log_likelihood self.result.samples_to_posterior(priors=self.result.priors) - self.assertTrue(all(self.result.posterior['x'] == x)) - self.assertTrue(all(self.result.posterior['y'] == y)) - self.assertTrue(np.array_equal(self.result.posterior.log_likelihood.values, log_likelihood)) - self.assertTrue(all(self.result.posterior.c.values == self.result.priors['c'].peak)) - self.assertTrue(all(self.result.posterior.d.values == self.result.priors['d'].peak)) + self.assertTrue(all(self.result.posterior["x"] == x)) + self.assertTrue(all(self.result.posterior["y"] == y)) + self.assertTrue( + np.array_equal(self.result.posterior.log_likelihood.values, log_likelihood) + ) + self.assertTrue( + all(self.result.posterior.c.values == self.result.priors["c"].peak) + ) + self.assertTrue( + all(self.result.posterior.d.values == self.result.priors["d"].peak) + ) def test_calculate_prior_values(self): self.result.calculate_prior_values(priors=self.result.priors) self.assertEqual(len(self.result.posterior), len(self.result.prior_values)) def test_plot_multiple(self): - filename = 'multiple.png'.format(self.result.outdir) - bilby.core.result.plot_multiple([self.result, self.result], - filename=filename) + filename = "multiple.png".format(self.result.outdir) + bilby.core.result.plot_multiple([self.result, self.result], filename=filename) self.assertTrue(os.path.isfile(filename)) os.remove(filename) @@ -322,8 +409,10 @@ class TestResult(unittest.TestCase): self.result.nburn = 5 self.result.plot_walkers() self.assertTrue( - os.path.isfile('{}/{}_walkers.png'.format( - self.result.outdir, self.result.label))) + os.path.isfile( + "{}/{}_walkers.png".format(self.result.outdir, self.result.label) + ) + ) def test_plot_with_data(self): x = np.linspace(0, 1, 10) @@ -331,19 +420,24 @@ class TestResult(unittest.TestCase): def model(xx, theta): return xx + self.result.posterior = pd.DataFrame(dict(theta=[1, 2, 3])) self.result.plot_with_data(model, x, y, ndraws=10) self.assertTrue( - os.path.isfile('{}/{}_plot_with_data.png'.format( - self.result.outdir, self.result.label))) - self.result.posterior['log_likelihood'] = np.random.uniform(0, 1, len(self.result.posterior)) - self.result.plot_with_data(model, x, y, ndraws=10, xlabel='a', ylabel='y') + os.path.isfile( + "{}/{}_plot_with_data.png".format(self.result.outdir, self.result.label) + ) + ) + self.result.posterior["log_likelihood"] = np.random.uniform( + 0, 1, len(self.result.posterior) + ) + self.result.plot_with_data(model, x, y, ndraws=10, xlabel="a", ylabel="y") def test_plot_corner(self): self.result.injection_parameters = dict(x=0.8, y=1.1) self.result.plot_corner() - self.result.plot_corner(parameters=['x', 'y']) - self.result.plot_corner(parameters=['x', 'y'], truths=[1, 1]) + self.result.plot_corner(parameters=["x", "y"]) + self.result.plot_corner(parameters=["x", "y"], truths=[1, 1]) self.result.plot_corner(parameters=dict(x=1, y=1)) self.result.plot_corner(truths=dict(x=1, y=1)) self.result.plot_corner(truth=dict(x=1, y=1)) @@ -351,30 +445,27 @@ class TestResult(unittest.TestCase): self.result.plot_corner(truths=False) self.result.plot_corner(truths=True) with self.assertRaises(ValueError): - self.result.plot_corner(truths=dict(x=1, y=1), - parameters=dict(x=1, y=1)) + self.result.plot_corner(truths=dict(x=1, y=1), parameters=dict(x=1, y=1)) with self.assertRaises(ValueError): - self.result.plot_corner(truths=[1, 1], - parameters=dict(x=1, y=1)) + self.result.plot_corner(truths=[1, 1], parameters=dict(x=1, y=1)) with self.assertRaises(ValueError): - self.result.plot_corner(parameters=['x', 'y'], - truths=dict(x=1, y=1)) + self.result.plot_corner(parameters=["x", "y"], truths=dict(x=1, y=1)) def test_plot_corner_with_injection_parameters(self): self.result.plot_corner() - self.result.plot_corner(parameters=['x', 'y']) - self.result.plot_corner(parameters=['x', 'y'], truths=[1, 1]) + self.result.plot_corner(parameters=["x", "y"]) + self.result.plot_corner(parameters=["x", "y"], truths=[1, 1]) self.result.plot_corner(parameters=dict(x=1, y=1)) def test_plot_corner_with_priors(self): priors = bilby.core.prior.PriorDict() - priors['x'] = bilby.core.prior.Uniform(-1, 1, 'x') - priors['y'] = bilby.core.prior.Uniform(-1, 1, 'y') + priors["x"] = bilby.core.prior.Uniform(-1, 1, "x") + priors["y"] = bilby.core.prior.Uniform(-1, 1, "y") self.result.plot_corner(priors=priors) self.result.priors = priors self.result.plot_corner(priors=True) with self.assertRaises(ValueError): - self.result.plot_corner(priors='test') + self.result.plot_corner(priors="test") def test_get_credible_levels(self): levels = self.result.get_all_injection_credible_levels() @@ -388,57 +479,74 @@ class TestResult(unittest.TestCase): def test_kde(self): kde = self.result.kde import scipy.stats + self.assertEqual(type(kde), scipy.stats.kde.gaussian_kde) self.assertEqual(kde.d, 2) def test_posterior_probability(self): sample = dict(x=0, y=0.1) self.assertTrue( - isinstance(self.result.posterior_probability(sample), np.ndarray)) - self.assertTrue( - len(self.result.posterior_probability(sample)), 1) + isinstance(self.result.posterior_probability(sample), np.ndarray) + ) + self.assertTrue(len(self.result.posterior_probability(sample)), 1) self.assertEqual( - self.result.posterior_probability(sample)[0], - self.result.kde([0, 0.1])) + self.result.posterior_probability(sample)[0], self.result.kde([0, 0.1]) + ) def test_multiple_posterior_probability(self): sample = [dict(x=0, y=0.1), dict(x=0.8, y=0)] self.assertTrue( - isinstance(self.result.posterior_probability(sample), np.ndarray)) - self.assertTrue(np.array_equal(self.result.posterior_probability(sample), - self.result.kde([[0, 0.1], [0.8, 0]]))) + isinstance(self.result.posterior_probability(sample), np.ndarray) + ) + self.assertTrue( + np.array_equal( + self.result.posterior_probability(sample), + self.result.kde([[0, 0.1], [0.8, 0]]), + ) + ) class TestResultListError(unittest.TestCase): - def setUp(self): np.random.seed(7) bilby.utils.command_line_args.bilby_test_mode = False - self.priors = bilby.prior.PriorDict(dict( - x=bilby.prior.Uniform(0, 1, 'x', latex_label='$x$', unit='s'), - y=bilby.prior.Uniform(0, 1, 'y', latex_label='$y$', unit='m'), - c=1, - d=2)) + self.priors = bilby.prior.PriorDict( + dict( + x=bilby.prior.Uniform(0, 1, "x", latex_label="$x$", unit="s"), + y=bilby.prior.Uniform(0, 1, "y", latex_label="$y$", unit="m"), + c=1, + d=2, + ) + ) # create two cpnest results self.nested_results = bilby.result.ResultList([]) self.mcmc_results = bilby.result.ResultList([]) self.expected_nested = [] - self.outdir = 'outdir' - self.label = 'label' + self.outdir = "outdir" + self.label = "label" n = 100 for i in range(2): result = bilby.core.result.Result( - label=self.label + str(i), outdir=self.outdir, sampler='cpnest', - search_parameter_keys=['x', 'y'], fixed_parameter_keys=['c', 'd'], - priors=self.priors, sampler_kwargs=dict(test='test', func=lambda x: x, nlive=10), + label=self.label + str(i), + outdir=self.outdir, + sampler="cpnest", + search_parameter_keys=["x", "y"], + fixed_parameter_keys=["c", "d"], + priors=self.priors, + sampler_kwargs=dict(test="test", func=lambda x: x, nlive=10), injection_parameters=dict(x=0.5, y=0.5), - meta_data=dict(test='test')) - - posterior = pd.DataFrame(dict(x=np.random.normal(0, 1, n), - y=np.random.normal(0, 1, n), - log_likelihood=sorted(np.random.normal(0, 1, n)))) + meta_data=dict(test="test"), + ) + + posterior = pd.DataFrame( + dict( + x=np.random.normal(0, 1, n), + y=np.random.normal(0, 1, n), + log_likelihood=sorted(np.random.normal(0, 1, n)), + ) + ) result.posterior = posterior[-10:] # use last 10 samples as posterior result.nested_samples = posterior result.log_evidence = 10 @@ -449,15 +557,24 @@ class TestResultListError(unittest.TestCase): self.expected_nested.append(result) for i in range(2): result = bilby.core.result.Result( - label=self.label + str(i) + 'mcmc', outdir=self.outdir, sampler='emcee', - search_parameter_keys=['x', 'y'], fixed_parameter_keys=['c', 'd'], - priors=self.priors, sampler_kwargs=dict(test='test', func=lambda x: x, nlive=10), + label=self.label + str(i) + "mcmc", + outdir=self.outdir, + sampler="emcee", + search_parameter_keys=["x", "y"], + fixed_parameter_keys=["c", "d"], + priors=self.priors, + sampler_kwargs=dict(test="test", func=lambda x: x, nlive=10), injection_parameters=dict(x=0.5, y=0.5), - meta_data=dict(test='test')) - - posterior = pd.DataFrame(dict(x=np.random.normal(0, 1, n), - y=np.random.normal(0, 1, n), - log_likelihood=sorted(np.random.normal(0, 1, n)))) + meta_data=dict(test="test"), + ) + + posterior = pd.DataFrame( + dict( + x=np.random.normal(0, 1, n), + y=np.random.normal(0, 1, n), + log_likelihood=sorted(np.random.normal(0, 1, n)), + ) + ) result.posterior = posterior[-10:] result.log_evidence = 10 result.log_evidence_err = 11 @@ -486,7 +603,7 @@ class TestResultListError(unittest.TestCase): _ = bilby.core.result.ResultList(1) def test_append_from_string(self): - self.nested_results.append(self.outdir + '/' + self.label + '1_result.json') + self.nested_results.append(self.outdir + "/" + self.label + "1_result.json") self.assertEqual(3, len(self.nested_results)) def test_append_result_type(self): @@ -495,29 +612,35 @@ class TestResultListError(unittest.TestCase): self.assertListEqual(self.nested_results, self.nested_results) def test_combine_inconsistent_samplers(self): - self.nested_results[0].sampler = 'dynesty' + self.nested_results[0].sampler = "dynesty" with self.assertRaises(bilby.result.ResultListError): self.nested_results.combine() def test_combine_inconsistent_priors_length(self): - self.nested_results[0].priors = bilby.prior.PriorDict(dict( - x=bilby.prior.Uniform(0, 1, 'x', latex_label='$x$', unit='s'), - y=bilby.prior.Uniform(0, 1, 'y', latex_label='$y$', unit='m'), - c=1)) + self.nested_results[0].priors = bilby.prior.PriorDict( + dict( + x=bilby.prior.Uniform(0, 1, "x", latex_label="$x$", unit="s"), + y=bilby.prior.Uniform(0, 1, "y", latex_label="$y$", unit="m"), + c=1, + ) + ) with self.assertRaises(bilby.result.ResultListError): self.nested_results.combine() def test_combine_inconsistent_priors_types(self): - self.nested_results[0].priors = bilby.prior.PriorDict(dict( - x=bilby.prior.Uniform(0, 1, 'x', latex_label='$x$', unit='s'), - y=bilby.prior.Uniform(0, 1, 'y', latex_label='$y$', unit='m'), - c=1, - d=bilby.core.prior.Cosine())) + self.nested_results[0].priors = bilby.prior.PriorDict( + dict( + x=bilby.prior.Uniform(0, 1, "x", latex_label="$x$", unit="s"), + y=bilby.prior.Uniform(0, 1, "y", latex_label="$y$", unit="m"), + c=1, + d=bilby.core.prior.Cosine(), + ) + ) with self.assertRaises(bilby.result.ResultListError): self.nested_results.combine() def test_combine_inconsistent_search_parameters(self): - self.nested_results[0].search_parameter_keys = ['y'] + self.nested_results[0].search_parameter_keys = ["y"] with self.assertRaises(bilby.result.ResultListError): self.nested_results.combine() @@ -533,15 +656,24 @@ class TestResultListError(unittest.TestCase): def test_combine_inconsistent_sampling_data(self): result = bilby.core.result.Result( - label=self.label, outdir=self.outdir, sampler='cpnest', - search_parameter_keys=['x', 'y'], fixed_parameter_keys=['c', 'd'], - priors=self.priors, sampler_kwargs=dict(test='test', func=lambda x: x, nlive=10), + label=self.label, + outdir=self.outdir, + sampler="cpnest", + search_parameter_keys=["x", "y"], + fixed_parameter_keys=["c", "d"], + priors=self.priors, + sampler_kwargs=dict(test="test", func=lambda x: x, nlive=10), injection_parameters=dict(x=0.5, y=0.5), - meta_data=dict(test='test')) - - posterior = pd.DataFrame(dict(x=np.random.normal(0, 1, 100), - y=np.random.normal(0, 1, 100), - log_likelihood=sorted(np.random.normal(0, 1, 100)))) + meta_data=dict(test="test"), + ) + + posterior = pd.DataFrame( + dict( + x=np.random.normal(0, 1, 100), + y=np.random.normal(0, 1, 100), + log_likelihood=sorted(np.random.normal(0, 1, 100)), + ) + ) result.posterior = posterior[-10:] # use last 10 samples as posterior result.log_evidence = 10 result.log_evidence_err = 11 @@ -553,5 +685,5 @@ class TestResultListError(unittest.TestCase): self.nested_results.combine() -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/test/sample_from_the_prior_test.py b/test/sample_from_the_prior_test.py index aeda281ae4c835ed60eb00389418ff5839430ceb..5761d19b52de4d3781ac506d73072438fb8507d4 100644 --- a/test/sample_from_the_prior_test.py +++ b/test/sample_from_the_prior_test.py @@ -19,7 +19,7 @@ def ks_2samp_wrapper(data1, data2): class Test(unittest.TestCase): - outdir = 'outdir_for_tests' + outdir = "outdir_for_tests" @classmethod def setUpClass(self): @@ -27,8 +27,7 @@ class Test(unittest.TestCase): try: shutil.rmtree(self.outdir) except OSError: - logging.warning( - "{} not removed prior to tests".format(self.outdir)) + logging.warning("{} not removed prior to tests".format(self.outdir)) @classmethod def tearDownClass(self): @@ -36,57 +35,78 @@ class Test(unittest.TestCase): try: shutil.rmtree(self.outdir) except OSError: - logging.warning( - "{} not removed prior to tests".format(self.outdir)) + logging.warning("{} not removed prior to tests".format(self.outdir)) def test_fifteen_dimensional_cbc(self): - duration = 4. - sampling_frequency = 2048. - label = 'full_15_parameters' + duration = 4.0 + sampling_frequency = 2048.0 + label = "full_15_parameters" np.random.seed(8817023) - waveform_arguments = dict(waveform_approximant='IMRPhenomPv2', - reference_frequency=50., minimum_frequency=20.) + waveform_arguments = dict( + waveform_approximant="IMRPhenomPv2", + reference_frequency=50.0, + minimum_frequency=20.0, + ) waveform_generator = bilby.gw.WaveformGenerator( - duration=duration, sampling_frequency=sampling_frequency, + duration=duration, + sampling_frequency=sampling_frequency, frequency_domain_source_model=bilby.gw.source.lal_binary_black_hole, parameter_conversion=bilby.gw.conversion.convert_to_lal_binary_black_hole_parameters, - waveform_arguments=waveform_arguments) + waveform_arguments=waveform_arguments, + ) - ifos = bilby.gw.detector.InterferometerList(['H1', 'L1']) + ifos = bilby.gw.detector.InterferometerList(["H1", "L1"]) ifos.set_strain_data_from_power_spectral_densities( - sampling_frequency=sampling_frequency, duration=duration, - start_time=0) + sampling_frequency=sampling_frequency, duration=duration, start_time=0 + ) priors = bilby.gw.prior.BBHPriorDict() - priors.pop('mass_1') - priors.pop('mass_2') - priors['chirp_mass'] = bilby.prior.Uniform( - name='chirp_mass', latex_label='$M$', minimum=10.0, maximum=100.0, - unit='$M_{\\odot}$') - priors['mass_ratio'] = bilby.prior.Uniform( - name='mass_ratio', latex_label='$q$', minimum=0.5, maximum=1.0) - priors['geocent_time'] = bilby.core.prior.Uniform( - minimum=-0.1, maximum=0.1) + priors.pop("mass_1") + priors.pop("mass_2") + priors["chirp_mass"] = bilby.prior.Uniform( + name="chirp_mass", + latex_label="$M$", + minimum=10.0, + maximum=100.0, + unit="$M_{\\odot}$", + ) + priors["mass_ratio"] = bilby.prior.Uniform( + name="mass_ratio", latex_label="$q$", minimum=0.5, maximum=1.0 + ) + priors["geocent_time"] = bilby.core.prior.Uniform(minimum=-0.1, maximum=0.1) likelihood = bilby.gw.GravitationalWaveTransient( - interferometers=ifos, waveform_generator=waveform_generator, - priors=priors, distance_marginalization=False, - phase_marginalization=False, time_marginalization=False) + interferometers=ifos, + waveform_generator=waveform_generator, + priors=priors, + distance_marginalization=False, + phase_marginalization=False, + time_marginalization=False, + ) likelihood = bilby.core.likelihood.ZeroLikelihood(likelihood) result = bilby.run_sampler( - likelihood=likelihood, priors=priors, sampler='dynesty', - npoints=1000, walks=100, outdir=self.outdir, label=label) - pvalues = [ks_2samp_wrapper(result.priors[key].sample(10000), - result.posterior[key].values).pvalue - for key in priors.keys()] + likelihood=likelihood, + priors=priors, + sampler="dynesty", + npoints=1000, + walks=100, + outdir=self.outdir, + label=label, + ) + pvalues = [ + ks_2samp_wrapper( + result.priors[key].sample(10000), result.posterior[key].values + ).pvalue + for key in priors.keys() + ] print("P values per parameter") for key, p in zip(priors.keys(), pvalues): print(key, p) self.assertGreater(kstest(pvalues, "uniform").pvalue, 0.01) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/test/sampler_test.py b/test/sampler_test.py index 92dffc37afb7805bf39eec445a79b8833185524b..f5399770033b2301bc5b6784a11e7225706134c4 100644 --- a/test/sampler_test.py +++ b/test/sampler_test.py @@ -10,7 +10,6 @@ import copy class TestSampler(unittest.TestCase): - def setUp(self): likelihood = bilby.core.likelihood.Likelihood() likelihood.parameters = dict(a=1, b=2, c=3) @@ -23,27 +22,34 @@ class TestSampler(unittest.TestCase): uniform_prior.prob = MagicMock(return_value=1) uniform_prior.sample = MagicMock(return_value=0.5) - priors = dict(a=delta_prior, b='string', c=uniform_prior) + priors = dict(a=delta_prior, b="string", c=uniform_prior) likelihood.log_likelihood_ratio = MagicMock(return_value=1) likelihood.log_likelihood = MagicMock(return_value=2) - test_directory = 'test_directory' + test_directory = "test_directory" if os.path.isdir(test_directory): os.rmdir(test_directory) self.sampler = bilby.core.sampler.Sampler( - likelihood=likelihood, priors=priors, - outdir=test_directory, use_ratio=False, - skip_import_verification=True) + likelihood=likelihood, + priors=priors, + outdir=test_directory, + use_ratio=False, + skip_import_verification=True, + ) def tearDown(self): del self.sampler def test_search_parameter_keys(self): - expected_search_parameter_keys = ['c'] - self.assertListEqual(self.sampler.search_parameter_keys, expected_search_parameter_keys) + expected_search_parameter_keys = ["c"] + self.assertListEqual( + self.sampler.search_parameter_keys, expected_search_parameter_keys + ) def test_fixed_parameter_keys(self): - expected_fixed_parameter_keys = ['a'] - self.assertListEqual(self.sampler.fixed_parameter_keys, expected_fixed_parameter_keys) + expected_fixed_parameter_keys = ["a"] + self.assertListEqual( + self.sampler.fixed_parameter_keys, expected_fixed_parameter_keys + ) def test_ndim(self): self.assertEqual(self.sampler.ndim, 1) @@ -52,20 +58,21 @@ class TestSampler(unittest.TestCase): self.assertDictEqual(self.sampler.kwargs, {}) def test_label(self): - self.assertEqual(self.sampler.label, 'label') + self.assertEqual(self.sampler.label, "label") def test_prior_transform_transforms_search_parameter_keys(self): self.sampler.prior_transform([0]) expected_prior = prior.Uniform(0, 1) - self.assertListEqual([self.sampler.priors['c'].minimum, - self.sampler.priors['c'].maximum], - [expected_prior.minimum, - expected_prior.maximum]) + self.assertListEqual( + [self.sampler.priors["c"].minimum, self.sampler.priors["c"].maximum], + [expected_prior.minimum, expected_prior.maximum], + ) def test_prior_transform_does_not_transform_fixed_parameter_keys(self): self.sampler.prior_transform([0]) - self.assertEqual(self.sampler.priors['a'].peak, - prior.DeltaFunction(peak=0).peak) + self.assertEqual( + self.sampler.priors["a"].peak, prior.DeltaFunction(peak=0).peak + ) def test_log_prior(self): self.assertEqual(self.sampler.log_prior({1}), 0.0) @@ -79,9 +86,7 @@ class TestSampler(unittest.TestCase): self.assertEqual(self.sampler.log_likelihood([0]), 2) def test_log_likelihood_correctly_sets_parameters(self): - expected_dict = dict(a=0, - b=2, - c=0) + expected_dict = dict(a=0, b=2, c=0) _ = self.sampler.log_likelihood([0]) self.assertDictEqual(self.sampler.likelihood.parameters, expected_dict) @@ -95,16 +100,20 @@ class TestSampler(unittest.TestCase): class TestCPNest(unittest.TestCase): - def setUp(self): self.likelihood = MagicMock() self.priors = bilby.core.prior.PriorDict( - dict(a=bilby.core.prior.Uniform(0, 1), - b=bilby.core.prior.Uniform(0, 1))) - self.sampler = bilby.core.sampler.Cpnest(self.likelihood, self.priors, - outdir='outdir', label='label', - use_ratio=False, plot=False, - skip_import_verification=True) + dict(a=bilby.core.prior.Uniform(0, 1), b=bilby.core.prior.Uniform(0, 1)) + ) + self.sampler = bilby.core.sampler.Cpnest( + self.likelihood, + self.priors, + outdir="outdir", + label="label", + use_ratio=False, + plot=False, + skip_import_verification=True, + ) def tearDown(self): del self.likelihood @@ -112,36 +121,58 @@ class TestCPNest(unittest.TestCase): del self.sampler def test_default_kwargs(self): - expected = dict(verbose=3, nthreads=1, nlive=500, maxmcmc=1000, - seed=None, poolsize=100, nhamiltonian=0, resume=True, - output='outdir/cpnest_label/', proposals=None, - n_periodic_checkpoint=8000) + expected = dict( + verbose=3, + nthreads=1, + nlive=500, + maxmcmc=1000, + seed=None, + poolsize=100, + nhamiltonian=0, + resume=True, + output="outdir/cpnest_label/", + proposals=None, + n_periodic_checkpoint=8000, + ) self.assertDictEqual(expected, self.sampler.kwargs) def test_translate_kwargs(self): - expected = dict(verbose=3, nthreads=1, nlive=250, maxmcmc=1000, - seed=None, poolsize=100, nhamiltonian=0, resume=True, - output='outdir/cpnest_label/', proposals=None, - n_periodic_checkpoint=8000) + expected = dict( + verbose=3, + nthreads=1, + nlive=250, + maxmcmc=1000, + seed=None, + poolsize=100, + nhamiltonian=0, + resume=True, + output="outdir/cpnest_label/", + proposals=None, + n_periodic_checkpoint=8000, + ) for equiv in bilby.core.sampler.base_sampler.NestedSampler.npoints_equiv_kwargs: new_kwargs = self.sampler.kwargs.copy() - del new_kwargs['nlive'] + del new_kwargs["nlive"] new_kwargs[equiv] = 250 self.sampler.kwargs = new_kwargs self.assertDictEqual(expected, self.sampler.kwargs) class TestDynesty(unittest.TestCase): - def setUp(self): self.likelihood = MagicMock() self.priors = bilby.core.prior.PriorDict( - dict(a=bilby.core.prior.Uniform(0, 1), - b=bilby.core.prior.Uniform(0, 1))) - self.sampler = bilby.core.sampler.Dynesty(self.likelihood, self.priors, - outdir='outdir', label='label', - use_ratio=False, plot=False, - skip_import_verification=True) + dict(a=bilby.core.prior.Uniform(0, 1), b=bilby.core.prior.Uniform(0, 1)) + ) + self.sampler = bilby.core.sampler.Dynesty( + self.likelihood, + self.priors, + outdir="outdir", + label="label", + use_ratio=False, + plot=False, + skip_import_verification=True, + ) def tearDown(self): del self.likelihood @@ -149,57 +180,127 @@ class TestDynesty(unittest.TestCase): del self.sampler def test_default_kwargs(self): - expected = dict(bound='multi', sample='rwalk', periodic=None, reflective=None, verbose=True, - check_point_delta_t=600, nlive=1000, first_update=None, - npdim=None, rstate=None, queue_size=1, pool=None, - use_pool=None, live_points=None, logl_args=None, logl_kwargs=None, - ptform_args=None, ptform_kwargs=None, - enlarge=1.5, bootstrap=None, vol_dec=0.5, vol_check=8.0, - facc=0.2, slices=5, dlogz=0.1, maxiter=None, maxcall=None, - logl_max=np.inf, add_live=True, print_progress=True, save_bounds=False, - walks=100, update_interval=600, print_func='func', n_effective=None, - maxmcmc=5000, nact=5) - self.sampler.kwargs['print_func'] = 'func' # set this manually as this is not testable otherwise + expected = dict( + bound="multi", + sample="rwalk", + periodic=None, + reflective=None, + verbose=True, + check_point_delta_t=600, + nlive=1000, + first_update=None, + npdim=None, + rstate=None, + queue_size=1, + pool=None, + use_pool=None, + live_points=None, + logl_args=None, + logl_kwargs=None, + ptform_args=None, + ptform_kwargs=None, + enlarge=1.5, + bootstrap=None, + vol_dec=0.5, + vol_check=8.0, + facc=0.2, + slices=5, + dlogz=0.1, + maxiter=None, + maxcall=None, + logl_max=np.inf, + add_live=True, + print_progress=True, + save_bounds=False, + walks=100, + update_interval=600, + print_func="func", + n_effective=None, + maxmcmc=5000, + nact=5, + ) + self.sampler.kwargs[ + "print_func" + ] = "func" # set this manually as this is not testable otherwise # DictEqual can't handle lists so we check these separately - self.assertEqual([], self.sampler.kwargs['periodic']) - self.assertEqual([], self.sampler.kwargs['reflective']) - self.sampler.kwargs['periodic'] = expected['periodic'] - self.sampler.kwargs['reflective'] = expected['reflective'] + self.assertEqual([], self.sampler.kwargs["periodic"]) + self.assertEqual([], self.sampler.kwargs["reflective"]) + self.sampler.kwargs["periodic"] = expected["periodic"] + self.sampler.kwargs["reflective"] = expected["reflective"] for key in self.sampler.kwargs.keys(): - print("key={}, expected={}, actual={}" - .format(key, expected[key], self.sampler.kwargs[key])) + print( + "key={}, expected={}, actual={}".format( + key, expected[key], self.sampler.kwargs[key] + ) + ) self.assertDictEqual(expected, self.sampler.kwargs) def test_translate_kwargs(self): - expected = dict(bound='multi', sample='rwalk', periodic=[], reflective=[], verbose=True, - check_point_delta_t=600, nlive=1000, first_update=None, - npdim=None, rstate=None, queue_size=1, pool=None, - use_pool=None, live_points=None, logl_args=None, logl_kwargs=None, - ptform_args=None, ptform_kwargs=None, - enlarge=1.5, bootstrap=None, vol_dec=0.5, vol_check=8.0, - facc=0.2, slices=5, dlogz=0.1, maxiter=None, maxcall=None, - logl_max=np.inf, add_live=True, print_progress=True, save_bounds=False, - walks=100, update_interval=600, print_func='func', n_effective=None, - maxmcmc=5000, nact=5) + expected = dict( + bound="multi", + sample="rwalk", + periodic=[], + reflective=[], + verbose=True, + check_point_delta_t=600, + nlive=1000, + first_update=None, + npdim=None, + rstate=None, + queue_size=1, + pool=None, + use_pool=None, + live_points=None, + logl_args=None, + logl_kwargs=None, + ptform_args=None, + ptform_kwargs=None, + enlarge=1.5, + bootstrap=None, + vol_dec=0.5, + vol_check=8.0, + facc=0.2, + slices=5, + dlogz=0.1, + maxiter=None, + maxcall=None, + logl_max=np.inf, + add_live=True, + print_progress=True, + save_bounds=False, + walks=100, + update_interval=600, + print_func="func", + n_effective=None, + maxmcmc=5000, + nact=5, + ) for equiv in bilby.core.sampler.base_sampler.NestedSampler.npoints_equiv_kwargs: new_kwargs = self.sampler.kwargs.copy() - del new_kwargs['nlive'] + del new_kwargs["nlive"] new_kwargs[equiv] = 1000 self.sampler.kwargs = new_kwargs - self.sampler.kwargs['print_func'] = 'func' # set this manually as this is not testable otherwise + self.sampler.kwargs[ + "print_func" + ] = "func" # set this manually as this is not testable otherwise self.assertDictEqual(expected, self.sampler.kwargs) def test_prior_boundary(self): - self.priors['a'] = bilby.core.prior.Prior(boundary='periodic') - self.priors['b'] = bilby.core.prior.Prior(boundary='reflective') - self.priors['c'] = bilby.core.prior.Prior(boundary=None) - self.priors['d'] = bilby.core.prior.Prior(boundary='reflective') - self.priors['e'] = bilby.core.prior.Prior(boundary='periodic') - self.sampler = bilby.core.sampler.Dynesty(self.likelihood, self.priors, - outdir='outdir', label='label', - use_ratio=False, plot=False, - skip_import_verification=True) + self.priors["a"] = bilby.core.prior.Prior(boundary="periodic") + self.priors["b"] = bilby.core.prior.Prior(boundary="reflective") + self.priors["c"] = bilby.core.prior.Prior(boundary=None) + self.priors["d"] = bilby.core.prior.Prior(boundary="reflective") + self.priors["e"] = bilby.core.prior.Prior(boundary="periodic") + self.sampler = bilby.core.sampler.Dynesty( + self.likelihood, + self.priors, + outdir="outdir", + label="label", + use_ratio=False, + plot=False, + skip_import_verification=True, + ) self.assertEqual([0, 4], self.sampler.kwargs["periodic"]) self.assertEqual(self.sampler._periodic, self.sampler.kwargs["periodic"]) self.assertEqual([1, 3], self.sampler.kwargs["reflective"]) @@ -207,16 +308,20 @@ class TestDynesty(unittest.TestCase): class TestEmcee(unittest.TestCase): - def setUp(self): self.likelihood = MagicMock() self.priors = bilby.core.prior.PriorDict( - dict(a=bilby.core.prior.Uniform(0, 1), - b=bilby.core.prior.Uniform(0, 1))) - self.sampler = bilby.core.sampler.Emcee(self.likelihood, self.priors, - outdir='outdir', label='label', - use_ratio=False, plot=False, - skip_import_verification=True) + dict(a=bilby.core.prior.Uniform(0, 1), b=bilby.core.prior.Uniform(0, 1)) + ) + self.sampler = bilby.core.sampler.Emcee( + self.likelihood, + self.priors, + outdir="outdir", + label="label", + use_ratio=False, + plot=False, + skip_import_verification=True, + ) def tearDown(self): del self.likelihood @@ -224,37 +329,66 @@ class TestEmcee(unittest.TestCase): del self.sampler def test_default_kwargs(self): - expected = dict(nwalkers=500, a=2, args=[], kwargs={}, - postargs=None, pool=None, live_dangerously=False, - runtime_sortingfn=None, lnprob0=None, rstate0=None, - blobs0=None, iterations=100, thin=1, storechain=True, mh_proposal=None - ) + expected = dict( + nwalkers=500, + a=2, + args=[], + kwargs={}, + postargs=None, + pool=None, + live_dangerously=False, + runtime_sortingfn=None, + lnprob0=None, + rstate0=None, + blobs0=None, + iterations=100, + thin=1, + storechain=True, + mh_proposal=None, + ) self.assertDictEqual(expected, self.sampler.kwargs) def test_translate_kwargs(self): - expected = dict(nwalkers=100, a=2, args=[], kwargs={}, - postargs=None, pool=None, live_dangerously=False, - runtime_sortingfn=None, lnprob0=None, rstate0=None, - blobs0=None, iterations=100, thin=1, storechain=True, mh_proposal=None) + expected = dict( + nwalkers=100, + a=2, + args=[], + kwargs={}, + postargs=None, + pool=None, + live_dangerously=False, + runtime_sortingfn=None, + lnprob0=None, + rstate0=None, + blobs0=None, + iterations=100, + thin=1, + storechain=True, + mh_proposal=None, + ) for equiv in bilby.core.sampler.base_sampler.MCMCSampler.nwalkers_equiv_kwargs: new_kwargs = self.sampler.kwargs.copy() - del new_kwargs['nwalkers'] + del new_kwargs["nwalkers"] new_kwargs[equiv] = 100 self.sampler.kwargs = new_kwargs self.assertDictEqual(expected, self.sampler.kwargs) class TestKombine(unittest.TestCase): - def setUp(self): self.likelihood = MagicMock() self.priors = bilby.core.prior.PriorDict( - dict(a=bilby.core.prior.Uniform(0, 1), - b=bilby.core.prior.Uniform(0, 1))) - self.sampler = bilby.core.sampler.Kombine(self.likelihood, self.priors, - outdir='outdir', label='label', - use_ratio=False, plot=False, - skip_import_verification=True) + dict(a=bilby.core.prior.Uniform(0, 1), b=bilby.core.prior.Uniform(0, 1)) + ) + self.sampler = bilby.core.sampler.Kombine( + self.likelihood, + self.priors, + outdir="outdir", + label="label", + use_ratio=False, + plot=False, + skip_import_verification=True, + ) def tearDown(self): del self.likelihood @@ -262,37 +396,73 @@ class TestKombine(unittest.TestCase): del self.sampler def test_default_kwargs(self): - expected = dict(nwalkers=500, args=[], pool=None, transd=False, - lnpost0=None, blob0=None, iterations=500, storechain=True, processes=1, update_interval=None, - kde=None, kde_size=None, spaces=None, freeze_transd=False, test_steps=16, critical_pval=0.05, - max_steps=None, burnin_verbose=False) + expected = dict( + nwalkers=500, + args=[], + pool=None, + transd=False, + lnpost0=None, + blob0=None, + iterations=500, + storechain=True, + processes=1, + update_interval=None, + kde=None, + kde_size=None, + spaces=None, + freeze_transd=False, + test_steps=16, + critical_pval=0.05, + max_steps=None, + burnin_verbose=False, + ) self.assertDictEqual(expected, self.sampler.kwargs) def test_translate_kwargs(self): - expected = dict(nwalkers=400, args=[], pool=None, transd=False, - lnpost0=None, blob0=None, iterations=500, storechain=True, processes=1, update_interval=None, - kde=None, kde_size=None, spaces=None, freeze_transd=False, test_steps=16, critical_pval=0.05, - max_steps=None, burnin_verbose=False) + expected = dict( + nwalkers=400, + args=[], + pool=None, + transd=False, + lnpost0=None, + blob0=None, + iterations=500, + storechain=True, + processes=1, + update_interval=None, + kde=None, + kde_size=None, + spaces=None, + freeze_transd=False, + test_steps=16, + critical_pval=0.05, + max_steps=None, + burnin_verbose=False, + ) for equiv in bilby.core.sampler.base_sampler.MCMCSampler.nwalkers_equiv_kwargs: new_kwargs = self.sampler.kwargs.copy() - del new_kwargs['nwalkers'] + del new_kwargs["nwalkers"] new_kwargs[equiv] = 400 self.sampler.kwargs = new_kwargs self.assertDictEqual(expected, self.sampler.kwargs) class TestNestle(unittest.TestCase): - def setUp(self): self.likelihood = MagicMock() self.priors = bilby.core.prior.PriorDict( - dict(a=bilby.core.prior.Uniform(0, 1), - b=bilby.core.prior.Uniform(0, 1))) - self.sampler = bilby.core.sampler.Nestle(self.likelihood, self.priors, - outdir='outdir', label='label', - use_ratio=False, plot=False, - skip_import_verification=True, - verbose=False) + dict(a=bilby.core.prior.Uniform(0, 1), b=bilby.core.prior.Uniform(0, 1)) + ) + self.sampler = bilby.core.sampler.Nestle( + self.likelihood, + self.priors, + outdir="outdir", + label="label", + use_ratio=False, + plot=False, + skip_import_verification=True, + verbose=False, + ) def tearDown(self): del self.likelihood @@ -300,37 +470,63 @@ class TestNestle(unittest.TestCase): del self.sampler def test_default_kwargs(self): - expected = dict(verbose=False, method='multi', npoints=500, - update_interval=None, npdim=None, maxiter=None, - maxcall=None, dlogz=None, decline_factor=None, - rstate=None, callback=None, steps=20, enlarge=1.2) + expected = dict( + verbose=False, + method="multi", + npoints=500, + update_interval=None, + npdim=None, + maxiter=None, + maxcall=None, + dlogz=None, + decline_factor=None, + rstate=None, + callback=None, + steps=20, + enlarge=1.2, + ) self.assertDictEqual(expected, self.sampler.kwargs) def test_translate_kwargs(self): - expected = dict(verbose=False, method='multi', npoints=345, - update_interval=None, npdim=None, maxiter=None, - maxcall=None, dlogz=None, decline_factor=None, - rstate=None, callback=None, steps=20, enlarge=1.2) - self.sampler.kwargs['npoints'] = 123 + expected = dict( + verbose=False, + method="multi", + npoints=345, + update_interval=None, + npdim=None, + maxiter=None, + maxcall=None, + dlogz=None, + decline_factor=None, + rstate=None, + callback=None, + steps=20, + enlarge=1.2, + ) + self.sampler.kwargs["npoints"] = 123 for equiv in bilby.core.sampler.base_sampler.NestedSampler.npoints_equiv_kwargs: new_kwargs = self.sampler.kwargs.copy() - del new_kwargs['npoints'] + del new_kwargs["npoints"] new_kwargs[equiv] = 345 self.sampler.kwargs = new_kwargs self.assertDictEqual(expected, self.sampler.kwargs) class TestPolyChord(unittest.TestCase): - def setUp(self): self.likelihood = MagicMock() self.priors = bilby.core.prior.PriorDict( - dict(a=bilby.core.prior.Uniform(0, 1), - b=bilby.core.prior.Uniform(0, 1))) - self.sampler = bilby.core.sampler.PyPolyChord(self.likelihood, self.priors, - outdir='outdir', label='polychord', - use_ratio=False, plot=False, - skip_import_verification=True) + dict(a=bilby.core.prior.Uniform(0, 1), b=bilby.core.prior.Uniform(0, 1)) + ) + self.sampler = bilby.core.sampler.PyPolyChord( + self.likelihood, + self.priors, + outdir="outdir", + label="polychord", + use_ratio=False, + plot=False, + skip_import_verification=True, + ) def tearDown(self): del self.likelihood @@ -338,48 +534,92 @@ class TestPolyChord(unittest.TestCase): del self.sampler def test_default_kwargs(self): - expected = dict(use_polychord_defaults=False, nlive=self.sampler.ndim*25, num_repeats=self.sampler.ndim*5, - nprior=-1, do_clustering=True, feedback=1, precision_criterion=0.001, - logzero=-1e30, max_ndead=-1, boost_posterior=0.0, posteriors=True, - equals=True, cluster_posteriors=True, write_resume=True, - write_paramnames=False, read_resume=True, write_stats=True, - write_live=True, write_dead=True, write_prior=True, - compression_factor=np.exp(-1), base_dir='outdir', - file_root='polychord', seed=-1, grade_dims=list([self.sampler.ndim]), - grade_frac=list([1.0]*len([self.sampler.ndim])), nlives={}) + expected = dict( + use_polychord_defaults=False, + nlive=self.sampler.ndim * 25, + num_repeats=self.sampler.ndim * 5, + nprior=-1, + do_clustering=True, + feedback=1, + precision_criterion=0.001, + logzero=-1e30, + max_ndead=-1, + boost_posterior=0.0, + posteriors=True, + equals=True, + cluster_posteriors=True, + write_resume=True, + write_paramnames=False, + read_resume=True, + write_stats=True, + write_live=True, + write_dead=True, + write_prior=True, + compression_factor=np.exp(-1), + base_dir="outdir", + file_root="polychord", + seed=-1, + grade_dims=list([self.sampler.ndim]), + grade_frac=list([1.0] * len([self.sampler.ndim])), + nlives={}, + ) self.sampler._setup_dynamic_defaults() self.assertDictEqual(expected, self.sampler.kwargs) def test_translate_kwargs(self): - expected = dict(use_polychord_defaults=False, nlive=123, num_repeats=self.sampler.ndim*5, - nprior=-1, do_clustering=True, feedback=1, precision_criterion=0.001, - logzero=-1e30, max_ndead=-1, boost_posterior=0.0, posteriors=True, - equals=True, cluster_posteriors=True, write_resume=True, - write_paramnames=False, read_resume=True, write_stats=True, - write_live=True, write_dead=True, write_prior=True, - compression_factor=np.exp(-1), base_dir='outdir', - file_root='polychord', seed=-1, grade_dims=list([self.sampler.ndim]), - grade_frac=list([1.0]*len([self.sampler.ndim])), nlives={}) + expected = dict( + use_polychord_defaults=False, + nlive=123, + num_repeats=self.sampler.ndim * 5, + nprior=-1, + do_clustering=True, + feedback=1, + precision_criterion=0.001, + logzero=-1e30, + max_ndead=-1, + boost_posterior=0.0, + posteriors=True, + equals=True, + cluster_posteriors=True, + write_resume=True, + write_paramnames=False, + read_resume=True, + write_stats=True, + write_live=True, + write_dead=True, + write_prior=True, + compression_factor=np.exp(-1), + base_dir="outdir", + file_root="polychord", + seed=-1, + grade_dims=list([self.sampler.ndim]), + grade_frac=list([1.0] * len([self.sampler.ndim])), + nlives={}, + ) self.sampler._setup_dynamic_defaults() for equiv in bilby.core.sampler.base_sampler.NestedSampler.npoints_equiv_kwargs: new_kwargs = self.sampler.kwargs.copy() - del new_kwargs['nlive'] + del new_kwargs["nlive"] new_kwargs[equiv] = 123 self.sampler.kwargs = new_kwargs self.assertDictEqual(expected, self.sampler.kwargs) class TestPTEmcee(unittest.TestCase): - def setUp(self): self.likelihood = MagicMock() self.priors = bilby.core.prior.PriorDict( - dict(a=bilby.core.prior.Uniform(0, 1), - b=bilby.core.prior.Uniform(0, 1))) - self.sampler = bilby.core.sampler.Ptemcee(self.likelihood, self.priors, - outdir='outdir', label='label', - use_ratio=False, plot=False, - skip_import_verification=True) + dict(a=bilby.core.prior.Uniform(0, 1), b=bilby.core.prior.Uniform(0, 1)) + ) + self.sampler = bilby.core.sampler.Ptemcee( + self.likelihood, + self.priors, + outdir="outdir", + label="label", + use_ratio=False, + plot=False, + skip_import_verification=True, + ) def tearDown(self): del self.likelihood @@ -387,34 +627,56 @@ class TestPTEmcee(unittest.TestCase): del self.sampler def test_default_kwargs(self): - expected = dict(ntemps=20, nwalkers=200, Tmax=None, betas=None, a=2.0, - adaptation_lag=10000, adaptation_time=100, random=None, - adapt=True, swap_ratios=False,) + expected = dict( + ntemps=20, + nwalkers=200, + Tmax=None, + betas=None, + a=2.0, + adaptation_lag=10000, + adaptation_time=100, + random=None, + adapt=True, + swap_ratios=False, + ) self.assertDictEqual(expected, self.sampler.kwargs) def test_translate_kwargs(self): - expected = dict(ntemps=20, nwalkers=200, Tmax=None, betas=None, a=2.0, - adaptation_lag=10000, adaptation_time=100, random=None, - adapt=True, swap_ratios=False,) + expected = dict( + ntemps=20, + nwalkers=200, + Tmax=None, + betas=None, + a=2.0, + adaptation_lag=10000, + adaptation_time=100, + random=None, + adapt=True, + swap_ratios=False, + ) for equiv in bilby.core.sampler.base_sampler.MCMCSampler.nwalkers_equiv_kwargs: new_kwargs = self.sampler.kwargs.copy() - del new_kwargs['nwalkers'] + del new_kwargs["nwalkers"] new_kwargs[equiv] = 200 self.sampler.kwargs = new_kwargs self.assertDictEqual(expected, self.sampler.kwargs) class TestPyMC3(unittest.TestCase): - def setUp(self): self.likelihood = MagicMock() self.priors = bilby.core.prior.PriorDict( - dict(a=bilby.core.prior.Uniform(0, 1), - b=bilby.core.prior.Uniform(0, 1))) - self.sampler = bilby.core.sampler.Pymc3(self.likelihood, self.priors, - outdir='outdir', label='label', - use_ratio=False, plot=False, - skip_import_verification=True) + dict(a=bilby.core.prior.Uniform(0, 1), b=bilby.core.prior.Uniform(0, 1)) + ) + self.sampler = bilby.core.sampler.Pymc3( + self.likelihood, + self.priors, + outdir="outdir", + label="label", + use_ratio=False, + plot=False, + skip_import_verification=True, + ) def tearDown(self): del self.likelihood @@ -423,40 +685,72 @@ class TestPyMC3(unittest.TestCase): def test_default_kwargs(self): expected = dict( - draws=500, step=None, init='auto', n_init=200000, start=None, trace=None, chain_idx=0, - chains=2, cores=1, tune=500, nuts_kwargs=None, step_kwargs=None, progressbar=True, - model=None, random_seed=None, discard_tuned_samples=True, - compute_convergence_checks=True) + draws=500, + step=None, + init="auto", + n_init=200000, + start=None, + trace=None, + chain_idx=0, + chains=2, + cores=1, + tune=500, + nuts_kwargs=None, + step_kwargs=None, + progressbar=True, + model=None, + random_seed=None, + discard_tuned_samples=True, + compute_convergence_checks=True, + ) self.assertDictEqual(expected, self.sampler.kwargs) def test_translate_kwargs(self): expected = dict( - draws=500, step=None, init='auto', n_init=200000, start=None, trace=None, chain_idx=0, - chains=2, cores=1, tune=500, nuts_kwargs=None, step_kwargs=None, progressbar=True, - model=None, random_seed=None, discard_tuned_samples=True, - compute_convergence_checks=True) - self.sampler.kwargs['draws'] = 123 + draws=500, + step=None, + init="auto", + n_init=200000, + start=None, + trace=None, + chain_idx=0, + chains=2, + cores=1, + tune=500, + nuts_kwargs=None, + step_kwargs=None, + progressbar=True, + model=None, + random_seed=None, + discard_tuned_samples=True, + compute_convergence_checks=True, + ) + self.sampler.kwargs["draws"] = 123 for equiv in bilby.core.sampler.base_sampler.NestedSampler.npoints_equiv_kwargs: new_kwargs = self.sampler.kwargs.copy() - del new_kwargs['draws'] + del new_kwargs["draws"] new_kwargs[equiv] = 500 self.sampler.kwargs = new_kwargs self.assertDictEqual(expected, self.sampler.kwargs) class TestPymultinest(unittest.TestCase): - def setUp(self): self.likelihood = MagicMock() self.priors = bilby.core.prior.PriorDict( - dict(a=bilby.core.prior.Uniform(0, 1), - b=bilby.core.prior.Uniform(0, 1))) - self.priors['a'] = bilby.core.prior.Prior(boundary='periodic') - self.priors['b'] = bilby.core.prior.Prior(boundary='reflective') - self.sampler = bilby.core.sampler.Pymultinest(self.likelihood, self.priors, - outdir='outdir', label='label', - use_ratio=False, plot=False, - skip_import_verification=True) + dict(a=bilby.core.prior.Uniform(0, 1), b=bilby.core.prior.Uniform(0, 1)) + ) + self.priors["a"] = bilby.core.prior.Prior(boundary="periodic") + self.priors["b"] = bilby.core.prior.Prior(boundary="reflective") + self.sampler = bilby.core.sampler.Pymultinest( + self.likelihood, + self.priors, + outdir="outdir", + label="label", + use_ratio=False, + plot=False, + skip_import_verification=True, + ) def tearDown(self): del self.likelihood @@ -489,17 +783,19 @@ class TestPymultinest(unittest.TestCase): max_modes=100, mode_tolerance=-1e90, seed=-1, context=0, write_output=True, log_zero=-1e100, max_iter=0, init_MPI=False, dump_callback=None) + for equiv in bilby.core.sampler.base_sampler.NestedSampler.npoints_equiv_kwargs: new_kwargs = self.sampler.kwargs.copy() - del new_kwargs['n_live_points'] - new_kwargs['wrapped_params'] = None # The dict comparison can't handle lists + del new_kwargs["n_live_points"] + new_kwargs[ + "wrapped_params" + ] = None # The dict comparison can't handle lists new_kwargs[equiv] = 123 self.sampler.kwargs = new_kwargs self.assertDictEqual(expected, self.sampler.kwargs) class TestRunningSamplers(unittest.TestCase): - def setUp(self): np.random.seed(42) bilby.core.utils.command_line_args.bilby_test_mode = False @@ -507,80 +803,140 @@ class TestRunningSamplers(unittest.TestCase): self.model = lambda x, m, c: m * x + c self.injection_parameters = dict(m=0.5, c=0.2) self.sigma = 0.1 - self.y = self.model(self.x, **self.injection_parameters) +\ - np.random.normal(0, self.sigma, len(self.x)) + self.y = self.model(self.x, **self.injection_parameters) + np.random.normal( + 0, self.sigma, len(self.x) + ) self.likelihood = bilby.likelihood.GaussianLikelihood( - self.x, self.y, self.model, self.sigma) + self.x, self.y, self.model, self.sigma + ) self.priors = bilby.core.prior.PriorDict() - self.priors['m'] = bilby.core.prior.Uniform(0, 5, boundary='reflective') - self.priors['c'] = bilby.core.prior.Uniform(-2, 2, boundary='reflective') - bilby.core.utils.check_directory_exists_and_if_not_mkdir('outdir') + self.priors["m"] = bilby.core.prior.Uniform(0, 5, boundary="reflective") + self.priors["c"] = bilby.core.prior.Uniform(-2, 2, boundary="reflective") + bilby.core.utils.check_directory_exists_and_if_not_mkdir("outdir") def tearDown(self): del self.likelihood del self.priors bilby.core.utils.command_line_args.bilby_test_mode = False - shutil.rmtree('outdir') + shutil.rmtree("outdir") def test_run_cpnest(self): _ = bilby.run_sampler( - likelihood=self.likelihood, priors=self.priors, sampler='cpnest', - nlive=100, save=False, resume=False) + likelihood=self.likelihood, + priors=self.priors, + sampler="cpnest", + nlive=100, + save=False, + resume=False, + ) def test_run_dynesty(self): _ = bilby.run_sampler( - likelihood=self.likelihood, priors=self.priors, sampler='dynesty', - nlive=100, save=False) + likelihood=self.likelihood, + priors=self.priors, + sampler="dynesty", + nlive=100, + save=False, + ) def test_run_dynamic_dynesty(self): _ = bilby.run_sampler( - likelihood=self.likelihood, priors=self.priors, sampler='dynamic_dynesty', - nlive_init=100, nlive_batch=100, dlogz_init=1.0, maxbatch=0, - maxcall=100, bound="single", save=False) + likelihood=self.likelihood, + priors=self.priors, + sampler="dynamic_dynesty", + nlive_init=100, + nlive_batch=100, + dlogz_init=1.0, + maxbatch=0, + maxcall=100, + bound="single", + save=False, + ) def test_run_emcee(self): _ = bilby.run_sampler( - likelihood=self.likelihood, priors=self.priors, sampler='emcee', - iterations=1000, nwalkers=10, save=False) + likelihood=self.likelihood, + priors=self.priors, + sampler="emcee", + iterations=1000, + nwalkers=10, + save=False, + ) def test_run_kombine(self): _ = bilby.run_sampler( - likelihood=self.likelihood, priors=self.priors, sampler='kombine', - iterations=1000, nwalkers=100, save=False, autoburnin=True) + likelihood=self.likelihood, + priors=self.priors, + sampler="kombine", + iterations=1000, + nwalkers=100, + save=False, + autoburnin=True, + ) def test_run_nestle(self): _ = bilby.run_sampler( - likelihood=self.likelihood, priors=self.priors, sampler='nestle', - nlive=100, save=False) + likelihood=self.likelihood, + priors=self.priors, + sampler="nestle", + nlive=100, + save=False, + ) def test_run_pypolychord(self): _ = bilby.run_sampler( - likelihood=self.likelihood, priors=self.priors, - sampler='pypolychord', nlive=100, save=False) + likelihood=self.likelihood, + priors=self.priors, + sampler="pypolychord", + nlive=100, + save=False, + ) def test_run_ptemcee(self): _ = bilby.run_sampler( - likelihood=self.likelihood, priors=self.priors, sampler='ptemcee', - nsamples=100, nwalkers=50, burn_in_act=1, ntemps=1, - frac_threshold=0.5, save=False) + likelihood=self.likelihood, + priors=self.priors, + sampler="ptemcee", + nsamples=100, + nwalkers=50, + burn_in_act=1, + ntemps=1, + frac_threshold=0.5, + save=False, + ) def test_run_pymc3(self): _ = bilby.run_sampler( - likelihood=self.likelihood, priors=self.priors, sampler='pymc3', - draws=50, tune=50, n_init=1000, save=False) + likelihood=self.likelihood, + priors=self.priors, + sampler="pymc3", + draws=50, + tune=50, + n_init=1000, + save=False, + ) def test_run_pymultinest(self): _ = bilby.run_sampler( - likelihood=self.likelihood, priors=self.priors, - sampler='pymultinest', nlive=100, save=False) + likelihood=self.likelihood, + priors=self.priors, + sampler="pymultinest", + nlive=100, + save=False, + ) def test_run_PTMCMCSampler(self): _ = bilby.run_sampler( - likelihood=self.likelihood, priors=self.priors, - sampler='PTMCMCsampler', Niter=101, burn=2, - isave=100, save=False) + likelihood=self.likelihood, + priors=self.priors, + sampler="PTMCMCsampler", + Niter=101, + burn=2, + isave=100, + save=False, + ) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/test/series_test.py b/test/series_test.py index 1eeec8cafbba747220bd731f09c166ee43085165..97849a13f4eb86dbcc9874aad85c0f1fae451b76 100644 --- a/test/series_test.py +++ b/test/series_test.py @@ -7,14 +7,15 @@ from bilby.core.series import CoupledTimeAndFrequencySeries class TestCoupledTimeAndFrequencySeries(unittest.TestCase): - def setUp(self): self.duration = 2 self.sampling_frequency = 4096 self.start_time = -1 self.series = CoupledTimeAndFrequencySeries( - duration=self.duration, sampling_frequency=self.sampling_frequency, - start_time=self.start_time) + duration=self.duration, + sampling_frequency=self.sampling_frequency, + start_time=self.start_time, + ) def tearDown(self): del self.duration @@ -23,19 +24,21 @@ class TestCoupledTimeAndFrequencySeries(unittest.TestCase): del self.series def test_repr(self): - expected =\ - 'CoupledTimeAndFrequencySeries(duration={}, sampling_frequency={},'\ - ' start_time={})'.format( - self.series.duration, self.series.sampling_frequency, - self.series.start_time) + expected = ( + "CoupledTimeAndFrequencySeries(duration={}, sampling_frequency={}," + " start_time={})".format( + self.series.duration, + self.series.sampling_frequency, + self.series.start_time, + ) + ) self.assertEqual(expected, repr(self.series)) def test_duration_from_init(self): self.assertEqual(self.duration, self.series.duration) def test_sampling_from_init(self): - self.assertEqual( - self.sampling_frequency, self.series.sampling_frequency) + self.assertEqual(self.sampling_frequency, self.series.sampling_frequency) def test_start_time_from_init(self): self.assertEqual(self.start_time, self.series.start_time) @@ -48,25 +51,31 @@ class TestCoupledTimeAndFrequencySeries(unittest.TestCase): def test_frequency_array_from_init(self): expected = create_frequency_series( - sampling_frequency=self.sampling_frequency, duration=self.duration) + sampling_frequency=self.sampling_frequency, duration=self.duration + ) self.assertTrue(np.array_equal(expected, self.series.frequency_array)) def test_time_array_from_init(self): expected = create_time_series( - sampling_frequency=self.sampling_frequency, duration=self.duration, - starting_time=self.start_time) + sampling_frequency=self.sampling_frequency, + duration=self.duration, + starting_time=self.start_time, + ) self.assertTrue(np.array_equal(expected, self.series.time_array)) def test_frequency_array_setter(self): new_sampling_frequency = 100 new_duration = 3 new_frequency_array = create_frequency_series( - sampling_frequency=new_sampling_frequency, duration=new_duration) + sampling_frequency=new_sampling_frequency, duration=new_duration + ) self.series.frequency_array = new_frequency_array - self.assertTrue(np.array_equal( - new_frequency_array, self.series.frequency_array)) - self.assertLessEqual(np.abs( - new_sampling_frequency - self.series.sampling_frequency), 1) + self.assertTrue( + np.array_equal(new_frequency_array, self.series.frequency_array) + ) + self.assertLessEqual( + np.abs(new_sampling_frequency - self.series.sampling_frequency), 1 + ) self.assertAlmostEqual(new_duration, self.series.duration) self.assertAlmostEqual(self.start_time, self.series.start_time) @@ -75,12 +84,15 @@ class TestCoupledTimeAndFrequencySeries(unittest.TestCase): new_duration = 3 new_start_time = 4 new_time_array = create_time_series( - sampling_frequency=new_sampling_frequency, duration=new_duration, - starting_time=new_start_time) + sampling_frequency=new_sampling_frequency, + duration=new_duration, + starting_time=new_start_time, + ) self.series.time_array = new_time_array self.assertTrue(np.array_equal(new_time_array, self.series.time_array)) self.assertAlmostEqual( - new_sampling_frequency, self.series.sampling_frequency, places=1) + new_sampling_frequency, self.series.sampling_frequency, places=1 + ) self.assertAlmostEqual(new_duration, self.series.duration, places=1) self.assertAlmostEqual(new_start_time, self.series.start_time, places=1) @@ -109,5 +121,5 @@ class TestCoupledTimeAndFrequencySeries(unittest.TestCase): _ = self.series.frequency_array -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/test/utils_py3_test.py b/test/utils_py3_test.py index 99af2d39cf069a00917f545f9cd326cc2506c8e5..fa0717bef6214576f0ec99c8652fda33acc7cc41 100644 --- a/test/utils_py3_test.py +++ b/test/utils_py3_test.py @@ -6,7 +6,6 @@ from bilby.core import utils class TestInferParameters(unittest.TestCase): - def setUp(self): def source_function1(freqs, a, b: int): return None @@ -40,26 +39,26 @@ class TestInferParameters(unittest.TestCase): del self.source4 def test_type_hinting(self): - expected = ['a', 'b'] + expected = ["a", "b"] actual = utils.infer_parameters_from_function(self.source1) self.assertListEqual(expected, actual) def test_args_kwargs_handling(self): - expected = ['a', 'b'] + expected = ["a", "b"] actual = utils.infer_parameters_from_function(self.source2) self.assertListEqual(expected, actual) def test_both(self): - expected = ['a', 'b'] + expected = ["a", "b"] actual = utils.infer_parameters_from_function(self.source3) self.assertListEqual(expected, actual) def test_self_handling(self): - expected = ['a', 'b'] + expected = ["a", "b"] actual = utils.infer_args_from_method(self.source4) self.assertListEqual(expected, actual) def test_self_handling_method_as_function(self): - expected = ['a', 'b'] + expected = ["a", "b"] actual = utils.infer_args_from_method(self.source5) self.assertListEqual(expected, actual) diff --git a/test/utils_test.py b/test/utils_test.py index 6245683de36eaa3bcd161e6a475c4a081434b973..49911364661375bd479aa6ddf703016721df9501 100644 --- a/test/utils_test.py +++ b/test/utils_test.py @@ -10,34 +10,32 @@ from bilby.core import utils class TestConstants(unittest.TestCase): - def test_speed_of_light(self): self.assertEqual(utils.speed_of_light, lal.C_SI) self.assertLess( - abs(utils.speed_of_light - constants.c.value) / utils.speed_of_light, - 1e-16) + abs(utils.speed_of_light - constants.c.value) / utils.speed_of_light, 1e-16 + ) def test_parsec(self): self.assertEqual(utils.parsec, lal.PC_SI) - self.assertLess( - abs(utils.parsec - constants.pc.value) / utils.parsec, - 1e-11) + self.assertLess(abs(utils.parsec - constants.pc.value) / utils.parsec, 1e-11) def test_solar_mass(self): self.assertEqual(utils.solar_mass, lal.MSUN_SI) self.assertLess( - abs(utils.solar_mass - constants.M_sun.value) / utils.solar_mass, - 1e-4) + abs(utils.solar_mass - constants.M_sun.value) / utils.solar_mass, 1e-4 + ) def test_radius_of_earth(self): self.assertEqual(bilby.core.utils.radius_of_earth, lal.REARTH_SI) self.assertLess( - abs(utils.radius_of_earth - constants.R_earth.value) / utils.radius_of_earth, - 1e-5) + abs(utils.radius_of_earth - constants.R_earth.value) + / utils.radius_of_earth, + 1e-5, + ) class TestFFT(unittest.TestCase): - def setUp(self): self.sampling_frequency = 10 @@ -51,19 +49,24 @@ class TestFFT(unittest.TestCase): time_domain_strain = np.sin(2 * np.pi * times * injected_frequency + 0.4) - frequency_domain_strain, frequencies = bilby.core.utils.nfft(time_domain_strain, self.sampling_frequency) + frequency_domain_strain, frequencies = bilby.core.utils.nfft( + time_domain_strain, self.sampling_frequency + ) frequency_at_peak = frequencies[np.argmax(np.abs(frequency_domain_strain))] self.assertAlmostEqual(injected_frequency, frequency_at_peak, places=1) def test_nfft_infft(self): time_domain_strain = np.random.normal(0, 1, 10) - frequency_domain_strain, _ = bilby.core.utils.nfft(time_domain_strain, self.sampling_frequency) - new_time_domain_strain = bilby.core.utils.infft(frequency_domain_strain, self.sampling_frequency) + frequency_domain_strain, _ = bilby.core.utils.nfft( + time_domain_strain, self.sampling_frequency + ) + new_time_domain_strain = bilby.core.utils.infft( + frequency_domain_strain, self.sampling_frequency + ) self.assertTrue(np.allclose(time_domain_strain, new_time_domain_strain)) class TestInferParameters(unittest.TestCase): - def setUp(self): def source_function(freqs, a, b, *args, **kwargs): return None @@ -86,33 +89,35 @@ class TestInferParameters(unittest.TestCase): del self.source1 del self.source2 - def test_args_kwargs_handling(self): - expected = ['a', 'b'] + expected = ["a", "b"] actual = utils.infer_parameters_from_function(self.source1) self.assertListEqual(expected, actual) def test_self_handling(self): - expected = ['a', 'b'] + expected = ["a", "b"] actual = utils.infer_args_from_method(self.source2) self.assertListEqual(expected, actual) - + def test_self_handling_method_as_function(self): - expected = ['a', 'b'] + expected = ["a", "b"] actual = utils.infer_parameters_from_function(self.source3) self.assertListEqual(expected, actual) -class TestTimeAndFrequencyArrays(unittest.TestCase): +class TestTimeAndFrequencyArrays(unittest.TestCase): def setUp(self): self.start_time = 1.3 self.sampling_frequency = 5 self.duration = 1.6 - self.frequency_array = utils.create_frequency_series(sampling_frequency=self.sampling_frequency, - duration=self.duration) - self.time_array = utils.create_time_series(sampling_frequency=self.sampling_frequency, - duration=self.duration, - starting_time=self.start_time) + self.frequency_array = utils.create_frequency_series( + sampling_frequency=self.sampling_frequency, duration=self.duration + ) + self.time_array = utils.create_time_series( + sampling_frequency=self.sampling_frequency, + duration=self.duration, + starting_time=self.start_time, + ) def tearDown(self): del self.start_time @@ -123,28 +128,38 @@ class TestTimeAndFrequencyArrays(unittest.TestCase): def test_create_time_array(self): expected_time_array = np.array([1.3, 1.5, 1.7, 1.9, 2.1, 2.3, 2.5, 2.7]) - time_array = utils.create_time_series(sampling_frequency=self.sampling_frequency, - duration=self.duration, starting_time=self.start_time) + time_array = utils.create_time_series( + sampling_frequency=self.sampling_frequency, + duration=self.duration, + starting_time=self.start_time, + ) self.assertTrue(np.allclose(expected_time_array, time_array)) def test_create_frequency_array(self): expected_frequency_array = np.array([0.0, 0.625, 1.25, 1.875, 2.5]) - frequency_array = utils.create_frequency_series(sampling_frequency=self.sampling_frequency, - duration=self.duration) + frequency_array = utils.create_frequency_series( + sampling_frequency=self.sampling_frequency, duration=self.duration + ) self.assertTrue(np.allclose(expected_frequency_array, frequency_array)) def test_get_sampling_frequency_from_time_array(self): - new_sampling_freq, _ = utils.get_sampling_frequency_and_duration_from_time_array( - self.time_array) + ( + new_sampling_freq, + _, + ) = utils.get_sampling_frequency_and_duration_from_time_array(self.time_array) self.assertEqual(self.sampling_frequency, new_sampling_freq) def test_get_sampling_frequency_from_time_array_unequally_sampled(self): self.time_array[-1] += 0.0001 with self.assertRaises(ValueError): - _, _ = utils.get_sampling_frequency_and_duration_from_time_array(self.time_array) + _, _ = utils.get_sampling_frequency_and_duration_from_time_array( + self.time_array + ) def test_get_duration_from_time_array(self): - _, new_duration = utils.get_sampling_frequency_and_duration_from_time_array(self.time_array) + _, new_duration = utils.get_sampling_frequency_and_duration_from_time_array( + self.time_array + ) self.assertEqual(self.duration, new_duration) def test_get_start_time_from_time_array(self): @@ -152,74 +167,88 @@ class TestTimeAndFrequencyArrays(unittest.TestCase): self.assertEqual(self.start_time, new_start_time) def test_get_sampling_frequency_from_frequency_array(self): - new_sampling_freq, _ = utils.get_sampling_frequency_and_duration_from_frequency_array( - self.frequency_array) + ( + new_sampling_freq, + _, + ) = utils.get_sampling_frequency_and_duration_from_frequency_array( + self.frequency_array + ) self.assertEqual(self.sampling_frequency, new_sampling_freq) def test_get_sampling_frequency_from_frequency_array_unequally_sampled(self): self.frequency_array[-1] += 0.0001 with self.assertRaises(ValueError): - _, _ = utils.get_sampling_frequency_and_duration_from_frequency_array(self.frequency_array) + _, _ = utils.get_sampling_frequency_and_duration_from_frequency_array( + self.frequency_array + ) def test_get_duration_from_frequency_array(self): - _, new_duration = utils.get_sampling_frequency_and_duration_from_frequency_array( - self.frequency_array) + ( + _, + new_duration, + ) = utils.get_sampling_frequency_and_duration_from_frequency_array( + self.frequency_array + ) self.assertEqual(self.duration, new_duration) def test_consistency_time_array_to_time_array(self): - new_sampling_frequency, new_duration = \ - utils.get_sampling_frequency_and_duration_from_time_array(self.time_array) + ( + new_sampling_frequency, + new_duration, + ) = utils.get_sampling_frequency_and_duration_from_time_array(self.time_array) new_start_time = self.time_array[0] - new_time_array = utils.create_time_series(sampling_frequency=new_sampling_frequency, - duration=new_duration, - starting_time=new_start_time) + new_time_array = utils.create_time_series( + sampling_frequency=new_sampling_frequency, + duration=new_duration, + starting_time=new_start_time, + ) self.assertTrue(np.allclose(self.time_array, new_time_array)) def test_consistency_frequency_array_to_frequency_array(self): - new_sampling_frequency, new_duration = utils.get_sampling_frequency_and_duration_from_frequency_array(self.frequency_array) - new_frequency_array = \ - utils.create_frequency_series(sampling_frequency=new_sampling_frequency, - duration=new_duration) + ( + new_sampling_frequency, + new_duration, + ) = utils.get_sampling_frequency_and_duration_from_frequency_array( + self.frequency_array + ) + new_frequency_array = utils.create_frequency_series( + sampling_frequency=new_sampling_frequency, duration=new_duration + ) self.assertTrue(np.allclose(self.frequency_array, new_frequency_array)) def test_illegal_sampling_frequency_and_duration(self): with self.assertRaises(utils.IllegalDurationAndSamplingFrequencyException): - _ = utils.create_time_series(sampling_frequency=7.7, - duration=1.3, - starting_time=0) + _ = utils.create_time_series( + sampling_frequency=7.7, duration=1.3, starting_time=0 + ) class TestReflect(unittest.TestCase): - def test_in_range(self): xprime = np.array([0.1, 0.5, 0.9]) x = np.array([0.1, 0.5, 0.9]) - self.assertTrue( - np.testing.assert_allclose(utils.reflect(xprime), x) is None) + self.assertTrue(np.testing.assert_allclose(utils.reflect(xprime), x) is None) def test_in_one_to_two(self): xprime = np.array([1.1, 1.5, 1.9]) x = np.array([0.9, 0.5, 0.1]) - self.assertTrue( - np.testing.assert_allclose(utils.reflect(xprime), x) is None) + self.assertTrue(np.testing.assert_allclose(utils.reflect(xprime), x) is None) def test_in_two_to_three(self): xprime = np.array([2.1, 2.5, 2.9]) x = np.array([0.1, 0.5, 0.9]) - self.assertTrue( - np.testing.assert_allclose(utils.reflect(xprime), x) is None) + self.assertTrue(np.testing.assert_allclose(utils.reflect(xprime), x) is None) def test_in_minus_one_to_zero(self): xprime = np.array([-0.9, -0.5, -0.1]) x = np.array([0.9, 0.5, 0.1]) - self.assertTrue( - np.testing.assert_allclose(utils.reflect(xprime), x) is None) + self.assertTrue(np.testing.assert_allclose(utils.reflect(xprime), x) is None) def test_in_minus_two_to_minus_one(self): xprime = np.array([-1.9, -1.5, -1.1]) x = np.array([0.1, 0.5, 0.9]) - self.assertTrue( - np.testing.assert_allclose(utils.reflect(xprime), x) is None) + self.assertTrue(np.testing.assert_allclose(utils.reflect(xprime), x) is None) + -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/test/waveform_generator_test.py b/test/waveform_generator_test.py index 86d433ccd94be3f37e214655c7aced5ba4c9ccd2..69e3112c07ea995492689fdca5ee40c83a64a0f1 100644 --- a/test/waveform_generator_test.py +++ b/test/waveform_generator_test.py @@ -8,64 +8,94 @@ import lal import lalsimulation as lalsim -def dummy_func_array_return_value(frequency_array, amplitude, mu, sigma, ra, dec, geocent_time, psi, **kwargs): +def dummy_func_array_return_value( + frequency_array, amplitude, mu, sigma, ra, dec, geocent_time, psi, **kwargs +): return amplitude + mu + frequency_array + sigma + ra + dec + geocent_time + psi -def dummy_func_dict_return_value(frequency_array, amplitude, mu, sigma, ra, dec, geocent_time, psi, **kwargs): - ht = {'plus': amplitude + mu + frequency_array + sigma + ra + dec + geocent_time + psi, - 'cross': amplitude + mu + frequency_array + sigma + ra + dec + geocent_time + psi} +def dummy_func_dict_return_value( + frequency_array, amplitude, mu, sigma, ra, dec, geocent_time, psi, **kwargs +): + ht = { + "plus": amplitude + + mu + + frequency_array + + sigma + + ra + + dec + + geocent_time + + psi, + "cross": amplitude + + mu + + frequency_array + + sigma + + ra + + dec + + geocent_time + + psi, + } return ht -def dummy_func_array_return_value_2(array, amplitude, mu, sigma, ra, dec, geocent_time, psi): +def dummy_func_array_return_value_2( + array, amplitude, mu, sigma, ra, dec, geocent_time, psi +): return dict(plus=np.array(array), cross=np.array(array)) class TestWaveformGeneratorInstantiationWithoutOptionalParameters(unittest.TestCase): - def setUp(self): - self.waveform_generator = \ - bilby.gw.waveform_generator.WaveformGenerator( - 1, 4096, - frequency_domain_source_model=dummy_func_dict_return_value) - self.simulation_parameters = dict(amplitude=1e-21, mu=100, sigma=1, - ra=1.375, - dec=-1.2108, - geocent_time=1126259642.413, - psi=2.659) + self.waveform_generator = bilby.gw.waveform_generator.WaveformGenerator( + 1, 4096, frequency_domain_source_model=dummy_func_dict_return_value + ) + self.simulation_parameters = dict( + amplitude=1e-21, + mu=100, + sigma=1, + ra=1.375, + dec=-1.2108, + geocent_time=1126259642.413, + psi=2.659, + ) def tearDown(self): del self.waveform_generator del self.simulation_parameters def test_repr(self): - expected = 'WaveformGenerator(duration={}, sampling_frequency={}, start_time={}, ' \ - 'frequency_domain_source_model={}, time_domain_source_model={}, ' \ - 'parameter_conversion={}, waveform_arguments={})'\ - .format(self.waveform_generator.duration, - self.waveform_generator.sampling_frequency, - self.waveform_generator.start_time, - self.waveform_generator.frequency_domain_source_model.__name__, - self.waveform_generator.time_domain_source_model, - None, - self.waveform_generator.waveform_arguments) + expected = ( + "WaveformGenerator(duration={}, sampling_frequency={}, start_time={}, " + "frequency_domain_source_model={}, time_domain_source_model={}, " + "parameter_conversion={}, waveform_arguments={})".format( + self.waveform_generator.duration, + self.waveform_generator.sampling_frequency, + self.waveform_generator.start_time, + self.waveform_generator.frequency_domain_source_model.__name__, + self.waveform_generator.time_domain_source_model, + None, + self.waveform_generator.waveform_arguments, + ) + ) self.assertEqual(expected, repr(self.waveform_generator)) def test_repr_with_time_domain_source_model(self): - self.waveform_generator = \ - bilby.gw.waveform_generator.WaveformGenerator(1, 4096, - time_domain_source_model=dummy_func_dict_return_value) - expected = 'WaveformGenerator(duration={}, sampling_frequency={}, start_time={}, ' \ - 'frequency_domain_source_model={}, time_domain_source_model={}, ' \ - 'parameter_conversion={}, waveform_arguments={})'\ - .format(self.waveform_generator.duration, - self.waveform_generator.sampling_frequency, - self.waveform_generator.start_time, - self.waveform_generator.frequency_domain_source_model, - self.waveform_generator.time_domain_source_model.__name__, - None, - self.waveform_generator.waveform_arguments) + self.waveform_generator = bilby.gw.waveform_generator.WaveformGenerator( + 1, 4096, time_domain_source_model=dummy_func_dict_return_value + ) + expected = ( + "WaveformGenerator(duration={}, sampling_frequency={}, start_time={}, " + "frequency_domain_source_model={}, time_domain_source_model={}, " + "parameter_conversion={}, waveform_arguments={})".format( + self.waveform_generator.duration, + self.waveform_generator.sampling_frequency, + self.waveform_generator.start_time, + self.waveform_generator.frequency_domain_source_model, + self.waveform_generator.time_domain_source_model.__name__, + None, + self.waveform_generator.waveform_arguments, + ) + ) self.assertEqual(expected, repr(self.waveform_generator)) def test_repr_with_param_conversion(self): @@ -73,16 +103,19 @@ class TestWaveformGeneratorInstantiationWithoutOptionalParameters(unittest.TestC pass self.waveform_generator.parameter_conversion = conversion_func - expected = 'WaveformGenerator(duration={}, sampling_frequency={}, start_time={}, ' \ - 'frequency_domain_source_model={}, time_domain_source_model={}, ' \ - 'parameter_conversion={}, waveform_arguments={})'\ - .format(self.waveform_generator.duration, - self.waveform_generator.sampling_frequency, - self.waveform_generator.start_time, - self.waveform_generator.frequency_domain_source_model.__name__, - self.waveform_generator.time_domain_source_model, - conversion_func.__name__, - self.waveform_generator.waveform_arguments) + expected = ( + "WaveformGenerator(duration={}, sampling_frequency={}, start_time={}, " + "frequency_domain_source_model={}, time_domain_source_model={}, " + "parameter_conversion={}, waveform_arguments={})".format( + self.waveform_generator.duration, + self.waveform_generator.sampling_frequency, + self.waveform_generator.start_time, + self.waveform_generator.frequency_domain_source_model.__name__, + self.waveform_generator.time_domain_source_model, + conversion_func.__name__, + self.waveform_generator.waveform_arguments, + ) + ) self.assertEqual(expected, repr(self.waveform_generator)) def test_duration(self): @@ -92,7 +125,10 @@ class TestWaveformGeneratorInstantiationWithoutOptionalParameters(unittest.TestC self.assertEqual(self.waveform_generator.sampling_frequency, 4096) def test_source_model(self): - self.assertEqual(self.waveform_generator.frequency_domain_source_model, dummy_func_dict_return_value) + self.assertEqual( + self.waveform_generator.frequency_domain_source_model, + dummy_func_dict_return_value, + ) def test_frequency_array_type(self): self.assertIsInstance(self.waveform_generator.frequency_array, np.ndarray) @@ -102,36 +138,45 @@ class TestWaveformGeneratorInstantiationWithoutOptionalParameters(unittest.TestC def test_source_model_parameters(self): self.waveform_generator.parameters = self.simulation_parameters.copy() - self.assertListEqual(sorted(list(self.waveform_generator.parameters.keys())), - sorted(list(self.simulation_parameters.keys()))) + self.assertListEqual( + sorted(list(self.waveform_generator.parameters.keys())), + sorted(list(self.simulation_parameters.keys())), + ) class TestWaveformArgumentsSetting(unittest.TestCase): def setUp(self): - self.waveform_generator = \ - bilby.gw.waveform_generator.WaveformGenerator(1, 4096, - frequency_domain_source_model=dummy_func_dict_return_value, - waveform_arguments=dict(test='test', arguments='arguments')) + self.waveform_generator = bilby.gw.waveform_generator.WaveformGenerator( + 1, + 4096, + frequency_domain_source_model=dummy_func_dict_return_value, + waveform_arguments=dict(test="test", arguments="arguments"), + ) def tearDown(self): del self.waveform_generator def test_waveform_arguments_init_setting(self): - self.assertDictEqual(self.waveform_generator.waveform_arguments, - dict(test='test', arguments='arguments')) + self.assertDictEqual( + self.waveform_generator.waveform_arguments, + dict(test="test", arguments="arguments"), + ) class TestSetters(unittest.TestCase): - def setUp(self): - self.waveform_generator = \ - bilby.gw.waveform_generator.WaveformGenerator(1, 4096, - frequency_domain_source_model=dummy_func_dict_return_value) - self.simulation_parameters = dict(amplitude=1e-21, mu=100, sigma=1, - ra=1.375, - dec=-1.2108, - geocent_time=1126259642.413, - psi=2.659) + self.waveform_generator = bilby.gw.waveform_generator.WaveformGenerator( + 1, 4096, frequency_domain_source_model=dummy_func_dict_return_value + ) + self.simulation_parameters = dict( + amplitude=1e-21, + mu=100, + sigma=1, + ra=1.375, + dec=-1.2108, + geocent_time=1126259642.413, + psi=2.659, + ) def tearDown(self): del self.waveform_generator @@ -140,7 +185,9 @@ class TestSetters(unittest.TestCase): def test_parameter_setter_sets_expected_values_with_expected_keys(self): self.waveform_generator.parameters = self.simulation_parameters.copy() for key in self.simulation_parameters: - self.assertEqual(self.waveform_generator.parameters[key], self.simulation_parameters[key]) + self.assertEqual( + self.waveform_generator.parameters[key], self.simulation_parameters[key] + ) def test_parameter_setter_none_handling(self): with self.assertRaises(TypeError): @@ -151,71 +198,94 @@ class TestSetters(unittest.TestCase): def test_frequency_array_setter(self): new_frequency_array = np.arange(1, 100) self.waveform_generator.frequency_array = new_frequency_array - self.assertTrue(np.array_equal(new_frequency_array, self.waveform_generator.frequency_array)) + self.assertTrue( + np.array_equal(new_frequency_array, self.waveform_generator.frequency_array) + ) def test_time_array_setter(self): new_time_array = np.arange(1, 100) self.waveform_generator.time_array = new_time_array - self.assertTrue(np.array_equal(new_time_array, self.waveform_generator.time_array)) + self.assertTrue( + np.array_equal(new_time_array, self.waveform_generator.time_array) + ) def test_parameters_set_from_frequency_domain_source_model(self): - self.waveform_generator.frequency_domain_source_model = dummy_func_dict_return_value + self.waveform_generator.frequency_domain_source_model = ( + dummy_func_dict_return_value + ) self.waveform_generator.parameters = self.simulation_parameters.copy() - self.assertListEqual(sorted(list(self.waveform_generator.parameters.keys())), - sorted(list(self.simulation_parameters.keys()))) + self.assertListEqual( + sorted(list(self.waveform_generator.parameters.keys())), + sorted(list(self.simulation_parameters.keys())), + ) def test_parameters_set_from_time_domain_source_model(self): self.waveform_generator.time_domain_source_model = dummy_func_dict_return_value self.waveform_generator.parameters = self.simulation_parameters.copy() - self.assertListEqual(sorted(list(self.waveform_generator.parameters.keys())), - sorted(list(self.simulation_parameters.keys()))) + self.assertListEqual( + sorted(list(self.waveform_generator.parameters.keys())), + sorted(list(self.simulation_parameters.keys())), + ) def test_set_parameter_conversion_at_init(self): def conversion_func(): pass - self.waveform_generator = \ - bilby.gw.waveform_generator.WaveformGenerator(1, 4096, - frequency_domain_source_model=dummy_func_dict_return_value, - parameter_conversion=conversion_func) + self.waveform_generator = bilby.gw.waveform_generator.WaveformGenerator( + 1, + 4096, + frequency_domain_source_model=dummy_func_dict_return_value, + parameter_conversion=conversion_func, + ) self.assertEqual(conversion_func, self.waveform_generator.parameter_conversion) class TestFrequencyDomainStrainMethod(unittest.TestCase): - def setUp(self): - self.waveform_generator = \ - bilby.gw.waveform_generator.WaveformGenerator(duration=1, sampling_frequency=4096, - frequency_domain_source_model=dummy_func_dict_return_value) - self.simulation_parameters = dict(amplitude=1e-2, mu=100, sigma=1, - ra=1.375, - dec=-1.2108, - geocent_time=1126259642.413, - psi=2.659) + self.waveform_generator = bilby.gw.waveform_generator.WaveformGenerator( + duration=1, + sampling_frequency=4096, + frequency_domain_source_model=dummy_func_dict_return_value, + ) + self.simulation_parameters = dict( + amplitude=1e-2, + mu=100, + sigma=1, + ra=1.375, + dec=-1.2108, + geocent_time=1126259642.413, + psi=2.659, + ) def tearDown(self): del self.waveform_generator del self.simulation_parameters def test_parameter_conversion_is_called(self): - self.waveform_generator.parameter_conversion = MagicMock(side_effect=KeyError('test')) + self.waveform_generator.parameter_conversion = MagicMock( + side_effect=KeyError("test") + ) with self.assertRaises(KeyError): self.waveform_generator.frequency_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) def test_frequency_domain_source_model_call(self): - expected = self.waveform_generator.frequency_domain_source_model(self.waveform_generator.frequency_array, - self.simulation_parameters['amplitude'], - self.simulation_parameters['mu'], - self.simulation_parameters['sigma'], - self.simulation_parameters['ra'], - self.simulation_parameters['dec'], - self.simulation_parameters['geocent_time'], - self.simulation_parameters['psi']) + expected = self.waveform_generator.frequency_domain_source_model( + self.waveform_generator.frequency_array, + self.simulation_parameters["amplitude"], + self.simulation_parameters["mu"], + self.simulation_parameters["sigma"], + self.simulation_parameters["ra"], + self.simulation_parameters["dec"], + self.simulation_parameters["geocent_time"], + self.simulation_parameters["psi"], + ) actual = self.waveform_generator.frequency_domain_strain( - parameters=self.simulation_parameters) - self.assertTrue(np.array_equal(expected['plus'], actual['plus'])) - self.assertTrue(np.array_equal(expected['cross'], actual['cross'])) + parameters=self.simulation_parameters + ) + self.assertTrue(np.array_equal(expected["plus"], actual["plus"])) + self.assertTrue(np.array_equal(expected["cross"], actual["cross"])) def test_time_domain_source_model_call_with_ndarray(self): self.waveform_generator.frequency_domain_source_model = None @@ -224,12 +294,14 @@ class TestFrequencyDomainStrainMethod(unittest.TestCase): def side_effect(value, value2): return value - with mock.patch('bilby.core.utils.nfft') as m: + with mock.patch("bilby.core.utils.nfft") as m: m.side_effect = side_effect expected = self.waveform_generator.time_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) actual = self.waveform_generator.frequency_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) self.assertTrue(np.array_equal(expected, actual)) def test_time_domain_source_model_call_with_dict(self): @@ -239,227 +311,321 @@ class TestFrequencyDomainStrainMethod(unittest.TestCase): def side_effect(value, value2): return value, self.waveform_generator.frequency_array - with mock.patch('bilby.core.utils.nfft') as m: + with mock.patch("bilby.core.utils.nfft") as m: m.side_effect = side_effect expected = self.waveform_generator.time_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) actual = self.waveform_generator.frequency_domain_strain( - parameters=self.simulation_parameters) - self.assertTrue(np.array_equal(expected['plus'], actual['plus'])) - self.assertTrue(np.array_equal(expected['cross'], actual['cross'])) + parameters=self.simulation_parameters + ) + self.assertTrue(np.array_equal(expected["plus"], actual["plus"])) + self.assertTrue(np.array_equal(expected["cross"], actual["cross"])) def test_no_source_model_given(self): self.waveform_generator.time_domain_source_model = None self.waveform_generator.frequency_domain_source_model = None with self.assertRaises(RuntimeError): self.waveform_generator.frequency_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) def test_key_popping(self): - self.waveform_generator.parameter_conversion = MagicMock(return_value=(dict(amplitude=1e-21, mu=100, sigma=1, - ra=1.375, dec=-1.2108, - geocent_time=1126259642.413, - psi=2.659, c=None, d=None), - ['c', 'd'])) + self.waveform_generator.parameter_conversion = MagicMock( + return_value=( + dict( + amplitude=1e-21, + mu=100, + sigma=1, + ra=1.375, + dec=-1.2108, + geocent_time=1126259642.413, + psi=2.659, + c=None, + d=None, + ), + ["c", "d"], + ) + ) try: self.waveform_generator.frequency_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) except RuntimeError: pass - self.assertListEqual(sorted(self.waveform_generator.parameters.keys()), - sorted(['amplitude', 'mu', 'sigma', 'ra', 'dec', 'geocent_time', 'psi'])) + self.assertListEqual( + sorted(self.waveform_generator.parameters.keys()), + sorted(["amplitude", "mu", "sigma", "ra", "dec", "geocent_time", "psi"]), + ) def test_caching_with_parameters(self): original_waveform = self.waveform_generator.frequency_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) new_waveform = self.waveform_generator.frequency_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) self.assertDictEqual(original_waveform, new_waveform) def test_caching_without_parameters(self): original_waveform = self.waveform_generator.frequency_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) new_waveform = self.waveform_generator.frequency_domain_strain() self.assertDictEqual(original_waveform, new_waveform) - def test_frequency_domain_caching_and_using_time_domain_strain_without_parameters(self): + def test_frequency_domain_caching_and_using_time_domain_strain_without_parameters( + self, + ): original_waveform = self.waveform_generator.frequency_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) new_waveform = self.waveform_generator.time_domain_strain() self.assertNotEqual(original_waveform, new_waveform) - def test_frequency_domain_caching_and_using_time_domain_strain_with_parameters(self): + def test_frequency_domain_caching_and_using_time_domain_strain_with_parameters( + self, + ): original_waveform = self.waveform_generator.frequency_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) new_waveform = self.waveform_generator.time_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) self.assertNotEqual(original_waveform, new_waveform) - def test_time_domain_caching_and_using_frequency_domain_strain_without_parameters(self): + def test_time_domain_caching_and_using_frequency_domain_strain_without_parameters( + self, + ): original_waveform = self.waveform_generator.time_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) new_waveform = self.waveform_generator.frequency_domain_strain() self.assertNotEqual(original_waveform, new_waveform) - def test_time_domain_caching_and_using_frequency_domain_strain_with_parameters(self): + def test_time_domain_caching_and_using_frequency_domain_strain_with_parameters( + self, + ): original_waveform = self.waveform_generator.time_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) new_waveform = self.waveform_generator.frequency_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) self.assertNotEqual(original_waveform, new_waveform) def test_frequency_domain_caching_changing_model(self): original_waveform = self.waveform_generator.frequency_domain_strain( - parameters=self.simulation_parameters) - self.waveform_generator.frequency_domain_source_model = dummy_func_array_return_value_2 + parameters=self.simulation_parameters + ) + self.waveform_generator.frequency_domain_source_model = ( + dummy_func_array_return_value_2 + ) new_waveform = self.waveform_generator.frequency_domain_strain( - parameters=self.simulation_parameters) - self.assertFalse(np.array_equal(original_waveform['plus'], new_waveform['plus'])) + parameters=self.simulation_parameters + ) + self.assertFalse( + np.array_equal(original_waveform["plus"], new_waveform["plus"]) + ) def test_time_domain_caching_changing_model(self): - self.waveform_generator = \ - bilby.gw.waveform_generator.WaveformGenerator(duration=1, sampling_frequency=4096, - time_domain_source_model=dummy_func_dict_return_value) + self.waveform_generator = bilby.gw.waveform_generator.WaveformGenerator( + duration=1, + sampling_frequency=4096, + time_domain_source_model=dummy_func_dict_return_value, + ) original_waveform = self.waveform_generator.frequency_domain_strain( - parameters=self.simulation_parameters) - self.waveform_generator.time_domain_source_model = dummy_func_array_return_value_2 + parameters=self.simulation_parameters + ) + self.waveform_generator.time_domain_source_model = ( + dummy_func_array_return_value_2 + ) new_waveform = self.waveform_generator.frequency_domain_strain( - parameters=self.simulation_parameters) - self.assertFalse(np.array_equal(original_waveform['plus'], new_waveform['plus'])) + parameters=self.simulation_parameters + ) + self.assertFalse( + np.array_equal(original_waveform["plus"], new_waveform["plus"]) + ) class TestTimeDomainStrainMethod(unittest.TestCase): - def setUp(self): - self.waveform_generator = \ - bilby.gw.waveform_generator.WaveformGenerator(1, 4096, - time_domain_source_model=dummy_func_dict_return_value) - self.simulation_parameters = dict(amplitude=1e-21, mu=100, sigma=1, - ra=1.375, - dec=-1.2108, - geocent_time=1126259642.413, - psi=2.659) + self.waveform_generator = bilby.gw.waveform_generator.WaveformGenerator( + 1, 4096, time_domain_source_model=dummy_func_dict_return_value + ) + self.simulation_parameters = dict( + amplitude=1e-21, + mu=100, + sigma=1, + ra=1.375, + dec=-1.2108, + geocent_time=1126259642.413, + psi=2.659, + ) def tearDown(self): del self.waveform_generator del self.simulation_parameters def test_parameter_conversion_is_called(self): - self.waveform_generator.parameter_conversion = MagicMock(side_effect=KeyError('test')) + self.waveform_generator.parameter_conversion = MagicMock( + side_effect=KeyError("test") + ) with self.assertRaises(KeyError): self.waveform_generator.time_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) def test_time_domain_source_model_call(self): - expected = self.waveform_generator.time_domain_source_model(self.waveform_generator.time_array, - self.simulation_parameters['amplitude'], - self.simulation_parameters['mu'], - self.simulation_parameters['sigma'], - self.simulation_parameters['ra'], - self.simulation_parameters['dec'], - self.simulation_parameters['geocent_time'], - self.simulation_parameters['psi']) + expected = self.waveform_generator.time_domain_source_model( + self.waveform_generator.time_array, + self.simulation_parameters["amplitude"], + self.simulation_parameters["mu"], + self.simulation_parameters["sigma"], + self.simulation_parameters["ra"], + self.simulation_parameters["dec"], + self.simulation_parameters["geocent_time"], + self.simulation_parameters["psi"], + ) actual = self.waveform_generator.time_domain_strain( - parameters=self.simulation_parameters) - self.assertTrue(np.array_equal(expected['plus'], actual['plus'])) - self.assertTrue(np.array_equal(expected['cross'], actual['cross'])) + parameters=self.simulation_parameters + ) + self.assertTrue(np.array_equal(expected["plus"], actual["plus"])) + self.assertTrue(np.array_equal(expected["cross"], actual["cross"])) def test_frequency_domain_source_model_call_with_ndarray(self): self.waveform_generator.time_domain_source_model = None - self.waveform_generator.frequency_domain_source_model = dummy_func_array_return_value + self.waveform_generator.frequency_domain_source_model = ( + dummy_func_array_return_value + ) def side_effect(value, value2): return value - with mock.patch('bilby.core.utils.infft') as m: + with mock.patch("bilby.core.utils.infft") as m: m.side_effect = side_effect expected = self.waveform_generator.frequency_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) actual = self.waveform_generator.time_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) self.assertTrue(np.array_equal(expected, actual)) def test_frequency_domain_source_model_call_with_dict(self): self.waveform_generator.time_domain_source_model = None - self.waveform_generator.frequency_domain_source_model = dummy_func_dict_return_value + self.waveform_generator.frequency_domain_source_model = ( + dummy_func_dict_return_value + ) def side_effect(value, value2): return value - with mock.patch('bilby.core.utils.infft') as m: + with mock.patch("bilby.core.utils.infft") as m: m.side_effect = side_effect expected = self.waveform_generator.frequency_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) actual = self.waveform_generator.time_domain_strain( - parameters=self.simulation_parameters) - self.assertTrue(np.array_equal(expected['plus'], actual['plus'])) - self.assertTrue(np.array_equal(expected['cross'], actual['cross'])) + parameters=self.simulation_parameters + ) + self.assertTrue(np.array_equal(expected["plus"], actual["plus"])) + self.assertTrue(np.array_equal(expected["cross"], actual["cross"])) def test_no_source_model_given(self): self.waveform_generator.time_domain_source_model = None self.waveform_generator.frequency_domain_source_model = None with self.assertRaises(RuntimeError): self.waveform_generator.time_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) def test_key_popping(self): - self.waveform_generator.parameter_conversion = MagicMock(return_value=(dict(amplitude=1e-2, - mu=100, - sigma=1, - ra=1.375, dec=-1.2108, - geocent_time=1126259642.413, - psi=2.659, c=None, d=None), - ['c', 'd'])) + self.waveform_generator.parameter_conversion = MagicMock( + return_value=( + dict( + amplitude=1e-2, + mu=100, + sigma=1, + ra=1.375, + dec=-1.2108, + geocent_time=1126259642.413, + psi=2.659, + c=None, + d=None, + ), + ["c", "d"], + ) + ) try: self.waveform_generator.time_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) except RuntimeError: pass - self.assertListEqual(sorted(self.waveform_generator.parameters.keys()), - sorted(['amplitude', 'mu', 'sigma', 'ra', 'dec', 'geocent_time', 'psi'])) + self.assertListEqual( + sorted(self.waveform_generator.parameters.keys()), + sorted(["amplitude", "mu", "sigma", "ra", "dec", "geocent_time", "psi"]), + ) def test_caching_with_parameters(self): original_waveform = self.waveform_generator.time_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) new_waveform = self.waveform_generator.time_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) self.assertDictEqual(original_waveform, new_waveform) def test_caching_without_parameters(self): original_waveform = self.waveform_generator.time_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) new_waveform = self.waveform_generator.time_domain_strain() self.assertDictEqual(original_waveform, new_waveform) - def test_frequency_domain_caching_and_using_time_domain_strain_without_parameters(self): + def test_frequency_domain_caching_and_using_time_domain_strain_without_parameters( + self, + ): original_waveform = self.waveform_generator.frequency_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) new_waveform = self.waveform_generator.time_domain_strain() self.assertNotEqual(original_waveform, new_waveform) - def test_frequency_domain_caching_and_using_time_domain_strain_with_parameters(self): + def test_frequency_domain_caching_and_using_time_domain_strain_with_parameters( + self, + ): original_waveform = self.waveform_generator.frequency_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) new_waveform = self.waveform_generator.time_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) self.assertNotEqual(original_waveform, new_waveform) - def test_time_domain_caching_and_using_frequency_domain_strain_without_parameters(self): + def test_time_domain_caching_and_using_frequency_domain_strain_without_parameters( + self, + ): original_waveform = self.waveform_generator.time_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) new_waveform = self.waveform_generator.frequency_domain_strain() self.assertNotEqual(original_waveform, new_waveform) - def test_time_domain_caching_and_using_frequency_domain_strain_with_parameters(self): + def test_time_domain_caching_and_using_frequency_domain_strain_with_parameters( + self, + ): original_waveform = self.waveform_generator.time_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) new_waveform = self.waveform_generator.frequency_domain_strain( - parameters=self.simulation_parameters) + parameters=self.simulation_parameters + ) self.assertNotEqual(original_waveform, new_waveform) class TestWaveformDirectAgainstLALSIM(unittest.TestCase): - def setUp(self): self.BBH_precessing_injection_parameters = dict( mass_1=36.0, @@ -570,7 +736,9 @@ class TestWaveformDirectAgainstLALSIM(unittest.TestCase): waveform_arguments=waveform_arguments, ) - bilby_strain = waveform_generator.frequency_domain_strain(parameters=injection_parameters) + bilby_strain = waveform_generator.frequency_domain_strain( + parameters=injection_parameters + ) # LALSIM Waveform @@ -600,7 +768,9 @@ class TestWaveformDirectAgainstLALSIM(unittest.TestCase): h_cross = get_lalsim_waveform["cross"] if waveform_approximant == "TaylorF2": - upper_freq = ISCO(injection_parameters["mass_1"], injection_parameters["mass_2"]) + upper_freq = ISCO( + injection_parameters["mass_1"], injection_parameters["mass_2"] + ) else: upper_freq = waveform_generator.frequency_array[-1] @@ -679,8 +849,22 @@ def ISCO(m1, m2): def lalsim_FD_waveform( - m1, m2, s1x, s1y, s1z, s2x, s2y, s2z, theta_jn, phase, duration, dL, fmax, - lambda_1=None, lambda_2=None, **kwarg + m1, + m2, + s1x, + s1y, + s1z, + s2x, + s2y, + s2z, + theta_jn, + phase, + duration, + dL, + fmax, + lambda_1=None, + lambda_2=None, + **kwarg ): mass1 = m1 * lal.MSUN_SI mass2 = m2 * lal.MSUN_SI @@ -709,10 +893,12 @@ def lalsim_FD_waveform( if lambda_1 is not None: lalsim.SimInspiralWaveformParamsInsertTidalLambda1( - waveform_dictionary, float(lambda_1)) + waveform_dictionary, float(lambda_1) + ) if lambda_2 is not None: lalsim.SimInspiralWaveformParamsInsertTidalLambda2( - waveform_dictionary, float(lambda_2)) + waveform_dictionary, float(lambda_2) + ) hplus, hcross = lalsim.SimInspiralChooseFDWaveform( mass1, @@ -768,7 +954,7 @@ def get_lalsim_psd_list(): and not name.endswith(PSD_suffix) ): # if name in blacklist: - name = name[len(PSD_prefix):] + name = name[len(PSD_prefix) :] if ( name not in blacklist and not name.startswith("iLIGO") @@ -826,5 +1012,5 @@ def normalize_strain( return np.sqrt(integral).real -if __name__ == '__main__': +if __name__ == "__main__": unittest.main()