sxs 2025.0.19__tar.gz → 2025.0.21__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 (137) hide show
  1. {sxs-2025.0.19 → sxs-2025.0.21}/.github/workflows/build.yml +8 -17
  2. {sxs-2025.0.19 → sxs-2025.0.21}/CITATION.cff +2 -2
  3. {sxs-2025.0.19 → sxs-2025.0.21}/PKG-INFO +5 -26
  4. {sxs-2025.0.19 → sxs-2025.0.21}/pyproject.toml +8 -7
  5. sxs-2025.0.21/sxs/__version__.py +1 -0
  6. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/horizons/__init__.py +35 -0
  7. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/juliapkg.json +2 -2
  8. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/simulations/simulation.py +2 -2
  9. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/time_series.py +13 -1
  10. {sxs-2025.0.19 → sxs-2025.0.21}/tests/test_waveforms.py +18 -11
  11. sxs-2025.0.19/sxs/__version__.py +0 -1
  12. {sxs-2025.0.19 → sxs-2025.0.21}/.codecov.yml +0 -0
  13. {sxs-2025.0.19 → sxs-2025.0.21}/.github/ISSUE_TEMPLATE/catalog-data-issue-template.md +0 -0
  14. {sxs-2025.0.19 → sxs-2025.0.21}/.github/dependabot.yml +0 -0
  15. {sxs-2025.0.19 → sxs-2025.0.21}/.github/scripts/parse_bump_rule.py +0 -0
  16. {sxs-2025.0.19 → sxs-2025.0.21}/.github/workflows/pr_rtd_link.yml +0 -0
  17. {sxs-2025.0.19 → sxs-2025.0.21}/.gitignore +0 -0
  18. {sxs-2025.0.19 → sxs-2025.0.21}/.readthedocs.yaml +0 -0
  19. {sxs-2025.0.19 → sxs-2025.0.21}/LICENSE +0 -0
  20. {sxs-2025.0.19 → sxs-2025.0.21}/README.md +0 -0
  21. {sxs-2025.0.19 → sxs-2025.0.21}/docs/api/catalog.md +0 -0
  22. {sxs-2025.0.19 → sxs-2025.0.21}/docs/api/cite.md +0 -0
  23. {sxs-2025.0.19 → sxs-2025.0.21}/docs/api/horizons.md +0 -0
  24. {sxs-2025.0.19 → sxs-2025.0.21}/docs/api/load.md +0 -0
  25. {sxs-2025.0.19 → sxs-2025.0.21}/docs/api/metadata.md +0 -0
  26. {sxs-2025.0.19 → sxs-2025.0.21}/docs/api/simulation.md +0 -0
  27. {sxs-2025.0.19 → sxs-2025.0.21}/docs/api/simulations.md +0 -0
  28. {sxs-2025.0.19 → sxs-2025.0.21}/docs/api/time_series.md +0 -0
  29. {sxs-2025.0.19 → sxs-2025.0.21}/docs/api/waveforms.md +0 -0
  30. {sxs-2025.0.19 → sxs-2025.0.21}/docs/html/main.html +0 -0
  31. {sxs-2025.0.19 → sxs-2025.0.21}/docs/images/favicon.ico +0 -0
  32. {sxs-2025.0.19 → sxs-2025.0.21}/docs/index.md +0 -0
  33. {sxs-2025.0.19 → sxs-2025.0.21}/docs/javascript/mathjax.js +0 -0
  34. {sxs-2025.0.19 → sxs-2025.0.21}/docs/julia.md +0 -0
  35. {sxs-2025.0.19 → sxs-2025.0.21}/docs/mathematica.md +0 -0
  36. {sxs-2025.0.19 → sxs-2025.0.21}/docs/stylesheets/extra.css +0 -0
  37. {sxs-2025.0.19 → sxs-2025.0.21}/docs/tutorials/00-Introduction.ipynb +0 -0
  38. {sxs-2025.0.19 → sxs-2025.0.21}/docs/tutorials/01-Catalog_Dataframe.ipynb +0 -0
  39. {sxs-2025.0.19 → sxs-2025.0.21}/docs/tutorials/02-Simulation.ipynb +0 -0
  40. {sxs-2025.0.19 → sxs-2025.0.21}/docs/tutorials/03-Horizons.ipynb +0 -0
  41. {sxs-2025.0.19 → sxs-2025.0.21}/docs/tutorials/04-Waveforms.ipynb +0 -0
  42. {sxs-2025.0.19 → sxs-2025.0.21}/docs/tutorials/05-PreprocessingForFFTs.ipynb +0 -0
  43. {sxs-2025.0.19 → sxs-2025.0.21}/mkdocs.yml +0 -0
  44. {sxs-2025.0.19 → sxs-2025.0.21}/mkdocs_preprocess.py +0 -0
  45. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/__init__.py +0 -0
  46. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/catalog/__init__.py +0 -0
  47. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/catalog/catalog.py +0 -0
  48. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/catalog/create.py +0 -0
  49. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/catalog/description.py +0 -0
  50. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/citation.py +0 -0
  51. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/handlers.py +0 -0
  52. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/horizons/spec_horizons_h5.py +0 -0
  53. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/horizons/xor_multishuffle_bzip2.py +0 -0
  54. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/julia/GWFrames.py +0 -0
  55. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/julia/__init__.py +0 -0
  56. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/metadata/__init__.py +0 -0
  57. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/metadata/metadata.py +0 -0
  58. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/metadata/metric.py +0 -0
  59. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/simulations/__init__.py +0 -0
  60. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/simulations/analyze.py +0 -0
  61. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/simulations/local.py +0 -0
  62. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/simulations/simulations.py +0 -0
  63. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/__init__.py +0 -0
  64. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/bitwise.py +0 -0
  65. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/decimation/__init__.py +0 -0
  66. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/decimation/greedy_spline.py +0 -0
  67. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/decimation/linear_bisection.py +0 -0
  68. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/decimation/peak_greed.py +0 -0
  69. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/decimation/suppression.py +0 -0
  70. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/dicts.py +0 -0
  71. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/downloads.py +0 -0
  72. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/files.py +0 -0
  73. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/formats.py +0 -0
  74. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/inspire.py +0 -0
  75. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/lvcnr/__init__.py +0 -0
  76. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/lvcnr/comparisons.py +0 -0
  77. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/lvcnr/conversion.py +0 -0
  78. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/lvcnr/dataset.py +0 -0
  79. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/lvcnr/horizons.py +0 -0
  80. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/lvcnr/metadata.py +0 -0
  81. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/lvcnr/waveform_amp_phase.py +0 -0
  82. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/lvcnr/waveforms.py +0 -0
  83. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/monotonicity.py +0 -0
  84. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/pretty_print.py +0 -0
  85. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/references/__init__.py +0 -0
  86. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/references/ads.py +0 -0
  87. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/references/arxiv.py +0 -0
  88. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/references/fairchild_report.py +0 -0
  89. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/references/inspire.py +0 -0
  90. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/references/journal_abbreviations.py +0 -0
  91. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/references/references.py +0 -0
  92. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/select.py +0 -0
  93. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/smooth_functions.py +0 -0
  94. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/string_converters.py +0 -0
  95. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/sxs_directories.py +0 -0
  96. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/sxs_identifiers.py +0 -0
  97. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/utilities/url.py +0 -0
  98. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/waveforms/__init__.py +0 -0
  99. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/waveforms/alignment.py +0 -0
  100. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/waveforms/format_handlers/__init__.py +0 -0
  101. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/waveforms/format_handlers/grathena.py +0 -0
  102. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/waveforms/format_handlers/lvc.py +0 -0
  103. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/waveforms/format_handlers/nrar.py +0 -0
  104. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/waveforms/format_handlers/rotating_paired_diff_multishuffle_bzip2.py +0 -0
  105. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/waveforms/format_handlers/rotating_paired_xor_multishuffle_bzip2.py +0 -0
  106. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/waveforms/format_handlers/spectre_cce_v1.py +0 -0
  107. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/waveforms/memory.py +0 -0
  108. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/waveforms/mode_utilities.py +0 -0
  109. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/waveforms/norms.py +0 -0
  110. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/waveforms/transformations.py +0 -0
  111. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/waveforms/waveform_grid.py +0 -0
  112. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/waveforms/waveform_mixin.py +0 -0
  113. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/waveforms/waveform_modes.py +0 -0
  114. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/waveforms/waveform_mts.py +0 -0
  115. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/waveforms/waveform_signal.py +0 -0
  116. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/zenodo/__init__.py +0 -0
  117. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/zenodo/api/__init__.py +0 -0
  118. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/zenodo/api/deposit.py +0 -0
  119. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/zenodo/api/login.py +0 -0
  120. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/zenodo/api/records.py +0 -0
  121. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/zenodo/catalog.py +0 -0
  122. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/zenodo/creators.py +0 -0
  123. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/zenodo/simannex.py +0 -0
  124. {sxs-2025.0.19 → sxs-2025.0.21}/sxs/zenodo/surrogatemodeling.py +0 -0
  125. {sxs-2025.0.19 → sxs-2025.0.21}/tests/__init__.py +0 -0
  126. {sxs-2025.0.19 → sxs-2025.0.21}/tests/conftest.py +0 -0
  127. {sxs-2025.0.19 → sxs-2025.0.21}/tests/test_alignment.py +0 -0
  128. {sxs-2025.0.19 → sxs-2025.0.21}/tests/test_catalog.py +0 -0
  129. {sxs-2025.0.19 → sxs-2025.0.21}/tests/test_horizons.py +0 -0
  130. {sxs-2025.0.19 → sxs-2025.0.21}/tests/test_julia.py +0 -0
  131. {sxs-2025.0.19 → sxs-2025.0.21}/tests/test_loader.py +0 -0
  132. {sxs-2025.0.19 → sxs-2025.0.21}/tests/test_metadata.py +0 -0
  133. {sxs-2025.0.19 → sxs-2025.0.21}/tests/test_simulation.py +0 -0
  134. {sxs-2025.0.19 → sxs-2025.0.21}/tests/test_time_series.py +0 -0
  135. {sxs-2025.0.19 → sxs-2025.0.21}/tests/test_transformations.py +0 -0
  136. {sxs-2025.0.19 → sxs-2025.0.21}/tests/test_utilities.py +0 -0
  137. {sxs-2025.0.19 → sxs-2025.0.21}/tests/test_waveform_rotations.py +0 -0
