basil-core 1.2.0__tar.gz → 1.2.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. {basil_core-1.2.0 → basil_core-1.2.4}/.gitignore +2 -1
  2. basil_core-1.2.4/.gitlab-ci.yml +51 -0
  3. {basil_core-1.2.0 → basil_core-1.2.4}/Makefile +25 -2
  4. {basil_core-1.2.0 → basil_core-1.2.4}/PKG-INFO +2 -2
  5. basil_core-1.2.4/__version__.py +1 -0
  6. {basil_core-1.2.0 → basil_core-1.2.4}/meson.build +1 -1
  7. {basil_core-1.2.0 → basil_core-1.2.4}/pyproject.toml +5 -1
  8. basil_core-1.2.4/src/basil_core/__version__.py +1 -0
  9. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/coordinates/__init__.py +1 -0
  10. basil_core-1.2.4/src/basil_core/astro/coordinates/distance.py +446 -0
  11. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/coordinates/meson.build +1 -0
  12. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/orbit/white_dwarf.py +99 -0
  13. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/plots/axis.py +3 -3
  14. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/density/histogram_overhang.py +8 -2
  15. basil_core-1.2.4/tests/test_cosmology_distance.py +131 -0
  16. basil_core-1.2.0/.gitlab-ci.yml +0 -22
  17. basil_core-1.2.0/__version__.py +0 -1
  18. basil_core-1.2.0/src/basil_core/__version__.py +0 -1
  19. {basil_core-1.2.0 → basil_core-1.2.4}/MANIFEST.in +0 -0
  20. {basil_core-1.2.0 → basil_core-1.2.4}/README.md +0 -0
  21. {basil_core-1.2.0 → basil_core-1.2.4}/REQUIREMENTS.txt +0 -0
  22. {basil_core-1.2.0 → basil_core-1.2.4}/originals/callister_priors_arxiv_2104_09508.py +0 -0
  23. {basil_core-1.2.0 → basil_core-1.2.4}/setup.py.old +0 -0
  24. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/__init__.py +0 -0
  25. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/array_tools/__init__.py +0 -0
  26. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/array_tools/_indexer.c +0 -0
  27. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/array_tools/indexer.py +0 -0
  28. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/array_tools/meson.build +0 -0
  29. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/__init__.py +0 -0
  30. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/_basil_core_astro_const.h +0 -0
  31. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/coordinates/_coordinates.c +0 -0
  32. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/coordinates/_spin.c +0 -0
  33. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/coordinates/_tides.c +0 -0
  34. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/coordinates/coordinates.py +0 -0
  35. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/meson.build +0 -0
  36. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/orbit/_DWD_RLOF.c +0 -0
  37. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/orbit/_GW.c +0 -0
  38. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/orbit/__init__.py +0 -0
  39. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/orbit/_decay.c +0 -0
  40. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/orbit/_kepler.c +0 -0
  41. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/orbit/decay.py +0 -0
  42. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/orbit/ecc_root_finder.py +0 -0
  43. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/orbit/meson.build +0 -0
  44. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/orbit/orbit.py +0 -0
  45. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/priors/__init__.py +0 -0
  46. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/priors/callister_priors.py +0 -0
  47. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/priors/meson.build +0 -0
  48. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/AGND/AGND.py +0 -0
  49. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/AGND/Lyon2024/LICENSE.txt +0 -0
  50. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/AGND/Lyon2024/Lyon2024AGNPhi.dat +0 -0
  51. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/AGND/Lyon2024/__init__.py +0 -0
  52. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/AGND/Lyon2024/meson.build +0 -0
  53. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/AGND/__init__.py +0 -0
  54. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/AGND/meson.build +0 -0
  55. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/GSMF/Fontana.py +0 -0
  56. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/GSMF/Furlong2015.py +0 -0
  57. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/GSMF/Navarro.py +0 -0
  58. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/GSMF/Weibel.py +0 -0
  59. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/GSMF/__init__.py +0 -0
  60. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/GSMF/meson.build +0 -0
  61. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/GSMF/utils.py +0 -0
  62. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/IMF/IMF.py +0 -0
  63. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/IMF/__init__.py +0 -0
  64. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/IMF/meson.build +0 -0
  65. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/MZR/MZR.py +0 -0
  66. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/MZR/__init__.py +0 -0
  67. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/MZR/meson.build +0 -0
  68. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/MZR/utils.py +0 -0
  69. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/NSC_frac_of_GSM/NSC_frac_of_GSM.py +0 -0
  70. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/NSC_frac_of_GSM/__init__.py +0 -0
  71. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/NSC_frac_of_GSM/meson.build +0 -0
  72. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/NSC_mass_of_GSM/NSC_mass_of_GSM.py +0 -0
  73. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/NSC_mass_of_GSM/__init__.py +0 -0
  74. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/NSC_mass_of_GSM/meson.build +0 -0
  75. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/SFRD/SFRD.py +0 -0
  76. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/SFRD/__init__.py +0 -0
  77. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/SFRD/meson.build +0 -0
  78. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/SMBH_mass_of_GSM/SMBH_mass_of_GSM.py +0 -0
  79. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/SMBH_mass_of_GSM/__init__.py +0 -0
  80. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/SMBH_mass_of_GSM/meson.build +0 -0
  81. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/__init__.py +0 -0
  82. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/early_frac_of_GSM_metallicity/Peng2015/Fig2a.png +0 -0
  83. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/early_frac_of_GSM_metallicity/Peng2015/README.txt +0 -0
  84. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/early_frac_of_GSM_metallicity/Peng2015/__init__.py +0 -0
  85. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/early_frac_of_GSM_metallicity/Peng2015/meson.build +0 -0
  86. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/early_frac_of_GSM_metallicity/Peng2015/stellarMZR-SF.TXT +0 -0
  87. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/early_frac_of_GSM_metallicity/Peng2015/stellarMZR-passive.txt +0 -0
  88. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/early_frac_of_GSM_metallicity/__init__.py +0 -0
  89. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/early_frac_of_GSM_metallicity/early_frac.py +0 -0
  90. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/early_frac_of_GSM_metallicity/meson.build +0 -0
  91. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/meson.build +0 -0
  92. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/c_utils/dbg.h +0 -0
  93. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/meson.build +0 -0
  94. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/plots/__init__.py +0 -0
  95. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/plots/corner.py +0 -0
  96. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/plots/meson.build +0 -0
  97. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/plots/utils.py +0 -0
  98. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/random/__init__.py +0 -0
  99. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/random/meson.build +0 -0
  100. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/random/pcg64.py +0 -0
  101. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/random/sphere.py +0 -0
  102. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/__init__.py +0 -0
  103. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/_distance.c +0 -0
  104. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/_relative_entropy.c +0 -0
  105. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/_schechter.c +0 -0
  106. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/density/__init__.py +0 -0
  107. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/density/density_utils.py +0 -0
  108. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/density/meson.build +0 -0
  109. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/distance.py +0 -0
  110. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/hypercube.py +0 -0
  111. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/meson.build +0 -0
  112. {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/schechter.py +0 -0
  113. {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_callister_priors.py +0 -0
  114. {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_coordinates.py +0 -0
  115. {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_corner.py +0 -0
  116. {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_distance.py +0 -0
  117. {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_histogram_overhang.py +0 -0
  118. {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_hypercube.py +0 -0
  119. {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_indexer.py +0 -0
  120. {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_orbit.py +0 -0
  121. {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_random.py +0 -0
  122. {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_relations.py +0 -0
  123. {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_schechter.py +0 -0
@@ -11,4 +11,5 @@ data
11
11
  *.DS_store
12
12
  ecc_test.png
13
13
  *tmp.hdf5
14
-
14
+ local-wheels/*
15
+ *.whl
@@ -0,0 +1,51 @@
1
+ stages:
2
+ - test
3
+ - build
4
+
5
+ unit_tests:
6
+ image: debian:latest
7
+ stage: test
8
+ before_script:
9
+ - apt update
10
+ - apt --assume-yes install libsuitesparse-dev
11
+ - apt --assume-yes install pkg-config
12
+ - apt update
13
+ - apt --assume-yes install libhdf5-dev
14
+ - apt --assume-yes install python3
15
+ - apt --assume-yes install python3-pip
16
+ - apt --assume-yes install python3-venv
17
+ - apt --assume-yes install git
18
+ script:
19
+ - python3 -m venv basil-core
20
+ - source basil-core/bin/activate; python3 -m pip install tox numpy pytest pytest-cov build
21
+ - source basil-core/bin/activate; make tests
22
+ only:
23
+ - main
24
+ - merge_requests
25
+
26
+ linux:
27
+ image: python:3.12
28
+ stage: build
29
+ services:
30
+ - name: docker:dind
31
+ entrypoint: ["env", "-u", "DOCKER_HOST"]
32
+ command: ["dockerd-entrypoint.sh"]
33
+ variables:
34
+ DOCKER_HOST: tcp://docker:2375/
35
+ DOCKER_DRIVER: overlay2
36
+ # Disable TLS
37
+ DOCKER_TLS_CERTDIR: ""
38
+ script:
39
+ # Install cibuildwheel
40
+ - curl -sSL https://get.docker.com/ | sh
41
+ - python3 -m pip install -U pip
42
+ - python3 -m pip install cibuildwheel
43
+ # Run cibuildwheel to build wheels
44
+ - cibuildwheel --output-dir wheelhouse
45
+ rules:
46
+ - if: $CI_COMMIT_REF_PROTECTED == 'true'
47
+ when: on_success
48
+ - when: never
49
+ artifacts:
50
+ paths:
51
+ - wheelhouse/
@@ -4,7 +4,7 @@ all: tests
4
4
 
5
5
  ######## Setup ########
6
6
 
7
- VERSION = 1.2.0
7
+ VERSION = 1.2.4
8
8
  DIST=dist/basil_core-${VERSION}.tar.gz
9
9
  version: clean
10
10
  sed --in-place "s/version = .*/version = \"${VERSION}\"/g" pyproject.toml
@@ -12,6 +12,9 @@ version: clean
12
12
  echo "__version__ = '${VERSION}'" > __version__.py
13
13
  echo "__version__ = '${VERSION}'" > src/basil_core/__version__.py
14
14
  EXAMPLE_LOCATION = ./
15
+ HERE=$(shell pwd)
16
+ WHL=wheelhouse
17
+ LOCAL_WHEELS=${HERE}/local-wheels
15
18
 
16
19
  ######## Installation ########
17
20
  $(DIST): clean version
@@ -28,10 +31,29 @@ testpypi: tests
28
31
  pypi: testpypi
29
32
  python3 -m twine upload $(DIST)
30
33
 
34
+ local-wheels: clean
35
+ mkdir -p $(LOCAL_WHEELS)
36
+ cibuildwheel --output-dir $(LOCAL_WHEELS)
37
+ wget "https://gitlab.com/xevra/basil-core/-/jobs/artifacts/main/download?job=linux" -O $(LOCAL_WHEELS)/artifacts.zip
38
+ cd $(LOCAL_WHEELS); unzip artifacts.zip
39
+ mv $(LOCAL_WHEELS)/$(WHL)/*.whl $(LOCAL_WHEELS)
40
+ ls $(LOCAL_WHEELS)/artifacts.zip
41
+ rm $(LOCAL_WHEELS)/artifacts.zip
42
+ rm -rf $(LOCAL_WHEELS)/$(WHL)
43
+
44
+ testpypi-wheels: local-wheels
45
+ python3 -m twine upload --repository testpypi $(LOCAL_WHEELS)/*.whl
46
+ pypi-wheels: testpypi-wheels
47
+ python3 -m twine upload $(LOCAL_WHEELS)/*.whl
48
+
49
+
31
50
  ######## Tests ########
32
51
  test_coordinates: install
33
52
  python3 $(EXAMPLE_LOCATION)/tests/test_coordinates.py
34
53
 
54
+ test_cosmology_distance: install
55
+ python3 ${EXAMPLE_LOCATION}/tests/test_cosmology_distance.py
56
+
35
57
  test_distance: install
36
58
  python3 $(EXAMPLE_LOCATION)/tests/test_distance.py
37
59
 
@@ -65,7 +87,7 @@ test_relations: install
65
87
  mkdir -p ${EXAMPLE_LOCATION}/data
66
88
  python3 ${EXAMPLE_LOCATION}/tests/test_relations.py
67
89
 
68
- tests: test_coordinates test_distance test_orbit test_random test_callister test_indexer test_schechter
90
+ tests: test_coordinates test_distance test_cosmology_distance test_orbit test_random test_callister test_indexer test_schechter
69
91
  #tests: test_coordinates test_distance test_orbit test_random test_callister test_corner test_indexer test_schechter
70
92
 
71
93
  ######## Clean ########
@@ -74,3 +96,4 @@ clean:
74
96
  rm -rf $(EXAMPLE_LOCATION)/dist
75
97
  rm -rf $(EXAMPLE_LOCATION)/build
76
98
  rm -rf ${EXAMPLE_LOCATION}/data/*
99
+ rm -rf $(LOCAL_WHEELS)/*
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: basil_core
3
- Version: 1.2.0
3
+ Version: 1.2.4
4
4
  Summary: BASIL-CORE: Bayesian Analytic Sampling and Integrating Library - Compiled and low-dependency utilities
5
5
  Keywords: Gravitational Wave,Bayesian Inference
6
6
  Author-Email: "V. Delfavero" <vdfavero@cita.utoronto.ca>
@@ -17,7 +17,7 @@ Project-URL: Homepage, https://gitlab.com/xevra/basil-core
17
17
  Project-URL: Bug tracker, https://gitlab.com/xevra/basil-core/issues
18
18
  Requires-Python: >=3.12
19
19
  Requires-Dist: h5py>=2.7.0
20
- Requires-Dist: numpy>=2.0
20
+ Requires-Dist: numpy<2.4.0,>=2.0
21
21
  Requires-Dist: matplotlib>=2.2.4
22
22
  Requires-Dist: scipy>=1.5.0
23
23
  Requires-Dist: six>=1.10.0
@@ -0,0 +1 @@
1
+ __version__ = '1.2.4'
@@ -1,6 +1,6 @@
1
1
  project('basil_core',
2
2
  'c',
3
- version: '1.2.0',
3
+ version: '1.2.4',
4
4
  default_options: ['warning_level=2', 'optimization=3', 'c_std=c99'],
5
5
  meson_version: '>=0.64.0',
6
6
  )
@@ -10,6 +10,10 @@ build-backend = 'mesonpy'
10
10
  [tool.meson-python.args]
11
11
  setup = ["--warnlevel=2"]
12
12
 
13
+ [tool.cibuildwheel]
14
+ # Disable free-threading builds on all platforms
15
+ skip = "cp3??t-*"
16
+
13
17
  [project]
14
18
  name = "basil_core"
15
19
  dynamic = ["version"]
@@ -35,7 +39,7 @@ classifiers = [
35
39
  ]
36
40
  dependencies = [
37
41
  "h5py>=2.7.0",
38
- "numpy>=2.0",
42
+ "numpy>=2.0,<2.4.0",
39
43
  "matplotlib>=2.2.4",
40
44
  "scipy>=1.5.0",
41
45
  "six>=1.10.0",
@@ -0,0 +1 @@
1
+ __version__ = '1.2.4'
@@ -1 +1,2 @@
1
1
  from .coordinates import *
2
+ from .distance import *
@@ -0,0 +1,446 @@
1
+ """Objects for estimating and interpolating from the lookback time and
2
+ comoving distance for a given cosmology model.
3
+
4
+ Provide GPU parallelized calculations for common cosmological quantities
5
+
6
+ """
7
+ ######## Imports ########
8
+ #### Standard Library ####
9
+ import time
10
+ from functools import cache
11
+ #### Third Party ####
12
+ from astropy import units as u
13
+ from astropy import constants as const
14
+ from astropy.cosmology import z_at_value
15
+ from astropy.cosmology import units as cu
16
+ from scipy.interpolate import CubicSpline
17
+
18
+ ######## Setup ########
19
+ ANDROMEDA_DISTANCE_LY = 2.537 * u.Myr
20
+ MINIMUM_LOOKBACK = ANDROMEDA_DISTANCE_LY
21
+ MINIMUM_REDSHIFT = 1e-4
22
+ MAXIMUM_REDSHIFT = 20.
23
+
24
+ ######## Objects ########
25
+
26
+ class DistanceInterpolator(object):
27
+ """An interpolator for comoving and light travel distance
28
+
29
+ """
30
+ def __init__(
31
+ self,
32
+ cosmo,
33
+ numpy=None,
34
+ zmin=MINIMUM_REDSHIFT,
35
+ zmax=MAXIMUM_REDSHIFT,
36
+ ngrid=int(2e4),
37
+ ):
38
+ """Construct a distance interpolator object
39
+
40
+ Parameters
41
+ ----------
42
+ cosmo : astropy.cosmology module
43
+ The module (i.e. Planck15) which defines cosmological methods
44
+ numpy : numpy module
45
+ The Numpy module you would like to use
46
+ """
47
+ self.cosmo = cosmo
48
+ if numpy is None:
49
+ import numpy as np
50
+ self.np = np
51
+ else:
52
+ self.np = numpy
53
+ self._ngrid = ngrid
54
+ self._lookback_interp = None
55
+ self._comoving_interp = None
56
+ self._luminosity_interp = None
57
+ self._inv_lookback_interp = None
58
+ self._inv_comoving_interp = None
59
+ self._inv_luminosity_interp = None
60
+ self.zmin = zmin
61
+ self.zmax = zmax
62
+
63
+ @property
64
+ def hubble_time(self):
65
+ return self.cosmo.hubble_time.to("Gyr")
66
+
67
+ @property
68
+ def age(self):
69
+ return self.cosmo.age(0)
70
+
71
+ @property
72
+ def H0(self):
73
+ return self.cosmo.H(0)
74
+
75
+ @property
76
+ def dH(self):
77
+ return (const.c / self.H0).si
78
+
79
+ @property
80
+ @cache
81
+ def redshift_grid(self):
82
+ # Get age of universe at zmin and zmax
83
+ age_limits = self.cosmo.age(self.np.asarray([self.zmin,self.zmax]))
84
+ # Get lookback limits
85
+ lookback_limits = self.age - age_limits
86
+ # Get lookback_grid
87
+ self._lookback_grid = self.np.linspace(lookback_limits[0], lookback_limits[1], self.ngrid).to("Myr")
88
+ # Get redshift_grid
89
+ return z_at_value(self.cosmo.lookback_time, self.lookback_grid)
90
+
91
+ @property
92
+ def lookback_grid(self):
93
+ return self._lookback_grid
94
+
95
+ @property
96
+ @cache
97
+ def comoving_grid(self):
98
+ return self.cosmo.comoving_distance(self.redshift_grid).to("kpc")
99
+
100
+ @property
101
+ @cache
102
+ def luminosity_grid(self):
103
+ return self.cosmo.luminosity_distance(self.redshift_grid).to("kpc")
104
+
105
+ @property
106
+ def ngrid(self):
107
+ return self._ngrid
108
+
109
+ def train(self):
110
+ """Train the cosmology distance interpolator model"""
111
+ self._lookback_interp = CubicSpline(self.redshift_grid.value, self.lookback_grid.value)
112
+ self._comoving_interp = CubicSpline(self.redshift_grid.value, self.comoving_grid.value)
113
+ self._luminosity_interp = CubicSpline(self.redshift_grid.value, self.luminosity_grid.value)
114
+ self._inv_lookback_interp = CubicSpline(self.lookback_grid.value, self.redshift_grid.value)
115
+ self._inv_comoving_interp = CubicSpline(self.comoving_grid.value, self.redshift_grid.value)
116
+ self._inv_luminosity_interp = CubicSpline(self.luminosity_grid.value, self.redshift_grid.value)
117
+
118
+ def comoving_distance(self,z):
119
+ """Return the comoving distance interpolated on some points
120
+
121
+ Parameters
122
+ ----------
123
+ z : array_like
124
+ redshift values
125
+
126
+ Returns
127
+ -------
128
+ distance : array_like
129
+ comoving_distance
130
+ """
131
+ # Train interpolators
132
+ if self._comoving_interp is None:
133
+ self.train()
134
+ # Initialize output
135
+ out = self.np.zeros(self.np.size(z),dtype=float) * self.comoving_grid.unit
136
+ # Check limits
137
+ in_range = (z >= self.zmin) & (z <= self.zmax)
138
+ # Interpolate
139
+ out[in_range] = self._comoving_interp(z[in_range]) * self.comoving_grid.unit
140
+ # Lower bound can zero out
141
+ out[z < self.zmin] = self.comoving_grid[0]
142
+ # Upper bound can max out
143
+ out[z > self.zmax] = self.comoving_grid[-1]
144
+ return out
145
+
146
+ def inv_comoving_distance(self,dc):
147
+ """Return the redshift for a given comoving distance
148
+
149
+ Parameters
150
+ ----------
151
+ dc : array_like
152
+ comoving distance
153
+
154
+ Returns
155
+ -------
156
+ z : array_like
157
+ Redshift
158
+ """
159
+ # Train interpolators
160
+ if self._inv_comoving_interp is None:
161
+ self.train()
162
+ # Initialize output
163
+ out = self.np.zeros(self.np.size(dc),dtype=float) * cu.redshift
164
+ # Check limits
165
+ in_range = (dc >= self.comoving_grid[0]) & (dc <= self.comoving_grid[-1])
166
+ # Interpolate
167
+ out[in_range] = self._inv_comoving_interp(dc[in_range].to(self.comoving_grid.unit))
168
+ # Handle lower bound
169
+ out[dc < self.comoving_grid[0]] = self.redshift_grid[0]
170
+ # Handle upper bound
171
+ out[dc >= self.comoving_grid[-1]] = self.redshift_grid[-1]
172
+ return out
173
+
174
+ def luminosity_distance(self,z):
175
+ """Return the luminosity distance interpolated on some points
176
+
177
+ Parameters
178
+ ----------
179
+ z : array_like
180
+ redshift values
181
+
182
+ Returns
183
+ -------
184
+ distance : array_like
185
+ luminosity_distance
186
+ """
187
+ # Train interpolators
188
+ if self._luminosity_interp is None:
189
+ self.train()
190
+ # Initialize output
191
+ out = self.np.zeros(self.np.size(z),dtype=float) * self.luminosity_grid.unit
192
+ # Check limits
193
+ in_range = (z >= self.zmin) & (z <= self.zmax)
194
+ # Interpolate
195
+ out[in_range] = self._luminosity_interp(z[in_range]) * self.luminosity_grid.unit
196
+ # Lower bound can zero out
197
+ out[z < self.zmin] = self.luminosity_grid[0]
198
+ # Upper bound can max out
199
+ out[z > self.zmax] = self.luminosity_grid[-1]
200
+ return out
201
+
202
+ def inv_luminosity_distance(self,dc):
203
+ """Return the redshift for a given luminosity distance
204
+
205
+ Parameters
206
+ ----------
207
+ dc : array_like
208
+ luminosity distance
209
+
210
+ Returns
211
+ -------
212
+ z : array_like
213
+ Redshift
214
+ """
215
+ # Train interpolators
216
+ if self._inv_luminosity_interp is None:
217
+ self.train()
218
+ # Initialize output
219
+ out = self.np.zeros(self.np.size(dc),dtype=float) * cu.redshift
220
+ # Check limits
221
+ in_range = (dc >= self.luminosity_grid[0]) & (dc <= self.luminosity_grid[-1])
222
+ # Interpolate
223
+ out[in_range] = self._inv_luminosity_interp(dc[in_range].to(self.luminosity_grid.unit))
224
+ # Handle lower bound
225
+ out[dc < self.luminosity_grid[0]] = self.redshift_grid[0]
226
+ # Handle upper bound
227
+ out[dc >= self.luminosity_grid[-1]] = self.redshift_grid[-1]
228
+ return out
229
+
230
+ def lookback_time(self,z):
231
+ """Return the lookback time interpolated on some points
232
+
233
+ Parameters
234
+ ----------
235
+ z : array_like
236
+ redshift values
237
+
238
+ Returns
239
+ -------
240
+ lookback_time : array_like
241
+ light travel time to given redshift
242
+ """
243
+ # Train interpolators
244
+ if self._lookback_interp is None:
245
+ self.train()
246
+ # Initialize output
247
+ out = self.np.zeros(self.np.size(z),dtype=float) * self.lookback_grid.unit
248
+ # Check limits
249
+ in_range = (z >= self.zmin) & (z <= self.zmax)
250
+ # Interpolate
251
+ out[in_range] = self._lookback_interp(z[in_range]) * self.lookback_grid.unit
252
+ # Lower bound can zero out
253
+ out[z < self.zmin] = self.lookback_grid[0]
254
+ # Upper bound can max out
255
+ out[z > self.zmax] = self.lookback_grid[-1]
256
+ return out
257
+
258
+ def inv_lookback_time(self,dc):
259
+ """Return the redshift for a given lookback_time
260
+
261
+ Parameters
262
+ ----------
263
+ tl : array_like
264
+ lookback_time
265
+
266
+ Returns
267
+ -------
268
+ z : array_like
269
+ Redshift
270
+ """
271
+ # Train interpolators
272
+ if self._inv_lookback_interp is None:
273
+ self.train()
274
+ # Initialize output
275
+ out = self.np.zeros(self.np.size(dc),dtype=float) * cu.redshift
276
+ # Check limits
277
+ in_range = (dc >= self.lookback_grid[0]) & (dc <= self.lookback_grid[-1])
278
+ # Interpolate
279
+ out[in_range] = self._inv_lookback_interp(dc[in_range].to(self.lookback_grid.unit))
280
+ # Handle lower bound
281
+ out[dc < self.lookback_grid[0]] = self.redshift_grid[0]
282
+ # Handle upper bound
283
+ out[dc >= self.lookback_grid[-1]] = self.redshift_grid[-1]
284
+ return out
285
+
286
+ #### Jax version ####
287
+ class JaxPlanck15Interpolator(DistanceInterpolator):
288
+ """Use jaxcosmo and Planck15, and train manually"""
289
+ def __init__(**kwargs):
290
+ """Construct Jax Planck15 Interpolator"""
291
+ # Imports and setup
292
+ import jax
293
+ import jax.numpy as np
294
+ from astropy.cosmology import Planck15 as acosmo
295
+ import jax_cosmo as jc
296
+ jcosmo = jc.Planck15()
297
+ # Construct super
298
+ super().__init__(acosmo,numpy=np,**kwargs)
299
+ # Define jcosmo
300
+ self.jcosmo = jcosmo
301
+ self.jc = jc
302
+ raise NotImplementedError("Not tested in its current form.")
303
+
304
+ @property
305
+ @cache
306
+ def redshift_grid(self):
307
+ return 10**self.np.linspace(self.np.log10(self.zmin),self.np.log10(self.zmax),self.ngrid)
308
+
309
+ def lookback_time_integrand(self,z):
310
+ """The integrand for the lookback time equation
311
+
312
+ Parameters
313
+ ----------
314
+ z : array_like
315
+ Redshift array
316
+
317
+ Returns
318
+ -------
319
+ Q : jax array
320
+ Array of the lookback time integrand quantity
321
+ """
322
+ return 1./(self.np.sqrt(self.jc.background.Esqr(self.jcosmo,1./(z+1.)))*(1+z))
323
+
324
+ def comoving_distance_integrand(self,z):
325
+ """The integrand for the comoving distance equation
326
+
327
+ Parameters
328
+ ----------
329
+ z : array_like
330
+ Redshift array
331
+
332
+ Returns
333
+ -------
334
+ Q : jax array
335
+ Array of comoving distance integrand quantity
336
+ """
337
+ return 1./self.np.sqrt(self.jc.background.Esqr(self.jcosmo,1./(z+1.)))
338
+
339
+ def lookback_time_trapezoid(self,z):
340
+ """The lookback time, according to trapezoid rule
341
+
342
+ Parameters
343
+ ----------
344
+ z : array_like
345
+ Redshift array
346
+
347
+ Returns
348
+ -------
349
+ zcenters : array
350
+ redshift bin centers
351
+ dz : array
352
+ redshift bin widths
353
+ cum : array
354
+ cumulative lookback time
355
+ """
356
+ f_of_z = self.lookback_time_integrand(z)
357
+ dz = z[1:] - z[:-1]
358
+ zcenters = 0.5*(z[:-1] + z[1:])
359
+ trp = dz * (f_of_z[1:] + f_of_z[:-1]) * 0.5
360
+ cum = self.np.cumsum(trp)
361
+ return zcenters, dz, cum
362
+
363
+ def comoving_distance_trapezoid(self,z):
364
+ """The comoving distance, according to trapezoid rule
365
+
366
+ Parameters
367
+ ----------
368
+ z : array_like
369
+ Redshift array
370
+
371
+ Returns
372
+ -------
373
+ zcenters : array
374
+ redshift bin centers
375
+ dz : array
376
+ redshift bin widths
377
+ cum : array
378
+ cumulative integral of distance
379
+ """
380
+ f_of_z = self.comoving_distance_integrand(z)
381
+ dz = z[1:] - z[:-1]
382
+ zcenters = 0.5*(z[:-1] + z[1:])
383
+ trp = dz * (f_of_z[1:] + f_of_z[:-1]) * 0.5
384
+ cum = self.np.cumsum(trp)
385
+ return zcenters, dz, cum
386
+
387
+ @property
388
+ @cache
389
+ def lookback_grid(self):
390
+ # Identify lookback time integral
391
+ zcenters, dz, trp = self.lookback_time_trapezoid(self.redshift_grid)
392
+ # Return values
393
+ return self.age * trp
394
+
395
+ @property
396
+ @cache
397
+ def comoving_grid(self):
398
+ # Identify comoving distance trapezoid values
399
+ zcenters, dz, trp = comoving_distance_trapezoid(self.redshift_grid)
400
+ # return values
401
+ return self.dH * trp
402
+
403
+ def train(self):
404
+ """Train the cosmology distance interpolator model"""
405
+ def f_lookback(z):
406
+ return self.np.interp(z,self.redshift_grid,self.lookback_grid)
407
+ self._lookback_interp = f_lookback
408
+ def f_comoving(z):
409
+ return self.np.interp(z,self.redshift_grid,self.comoving_grid)
410
+ self._comoving_interp = f_comoving
411
+
412
+ def comoving_distance(self,z):
413
+ """Return the comoving distance interpolated on some points
414
+
415
+ Parameters
416
+ ----------
417
+ z : array_like
418
+ redshift values
419
+
420
+ Returns
421
+ -------
422
+ distance : array_like
423
+ comoving_distance
424
+ """
425
+ # Train interpolators
426
+ if self._comoving_interp is None:
427
+ self.train()
428
+ return self._comoving_interp(z) * self.comoving_grid.unit
429
+
430
+ def lookback_time(self,z):
431
+ """Return the lookback time interpolated on some points
432
+
433
+ Parameters
434
+ ----------
435
+ z : array_like
436
+ redshift values
437
+
438
+ Returns
439
+ -------
440
+ lookback_time : array_like
441
+ light travel time to given redshift
442
+ """
443
+ # Train interpolators
444
+ if self._lookback_interp is None:
445
+ self.train()
446
+ return self._lookback_interp(z) * self.lookback_grid.unit
@@ -2,6 +2,7 @@
2
2
  py.install_sources([
3
3
  '__init__.py',
4
4
  'coordinates.py',
5
+ 'distance.py',
5
6
  ], subdir: 'basil_core/astro/coordinates')
6
7
 
7
8
  py.extension_module('_coordinates',