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.
- {basil_core-1.2.0 → basil_core-1.2.4}/.gitignore +2 -1
- basil_core-1.2.4/.gitlab-ci.yml +51 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/Makefile +25 -2
- {basil_core-1.2.0 → basil_core-1.2.4}/PKG-INFO +2 -2
- basil_core-1.2.4/__version__.py +1 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/meson.build +1 -1
- {basil_core-1.2.0 → basil_core-1.2.4}/pyproject.toml +5 -1
- basil_core-1.2.4/src/basil_core/__version__.py +1 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/coordinates/__init__.py +1 -0
- basil_core-1.2.4/src/basil_core/astro/coordinates/distance.py +446 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/coordinates/meson.build +1 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/orbit/white_dwarf.py +99 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/plots/axis.py +3 -3
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/density/histogram_overhang.py +8 -2
- basil_core-1.2.4/tests/test_cosmology_distance.py +131 -0
- basil_core-1.2.0/.gitlab-ci.yml +0 -22
- basil_core-1.2.0/__version__.py +0 -1
- basil_core-1.2.0/src/basil_core/__version__.py +0 -1
- {basil_core-1.2.0 → basil_core-1.2.4}/MANIFEST.in +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/README.md +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/REQUIREMENTS.txt +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/originals/callister_priors_arxiv_2104_09508.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/setup.py.old +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/__init__.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/array_tools/__init__.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/array_tools/_indexer.c +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/array_tools/indexer.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/array_tools/meson.build +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/__init__.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/_basil_core_astro_const.h +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/coordinates/_coordinates.c +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/coordinates/_spin.c +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/coordinates/_tides.c +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/coordinates/coordinates.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/meson.build +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/orbit/_DWD_RLOF.c +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/orbit/_GW.c +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/orbit/__init__.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/orbit/_decay.c +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/orbit/_kepler.c +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/orbit/decay.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/orbit/ecc_root_finder.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/orbit/meson.build +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/orbit/orbit.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/priors/__init__.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/priors/callister_priors.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/priors/meson.build +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/AGND/AGND.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/AGND/Lyon2024/LICENSE.txt +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/AGND/Lyon2024/Lyon2024AGNPhi.dat +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/AGND/Lyon2024/__init__.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/AGND/Lyon2024/meson.build +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/AGND/__init__.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/AGND/meson.build +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/GSMF/Fontana.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/GSMF/Furlong2015.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/GSMF/Navarro.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/GSMF/Weibel.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/GSMF/__init__.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/GSMF/meson.build +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/GSMF/utils.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/IMF/IMF.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/IMF/__init__.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/IMF/meson.build +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/MZR/MZR.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/MZR/__init__.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/MZR/meson.build +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/MZR/utils.py +0 -0
- {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
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/NSC_frac_of_GSM/__init__.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/NSC_frac_of_GSM/meson.build +0 -0
- {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
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/NSC_mass_of_GSM/__init__.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/NSC_mass_of_GSM/meson.build +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/SFRD/SFRD.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/SFRD/__init__.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/SFRD/meson.build +0 -0
- {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
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/SMBH_mass_of_GSM/__init__.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/SMBH_mass_of_GSM/meson.build +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/early_frac_of_GSM_metallicity/__init__.py +0 -0
- {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
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/early_frac_of_GSM_metallicity/meson.build +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/astro/relations/meson.build +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/c_utils/dbg.h +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/meson.build +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/plots/__init__.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/plots/corner.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/plots/meson.build +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/plots/utils.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/random/__init__.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/random/meson.build +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/random/pcg64.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/random/sphere.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/__init__.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/_distance.c +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/_relative_entropy.c +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/_schechter.c +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/density/__init__.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/density/density_utils.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/density/meson.build +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/distance.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/hypercube.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/meson.build +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/src/basil_core/stats/schechter.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_callister_priors.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_coordinates.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_corner.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_distance.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_histogram_overhang.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_hypercube.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_indexer.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_orbit.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_random.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_relations.py +0 -0
- {basil_core-1.2.0 → basil_core-1.2.4}/tests/test_schechter.py +0 -0
|
@@ -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.
|
|
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.
|
|
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
|
|
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'
|
|
@@ -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'
|
|
@@ -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
|