@@ -31,14 +31,6 @@ jobs:
31
31
  matrix:
32
32
  os: [ubuntu-latest, macos-latest, windows-latest]
33
33
  python-version: ['3.10', '3.13']
34
- exclude:
35
- - os: windows-latest
36
- python-version: '3.13'
37
- - os: macos-latest
38
- python-version: '3.13'
39
- include:
40
- - os: macos-latest
41
- python-version: '3.12'
42
34
 
43
35
  steps:
44
36
  - name: Skip replicates unless on main branch or using ubuntu-latest
@@ -52,7 +44,7 @@ jobs:
52
44
  if: ${{ env.skipping_build_and_test_replicate != 'true' }}
53
45
  uses: actions/cache@v4
54
46
  with:
55
- key: sxs-${{ runner.os }}-3 # Increment this number whenever the cached files should change
47
+ key: sxs-${{ runner.os }}-4 # Increment this number whenever the cached files should change
56
48
  path: |
57
49
  ${{ runner.os == 'Linux' && '/home/runner/.cache/sxs' || runner.os == 'Windows' && 'C:\Users\runneradmin\.sxs\cache' || '/Users/runner/.sxs/cache' }}
58
50
 
@@ -68,17 +60,14 @@ jobs:
68
60
 
69
61
  - name: Check out code
70
62
  if: ${{ env.skipping_build_and_test_replicate != 'true' }}
71
- uses: actions/checkout@v5
63
+ uses: actions/checkout@v6
72
64
 
73
- - name: Set up Python ${{ matrix.python-version }}
65
+ - name: Set up Python ${{ matrix.python-version }} with uv
74
66
  if: ${{ env.skipping_build_and_test_replicate != 'true' }}
75
- uses: actions/setup-python@v6
67
+ uses: astral-sh/setup-uv@v7
76
68
  with:
77
69
  python-version: ${{ matrix.python-version }}
78
-
79
- - name: Install Hatch
80
- if: ${{ env.skipping_build_and_test_replicate != 'true' }}
81
- run: python -m pip install --disable-pip-version-check --upgrade hatch
70
+ enable-cache: true
82
71
 
83
72
  - name: Run tests
84
73
  if: ${{ env.skipping_build_and_test_replicate != 'true' }}
@@ -86,7 +75,9 @@ jobs:
86
75
  env:
87
76
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
88
77
  run: |
89
- hatch run test --durations=0
78
+ uv run --with hatch hatch run python -c 'import ssl; print("openssl: ", ssl.OPENSSL_VERSION_INFO)'
79
+ # Run the tests, but skip Julia installation on windows because these runners come with openssl 1!!!
80
+ uv run --with hatch hatch run test --durations=0 ${{ runner.os == 'Windows' && '--ignore=tests/test_julia.py' || '' }}
90
81
 
91
82
  - name: Upload coverage
92
83
  if: "matrix.python-version == '3.13' && matrix.os == 'ubuntu-latest'"
@@ -16,5 +16,5 @@ authors:
16
16
  title: "The sxs package"
17
17
  license: MIT
18
18
  doi: 10.5281/zenodo.4034006
19
- version: 2025.0.19
20
- date-released: 2025-09-08
19
+ version: 2025.0.21
20
+ date-released: 2025-11-30
@@ -1,35 +1,14 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sxs
3
- Version: 2025.0.19
3
+ Version: 2025.0.21
4
4
  Summary: Interface to data produced by the Simulating eXtreme Spacetimes collaboration
5
5
  Project-URL: Homepage, https://github.com/sxs-collaboration/sxs
6
6
  Project-URL: Documentation, https://sxs.readthedocs.io/
7
7
  Author-email: Michael Boyle <michael.oliver.boyle@gmail.com>
8
- License: The MIT License (MIT)
9
-
10
- Copyright (c) 2020 Michael Boyle
11
-
12
- Permission is hereby granted, free of charge, to any person obtaining a copy
13
- of this software and associated documentation files (the "Software"), to deal
14
- in the Software without restriction, including without limitation the rights
15
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16
- copies of the Software, and to permit persons to whom the Software is
17
- furnished to do so, subject to the following conditions:
18
-
19
- The above copyright notice and this permission notice shall be included in all
20
- copies or substantial portions of the Software.
21
-
22
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28
- SOFTWARE.
8
+ License-Expression: MIT
29
9
  License-File: LICENSE
30
10
  Classifier: Development Status :: 5 - Production/Stable
31
11
  Classifier: Intended Audience :: Science/Research
32
- Classifier: License :: OSI Approved :: MIT License
33
12
  Classifier: Operating System :: OS Independent
34
13
  Classifier: Programming Language :: Python :: 3
35
14
  Classifier: Topic :: Scientific/Engineering :: Astronomy
@@ -38,9 +17,9 @@ Requires-Python: >=3.10
38
17
  Requires-Dist: bibtexparser>=2.0.0b8
39
18
  Requires-Dist: h5py>=3
40
19
  Requires-Dist: inflection>=0.5.1
41
- Requires-Dist: juliacall>=0.9.20
20
+ Requires-Dist: juliacall>=0.9.30
42
21
  Requires-Dist: numba>=0.55; implementation_name == 'cpython'
43
- Requires-Dist: numpy>=1.25
22
+ Requires-Dist: numpy<3.0,>=2.0
44
23
  Requires-Dist: packaging
45
24
  Requires-Dist: pandas>=1.1.2
46
25
  Requires-Dist: pytz>=2020.1
@@ -64,7 +43,7 @@ Requires-Dist: line-profiler>=3.0.2; extra == 'ecosystem'
64
43
  Requires-Dist: matplotlib>=2.1.1; extra == 'ecosystem'
65
44
  Requires-Dist: memory-profiler>=0.57.0; extra == 'ecosystem'
66
45
  Requires-Dist: numpy-quaternion>=2023.0.4; extra == 'ecosystem'
67
- Requires-Dist: numpy<2.0,>=1.20; extra == 'ecosystem'
46
+ Requires-Dist: numpy<3.0,>=2.0; extra == 'ecosystem'
68
47
  Requires-Dist: qgridnext>=2.0; extra == 'ecosystem'
69
48
  Requires-Dist: rise>=5.6.1; extra == 'ecosystem'
70
49
  Requires-Dist: scri>=2020.8.18; (sys_platform != 'win32') and extra == 'ecosystem'
@@ -4,12 +4,12 @@ dynamic = ["version"]
4
4
  description = "Interface to data produced by the Simulating eXtreme Spacetimes collaboration"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
7
- license = {file = "LICENSE"}
7
+ license = "MIT"
8
+ license-files = ["LICENSE"]
8
9
  authors = [
9
10
  { name = "Michael Boyle", email = "michael.oliver.boyle@gmail.com" }
10
11
  ]
11
12
  classifiers = [
12
- "License :: OSI Approved :: MIT License",
13
13
  "Development Status :: 5 - Production/Stable",
14
14
  "Programming Language :: Python :: 3",
15
15
  "Operating System :: OS Independent",
@@ -19,7 +19,7 @@ classifiers = [
19
19
  ]
20
20
  dependencies = [
21
21
  "sxscatalog >=3.0.14",
22
- "numpy >=1.25",
22
+ "numpy >=2.0, <3.0",
23
23
  "scipy >=1.13",
24
24
  "numba >=0.55; implementation_name == 'cpython'",
25
25
  "quaternionic >=1.0.15",
@@ -32,7 +32,7 @@ dependencies = [
32
32
  "urllib3 >=1.25.10",
33
33
  "pandas >=1.1.2",
34
34
  "bibtexparser >=2.0.0b8",
35
- "juliacall >=0.9.20",
35
+ "juliacall >=0.9.30",
36
36
  "packaging",
37
37
  ]
38
38
 
@@ -50,7 +50,7 @@ ecosystem = [
50
50
  "line_profiler >=3.0.2",
51
51
  "memory_profiler >=0.57.0",
52
52
  "matplotlib >=2.1.1",
53
- "numpy >=1.20, <2.0",
53
+ "numpy >=2.0, <3.0",
54
54
  "sympy >=1.6.2",
55
55
  "seaborn >=0.13",
56
56
  "qgridnext >=2.0",
@@ -77,13 +77,14 @@ build-backend = "hatchling.build"
77
77
  path = "sxs/__version__.py"
78
78
 
79
79
  [tool.hatch.envs.default]
80
+ installer = "uv"
80
81
  dependencies = [
81
82
  "ipython",
82
83
  "pytest",
83
84
  "pytest-cov",
84
85
  "pytest-forked >=1.3.0",
85
86
  "juliapkg >=0.1.13",
86
- "numpy >=1.20, <2.0"
87
+ "numpy >=2.0, <3.0"
87
88
  ]
88
89
  [tool.hatch.envs.default.scripts]
89
90
  # Run these as `hatch run test`
@@ -114,7 +115,7 @@ dependencies = [
114
115
 
115
116
  [tool.black]
116
117
  line-length = 120
117
- target-version = ["py38"]
118
+ target-version = ["py310"]
118
119
 
119
120
 
120
121
  [tool.pytest.ini_options]
@@ -0,0 +1 @@
1
+ __version__ = "2025.0.21"
@@ -530,3 +530,38 @@ class Horizons(object):
530
530
  ω = Ω
531
531
  Omega = Ω
532
532
  omega = Ω
533
+
534
+ @property
535
+ def χₚ(self):
536
+ """Effective spin precession parameter χₚ as function of time
537
+
538
+ Returns
539
+ -------
540
+ χₚ : TimeSeries
541
+ This represents the effective spin precession parameter as
542
+ a function of time.
543
+
544
+ Notes
545
+ -----
546
+ There are multiple definitions of the effective spin
547
+ precession parameter in the literature. This implementation
548
+ follows the definition given in Eq. (16) of the LVK's most
549
+ recent paper as of this writing,
550
+ [*GWTC-4.0*](https://arxiv.org/pdf/2508.18080). See [this
551
+ paper](https://arxiv.org/abs/2011.11948) for discussion of the
552
+ differences between various definitions.
553
+
554
+ """
555
+ m1 = self.A.christodoulou_mass
556
+ m2 = self.B.christodoulou_mass
557
+ S1 = m1[:, np.newaxis] ** 2 * self.A.chi_inertial
558
+ S2 = m2[:, np.newaxis] ** 2 * self.B.chi_inertial
559
+ L̂ = self.ℓ̂
560
+ χₚ = (1 / m1) * np.maximum(
561
+ np.linalg.norm(np.cross(L̂, S1), axis=1) / m1,
562
+ ((3*m1 + 4*m2)/(3*m2+4*m1)) * np.linalg.norm(np.cross(L̂, S2), axis=1) / m2
563
+ )
564
+ return χₚ
565
+
566
+ χp = χₚ
567
+ chi_p = χₚ
@@ -1,9 +1,9 @@
1
1
  {
2
- "julia": "1.11",
2
+ "julia": "1.12",
3
3
  "packages": {
4
4
  "PostNewtonian": {
5
5
  "uuid": "377afc40-5642-4616-8613-b7ebca523866",
6
- "version": "0.10.5"
6
+ "version": "0.10.9"
7
7
  }
8
8
  }
9
9
  }
@@ -915,7 +915,7 @@ class Simulation_v2(SimulationBase):
915
915
  f"/rMPsi4_Asymptotic_GeometricUnits_CoM_Mem/{extrapolation}"
916
916
  )
917
917
 
918
- def load_waveform(self, file_name, group, transform_to_inertial=True):
918
+ def load_waveform(self, file_name, group, transform_to_inertial=True, drop_times_before=0):
919
919
  from .. import load
920
920
  # Note that `name` should not have the file ending on input,
921
921
  # but we will replace it regardless with `.with_suffix`.
@@ -934,7 +934,7 @@ class Simulation_v2(SimulationBase):
934
934
  download_file(json_location, json_truepath)
935
935
  return load(
936
936
  h5_location, truepath=h5_truepath, group=group, metadata=self.metadata,
937
- transform_to_inertial=transform_to_inertial, drop_times_before=0,
937
+ transform_to_inertial=transform_to_inertial, drop_times_before=drop_times_before,
938
938
  )
939
939
 
940
940
 
@@ -121,8 +121,20 @@ class TimeSeries(np.ndarray):
121
121
  """
122
122
  from numbers import Integral
123
123
 
124
+ # The docs at
125
+ # https://numpy.org/doc/stable/user/basics.indexing.html#detailed-notes
126
+ # say, "An empty (tuple) index is a full scalar index into a
127
+ # zero-dimensional array. `x[()]` returns a *scalar* if `x`
128
+ # is zero-dimensional and a view otherwise. On the other hand,
129
+ # `x[...]` always returns a view." This was true in numpy 1 as well,
130
+ # but the behavior has actually changed in numpy 2 for non-0d arrays,
131
+ # which causes downstream errors. So we have to change to handle this.
124
132
  if isinstance(key, tuple) and len(key) == 0:
125
- raise ValueError(f"Empty index to {type(self).__name__} does not make sense")
133
+ if self.ndim == 0:
134
+ return super().__getitem__(key), key
135
+ else:
136
+ return self, key
137
+ # raise ValueError(f"Empty index to {type(self).__name__} does not make sense")
126
138
 
127
139
  def newaxis_type(e):
128
140
  return isinstance(e, (type(np.newaxis), type(None)))
@@ -151,6 +151,10 @@ def test_modes_squared_angular_momenta():
151
151
  import spherical as sf
152
152
  tolerance = 1e-13
153
153
  np.random.seed(1234)
154
+
155
+ def allclose(a, b):
156
+ return np.allclose(a.ndarray, b.ndarray, rtol=tolerance, atol=tolerance)
157
+
154
158
  L2 = sf.Modes.Lsquared
155
159
  Lz = sf.Modes.Lz
156
160
  Lp = sf.Modes.Lplus
@@ -168,17 +172,17 @@ def test_modes_squared_angular_momenta():
168
172
  # Test L^2 = 0.5(L+L- + L-L+) + LzLz
169
173
  m1 = L2(m)
170
174
  m2 = 0.5 * (Lp(Lm(m)) + Lm(Lp(m))) + Lz(Lz(m))
171
- assert np.allclose(m1, m2, rtol=tolerance, atol=tolerance)
175
+ assert allclose(m1, m2)
172
176
 
173
177
  # Test R^2 = 0.5(R+R- + R-R+) + RzRz
174
178
  m1 = R2(m)
175
179
  m2 = 0.5 * (Rp(Rm(m)) + Rm(Rp(m))) + Rz(Rz(m))
176
- assert np.allclose(m1, m2, rtol=tolerance, atol=tolerance)
180
+ assert allclose(m1, m2)
177
181
 
178
182
  # Test L^2 = R^2
179
183
  m1 = L2(m)
180
184
  m2 = R2(m)
181
- assert np.allclose(m1, m2, rtol=tolerance, atol=tolerance)
185
+ assert allclose(m1, m2)
182
186
 
183
187
 
184
188
  def test_modes_derivative_commutators():
@@ -188,7 +192,6 @@ def test_modes_derivative_commutators():
188
192
  # Note that post-fix operators are in the opposite order compared
189
193
  # to prefixed commutators, so we pull the post-fix operators out
190
194
  # as functions to make things look right.
191
- np.random.seed(1234)
192
195
  L2 = sf.Modes.Lsquared
193
196
  Lz = sf.Modes.Lz
194
197
  Lp = sf.Modes.Lplus
@@ -199,6 +202,10 @@ def test_modes_derivative_commutators():
199
202
  Rm = sf.Modes.Rminus
200
203
  eth = lambda modes: modes.eth
201
204
  ethbar = lambda modes: modes.ethbar
205
+
206
+ def allclose(a, b):
207
+ return np.allclose(a.ndarray, b.ndarray, rtol=tolerance, atol=tolerance)
208
+
202
209
  for s in range(-2, 2+1):
203
210
  ell_min = abs(s)
204
211
  ell_max = 8
@@ -215,19 +222,19 @@ def test_modes_derivative_commutators():
215
222
  for R in [Rz, Rp, Rm]:
216
223
  assert np.max(np.abs(R2(R(m)) - R(R2(m)))) < 5*tolerance
217
224
  # Test [Lz, Lp] = Lp
218
- assert np.allclose(Lz(Lp(m)) - Lp(Lz(m)), Lp(m), rtol=tolerance, atol=tolerance)
225
+ assert allclose(Lz(Lp(m)) - Lp(Lz(m)), Lp(m))
219
226
  # Test [Lz, Lm] = -Lm
220
- assert np.allclose(Lz(Lm(m)) - Lm(Lz(m)), -Lm(m), rtol=tolerance, atol=tolerance)
227
+ assert allclose(Lz(Lm(m)) - Lm(Lz(m)), -Lm(m))
221
228
  # Test [Lp, Lm] = 2Lz
222
- assert np.allclose(Lp(Lm(m)) - Lm(Lp(m)), 2 * Lz(m), rtol=tolerance, atol=tolerance)
229
+ assert allclose(Lp(Lm(m)) - Lm(Lp(m)), 2 * Lz(m))
223
230
  # Test [Rz, Rp] = Rp
224
- assert np.allclose(Rz(Rp(m)) - Rp(Rz(m)), Rp(m), rtol=tolerance, atol=tolerance)
231
+ assert allclose(Rz(Rp(m)) - Rp(Rz(m)), Rp(m))
225
232
  # Test [Rz, Rm] = -Rm
226
- assert np.allclose(Rz(Rm(m)) - Rm(Rz(m)), -Rm(m), rtol=tolerance, atol=tolerance)
233
+ assert allclose(Rz(Rm(m)) - Rm(Rz(m)), -Rm(m))
227
234
  # Test [Rp, Rm] = 2Rz
228
- assert np.allclose(Rp(Rm(m)) - Rm(Rp(m)), 2 * Rz(m), rtol=tolerance, atol=tolerance)
235
+ assert allclose(Rp(Rm(m)) - Rm(Rp(m)), 2 * Rz(m))
229
236
  # Test [ethbar, eth] = 2s
230
- assert np.allclose(ethbar(eth(m)) - eth(ethbar(m)), 2 * m.s * m, rtol=tolerance, atol=tolerance)
237
+ assert allclose(ethbar(eth(m)) - eth(ethbar(m)), 2 * m.s * m)
231
238
 
232
239
 
233
240
  @skip_macOS_GH_actions_downloads
@@ -1 +0,0 @@
1
- __version__ = "2025.0.19"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes