nullcal 0.3.0__tar.gz → 0.3.1__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.
- {nullcal-0.3.0 → nullcal-0.3.1}/.github/workflows/codeql.yml +3 -3
- {nullcal-0.3.0 → nullcal-0.3.1}/.github/workflows/scheduled_release.yml +1 -1
- {nullcal-0.3.0 → nullcal-0.3.1}/.github/workflows/support_floor_update.yml +1 -1
- {nullcal-0.3.0 → nullcal-0.3.1}/.pre-commit-config.yaml +4 -4
- {nullcal-0.3.0 → nullcal-0.3.1}/PKG-INFO +1 -1
- {nullcal-0.3.0 → nullcal-0.3.1}/pyproject.toml +3 -3
- {nullcal-0.3.0 → nullcal-0.3.1}/scripts/lwa_leakage_study.py +6 -5
- {nullcal-0.3.0 → nullcal-0.3.1}/scripts/run_reference_blackjax.py +1 -1
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/generate_reference.py +20 -15
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/reference/manifest.json +1 -1
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/reference/posterior_manifest.json +1 -1
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/test_reference_artifacts.py +43 -3
- {nullcal-0.3.0 → nullcal-0.3.1}/uv.lock +278 -253
- {nullcal-0.3.0 → nullcal-0.3.1}/.coderabbit.yaml +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/.github/ISSUE_TEMPLATE/bug-report.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/.github/ISSUE_TEMPLATE/feature-request.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/.github/pull_request_template.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/.github/workflows/ci.yml +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/.github/workflows/documentation.yml +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/.github/workflows/draft_release.yml +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/.github/workflows/publish.yml +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/.github/workflows/publish_testpypi.yml +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/.github/workflows/release.yml +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/.github/workflows/semantic_pull_request.yml +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/.gitignore +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/.markdownlint.yaml +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/.prettierignore +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/.prettierrc.yaml +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/.typos.toml +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/CODE_OF_CONDUCT.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/CONTRIBUTING.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/LICENSE +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/MANIFEST.in +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/README.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/cliff.toml +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/.gitignore +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/contributing.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/dev/architecture.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/index.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/javascripts/mathjax.js +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/index.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/clustering/base.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/clustering/index.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/clustering/injection.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/clustering/precompute.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/clustering/single.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/clustering/time_frequency_map.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/data.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/index.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/likelihood/index.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/likelihood/recalibration_likelihood.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/metadata/index.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/metadata/yaml.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/null_stream/calibration.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/null_stream/index.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/null_stream/null_stream.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/null_stream/projector.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/null_stream/whiten.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/result/index.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/result/result.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/result/utils.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/time_frequency_transform/index.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/time_frequency_transform/inverse_wavelet_freq_funcs.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/time_frequency_transform/inverse_wavelet_time_funcs.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/time_frequency_transform/stft.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/time_frequency_transform/transform_freq_funcs.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/time_frequency_transform/transform_time_funcs.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/time_frequency_transform/utils.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/time_frequency_transform/wavelet_transforms.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/utils/index.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/utils/log.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/utils/snr.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/version.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/security.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/user-guide/installation.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/docs/user-guide/quickstart.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/renovate.json +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/scripts/calibration_bilby_anchor.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/scripts/diagnose_likelihood_agreement.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/scripts/jax_wdm_verification.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/scripts/release_version.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/scripts/spline_resolution_study.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/__init__.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/calibration.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/clustering/__init__.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/clustering/base.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/clustering/injection.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/clustering/precompute.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/clustering/single.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/clustering/time_frequency_map.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/data.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/likelihood/__init__.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/likelihood/recalibration_likelihood.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/metadata/__init__.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/metadata/yaml.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/null_stream/__init__.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/null_stream/calibration.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/null_stream/null_stream.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/null_stream/projector.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/null_stream/whiten.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/result/__init__.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/result/result.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/result/utils.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/sampler.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/studies/__init__.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/studies/gpu_cost.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/studies/lwa_leakage.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/studies/spline_resolution.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/time_frequency_transform/README.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/time_frequency_transform/__init__.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/time_frequency_transform/inverse_wavelet_freq_funcs.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/time_frequency_transform/inverse_wavelet_time_funcs.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/time_frequency_transform/stft.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/time_frequency_transform/transform_freq_funcs.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/time_frequency_transform/transform_time_funcs.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/time_frequency_transform/utils.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/time_frequency_transform/wavelet_transforms.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/utils/__init__.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/utils/log.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/utils/snr.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/version.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/.gitignore +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/calibration/bilby_anchor.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/calibration/test_model.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/calibration/test_posterior_summary.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/clustering/conftest.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/clustering/test_clustering_algorithm.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/clustering/test_clustering_classes.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/clustering/test_single_clustering.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/clustering/test_time_frequency_map.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/README.md +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/__init__.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/config.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/diagnostics/likelihood_agreement.json +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/generate_reference_inputs.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/pipeline.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/reference/artifacts.npz +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/reference/blackjax_posterior_manifest.json +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/reference/blackjax_posterior_samples.npz +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/reference/inputs.npz +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/reference/inputs_manifest.json +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/reference/posterior_samples.npz +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/test_blackjax_posterior.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/test_noise_log_likelihood_filter_domain.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/test_reference_posterior.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/likelihood/test_logdensity.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/likelihood/test_recalibration_direction.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/likelihood/test_recalibration_likelihood.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/metadata/test_yaml.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/null_stream/test_calibration_jax.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/null_stream/test_null_stream.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/null_stream/test_projector.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/null_stream/test_whiten.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/result/test_result.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/smoke_test.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/studies/test_gpu_cost.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/studies/test_lwa_leakage.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/studies/test_spline_resolution.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/test_blackjax_boundary.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/test_data.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/test_dependencies_are_declared.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/test_jax_wdm_verification.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/test_release_version.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/test_sampler.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/time_frequency_transform/test_jax_transform.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/time_frequency_transform/test_stft.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/time_frequency_transform/test_time_domain_transform.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/time_frequency_transform/test_transform_freq_funcs.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/time_frequency_transform/test_utils.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/time_frequency_transform/test_wavelet_transforms.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/time_frequency_transform/test_wdm_window.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/utils/test_log.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/tests/utils/test_snr.py +0 -0
- {nullcal-0.3.0 → nullcal-0.3.1}/zensical.toml +0 -0
|
@@ -22,13 +22,13 @@ jobs:
|
|
|
22
22
|
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
|
|
23
23
|
|
|
24
24
|
- name: Initialize CodeQL
|
|
25
|
-
uses: github/codeql-action/init@
|
|
25
|
+
uses: github/codeql-action/init@24c54180a607b1449ed407dd24f251e4e9147c8d # v4
|
|
26
26
|
with:
|
|
27
27
|
languages: python
|
|
28
28
|
queries: security-and-quality
|
|
29
29
|
|
|
30
30
|
- name: Autobuild
|
|
31
|
-
uses: github/codeql-action/autobuild@
|
|
31
|
+
uses: github/codeql-action/autobuild@24c54180a607b1449ed407dd24f251e4e9147c8d # v4
|
|
32
32
|
|
|
33
33
|
- name: Perform CodeQL Analysis
|
|
34
|
-
uses: github/codeql-action/analyze@
|
|
34
|
+
uses: github/codeql-action/analyze@24c54180a607b1449ed407dd24f251e4e9147c8d # v4
|
|
@@ -31,7 +31,7 @@ jobs:
|
|
|
31
31
|
|
|
32
32
|
- name: Check for new commits
|
|
33
33
|
id: check_commits
|
|
34
|
-
uses: isaac-cf-wong/detect-git-changes-action@
|
|
34
|
+
uses: isaac-cf-wong/detect-git-changes-action@9863c3c0ba155ed10b54072f711ae8807aedbc87 # v0.0.22
|
|
35
35
|
with:
|
|
36
36
|
use-latest-tag: true
|
|
37
37
|
|
|
@@ -22,7 +22,7 @@ jobs:
|
|
|
22
22
|
|
|
23
23
|
- name: Apply support policy (spec0, from pyproject tool table)
|
|
24
24
|
id: policy
|
|
25
|
-
uses: isaac-cf-wong/dependency-support-policy-action@
|
|
25
|
+
uses: isaac-cf-wong/dependency-support-policy-action@f83b1c576c82b2a7dde5d3c38c222d68b76bb9cf # v0.2.12
|
|
26
26
|
with:
|
|
27
27
|
mode: update
|
|
28
28
|
|
|
@@ -17,7 +17,7 @@ repos:
|
|
|
17
17
|
- id: check-json
|
|
18
18
|
|
|
19
19
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
20
|
-
rev: v0.
|
|
20
|
+
rev: v0.17.0
|
|
21
21
|
hooks:
|
|
22
22
|
- id: ruff
|
|
23
23
|
args: [--fix, --config=pyproject.toml]
|
|
@@ -29,13 +29,13 @@ repos:
|
|
|
29
29
|
- id: taplo-format
|
|
30
30
|
|
|
31
31
|
- repo: https://github.com/crate-ci/typos
|
|
32
|
-
rev: v1.
|
|
32
|
+
rev: v1.51.1
|
|
33
33
|
hooks:
|
|
34
34
|
- id: typos
|
|
35
35
|
args: []
|
|
36
36
|
|
|
37
37
|
- repo: https://github.com/rbubley/mirrors-prettier
|
|
38
|
-
rev: v3.9.
|
|
38
|
+
rev: v3.9.10
|
|
39
39
|
hooks:
|
|
40
40
|
- id: prettier
|
|
41
41
|
exclude: ^tests/e2e/diagnostics/likelihood_agreement\.json$
|
|
@@ -54,7 +54,7 @@ repos:
|
|
|
54
54
|
- id: actionlint
|
|
55
55
|
|
|
56
56
|
- repo: https://github.com/astral-sh/uv-pre-commit
|
|
57
|
-
rev: 0.
|
|
57
|
+
rev: 0.13.0
|
|
58
58
|
hooks:
|
|
59
59
|
# Update the uv lockfile
|
|
60
60
|
- id: uv-lock
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: nullcal
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.1
|
|
4
4
|
Summary: A package to constrain calibration errors of a closed-geometry network of gravitational-wave detectors.
|
|
5
5
|
Project-URL: Source, https://github.com/Leuven-Gravity-Institute/nullcal
|
|
6
6
|
Project-URL: Tracker, https://github.com/Leuven-Gravity-Institute/nullcal/issues
|
|
@@ -53,15 +53,15 @@ Tracker = "https://github.com/Leuven-Gravity-Institute/nullcal/issues"
|
|
|
53
53
|
|
|
54
54
|
[dependency-groups]
|
|
55
55
|
dev = [
|
|
56
|
-
"ruff>=0.
|
|
57
|
-
"prek>=0.5.
|
|
56
|
+
"ruff>=0.17.0",
|
|
57
|
+
"prek>=0.5.5",
|
|
58
58
|
"pytest-github-actions-annotate-failures>=0.4.2",
|
|
59
59
|
"pytest-cov>=7.1.0",
|
|
60
60
|
"pytest-mock>=3.16.0",
|
|
61
61
|
"pytest>=9.1.1",
|
|
62
62
|
]
|
|
63
63
|
|
|
64
|
-
docs = ["zensical>=0.0.
|
|
64
|
+
docs = ["zensical>=0.0.69", "mkdocstrings-python>=2.0.9"]
|
|
65
65
|
build = ["hatch>=1.18.1"]
|
|
66
66
|
release = ["git-cliff>=2.14.2"]
|
|
67
67
|
|
|
@@ -146,7 +146,7 @@ def write_readme(path: Path, results: list[dict[str, float | int]], commit: str,
|
|
|
146
146
|
else "; no failure occurs on the tested grid"
|
|
147
147
|
)
|
|
148
148
|
recommendation = (
|
|
149
|
-
f"Use **20-{validity_maximum:.0f} Hz** as the conservative
|
|
149
|
+
f"Use **20-{validity_maximum:.0f} Hz** as the conservative LWA validity band on this grid{bracket}. "
|
|
150
150
|
"This is a pre-check recommendation, not a measured continuous-frequency boundary."
|
|
151
151
|
)
|
|
152
152
|
maximum_failure_count = max(int(row["map_failure_count"]) for row in results)
|
|
@@ -168,7 +168,7 @@ The complete numerical table is `bias_vs_frequency.csv`; it also reports p99 and
|
|
|
168
168
|
signal-minus-null statistic shift, the noise-only false-alarm fraction, ET-D PSD, and MAP convergence.
|
|
169
169
|
No frequency has more than {maximum_failure_count} failed MAP fits.
|
|
170
170
|
|
|
171
|
-
## Validity-band recommendation
|
|
171
|
+
## Validity-band recommendation
|
|
172
172
|
|
|
173
173
|
{recommendation}
|
|
174
174
|
|
|
@@ -216,9 +216,10 @@ signal-present versus signal-absent pair is retained for the leakage significanc
|
|
|
216
216
|
- The sky-factor distribution, leakage SNRs, MAP biases, and recommended band are new computational
|
|
217
217
|
results produced by this run. No external numerical replication was found; they remain **unanchored
|
|
218
218
|
to an independent numerical reference**. Agreement between code paths is not presented as accuracy.
|
|
219
|
-
- This pre-check is not the
|
|
220
|
-
noise, a MAP rather than a posterior, and calibration
|
|
221
|
-
|
|
219
|
+
- This pre-check is not the full leakage-to-calibration-bias measurement: it uses monochromatic
|
|
220
|
+
bins, fixed SNR, independent equal ET-D noise, a MAP rather than a posterior, and calibration
|
|
221
|
+
parameters free at each frequency. That measurement must use a broadband source, the 19-knot
|
|
222
|
+
calibration curve, posterior coverage, more noise realizations, and
|
|
222
223
|
frequency-dependent null mitigation. The ET-D curve affects physical strain/noise scaling, while the
|
|
223
224
|
fixed-SNR whitened statistics deliberately isolate the geometric frequency dependence.
|
|
224
225
|
|
|
@@ -30,6 +30,20 @@ MANIFEST_PATH = REFERENCE_DIR / "manifest.json"
|
|
|
30
30
|
|
|
31
31
|
TRACKED_PACKAGES = ("nullcal", "bilby", "numpy", "scipy", "lalsuite")
|
|
32
32
|
|
|
33
|
+
#: Written verbatim into the manifest's ``fixed_defects``. Kept here as the single source so the
|
|
34
|
+
#: stored manifest can be checked against it; edit the text here and regenerate, never the JSON alone.
|
|
35
|
+
FIXED_DEFECTS = {
|
|
36
|
+
"noise_log_likelihood": (
|
|
37
|
+
"Fixed. Before the fix, RecalibrationLikelihood.noise_log_likelihood() raised "
|
|
38
|
+
"IndexError, because compute_uncalibrated_time_frequency_domain_null_stream applied "
|
|
39
|
+
"the 2-D time-frequency filter to the 2-D frequency-domain array it had already "
|
|
40
|
+
"consumed and returned the time-frequency array unfiltered. The fix filters the "
|
|
41
|
+
"array it returns, matching the calibrated path. noise_log_likelihood and "
|
|
42
|
+
"uncalibrated_time_frequency_domain_null_stream are frozen artifacts from this "
|
|
43
|
+
"revision onward; earlier manifests record them as absent under known_defects."
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
|
|
33
47
|
|
|
34
48
|
def _digest(array: np.ndarray) -> str:
|
|
35
49
|
"""Content digest of an array, independent of how numpy chooses to lay it out."""
|
|
@@ -40,10 +54,11 @@ def _digest(array: np.ndarray) -> str:
|
|
|
40
54
|
def _git_is_dirty() -> bool:
|
|
41
55
|
"""Whether tracked sources differ from HEAD, ignoring the reference artifacts being written.
|
|
42
56
|
|
|
43
|
-
Recorded because ``git_revision`` alone can lie. The
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
from the one that ran. A reviewer
|
|
57
|
+
Recorded because ``git_revision`` alone can lie. The artifacts frozen with the
|
|
58
|
+
``noise_log_likelihood`` fix were first generated from a working tree carrying that fix
|
|
59
|
+
uncommitted, so the manifest named a revision that raises ``IndexError`` and cannot produce
|
|
60
|
+
them — provenance pointing at the opposite implementation from the one that ran. A reviewer
|
|
61
|
+
caught it; this makes it self-reporting.
|
|
47
62
|
"""
|
|
48
63
|
try:
|
|
49
64
|
output = subprocess.check_output(
|
|
@@ -113,17 +128,7 @@ def main() -> int:
|
|
|
113
128
|
}
|
|
114
129
|
for key, value in artifacts.items()
|
|
115
130
|
},
|
|
116
|
-
"fixed_defects":
|
|
117
|
-
"noise_log_likelihood": (
|
|
118
|
-
"Fixed in R17. Before that, RecalibrationLikelihood.noise_log_likelihood() raised "
|
|
119
|
-
"IndexError, because compute_uncalibrated_time_frequency_domain_null_stream applied "
|
|
120
|
-
"the 2-D time-frequency filter to the 2-D frequency-domain array it had already "
|
|
121
|
-
"consumed and returned the time-frequency array unfiltered. The fix filters the "
|
|
122
|
-
"array it returns, matching the calibrated path. noise_log_likelihood and "
|
|
123
|
-
"uncalibrated_time_frequency_domain_null_stream are frozen artifacts from this "
|
|
124
|
-
"revision onward; earlier manifests record them as absent under known_defects."
|
|
125
|
-
)
|
|
126
|
-
},
|
|
131
|
+
"fixed_defects": FIXED_DEFECTS,
|
|
127
132
|
}
|
|
128
133
|
MANIFEST_PATH.write_text(json.dumps(manifest, indent=2, sort_keys=True) + "\n")
|
|
129
134
|
|
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
}
|
|
96
96
|
},
|
|
97
97
|
"fixed_defects": {
|
|
98
|
-
"noise_log_likelihood": "Fixed
|
|
98
|
+
"noise_log_likelihood": "Fixed. Before the fix, RecalibrationLikelihood.noise_log_likelihood() raised IndexError, because compute_uncalibrated_time_frequency_domain_null_stream applied the 2-D time-frequency filter to the 2-D frequency-domain array it had already consumed and returned the time-frequency array unfiltered. The fix filters the array it returns, matching the calibrated path. noise_log_likelihood and uncalibrated_time_frequency_domain_null_stream are frozen artifacts from this revision onward; earlier manifests record them as absent under known_defects."
|
|
99
99
|
},
|
|
100
100
|
"git_dirty": false,
|
|
101
101
|
"git_revision": "549a50ad86a3935d7c37abf24445ba78beb639e5",
|
|
@@ -150,6 +150,6 @@
|
|
|
150
150
|
},
|
|
151
151
|
"smoke": false,
|
|
152
152
|
"unavailable_at_this_revision": {
|
|
153
|
-
"log_noise_evidence": "NaN by construction: noise_log_likelihood() raises IndexError on this revision (
|
|
153
|
+
"log_noise_evidence": "NaN by construction: noise_log_likelihood() raises IndexError on this revision (a defect fixed in a later revision; see fixed_defects in manifest.json), and bilby calls it unconditionally after sampling. log_bayes_factor is NaN for the same reason. Neither is part of the anchor."
|
|
154
154
|
}
|
|
155
155
|
}
|
|
@@ -16,13 +16,14 @@ from pathlib import Path
|
|
|
16
16
|
import numpy as np
|
|
17
17
|
import pytest
|
|
18
18
|
|
|
19
|
-
from . import generate_reference_inputs, pipeline
|
|
19
|
+
from . import generate_reference, generate_reference_inputs, pipeline
|
|
20
20
|
|
|
21
21
|
REFERENCE_DIR = Path(__file__).parent / "reference"
|
|
22
22
|
ARTIFACT_PATH = REFERENCE_DIR / "artifacts.npz"
|
|
23
23
|
MANIFEST_PATH = REFERENCE_DIR / "manifest.json"
|
|
24
24
|
INPUT_ARTIFACT_PATH = REFERENCE_DIR / "inputs.npz"
|
|
25
25
|
INPUT_MANIFEST_PATH = REFERENCE_DIR / "inputs_manifest.json"
|
|
26
|
+
POSTERIOR_MANIFEST_PATH = REFERENCE_DIR / "posterior_manifest.json"
|
|
26
27
|
|
|
27
28
|
pytestmark = [pytest.mark.e2e, pytest.mark.slow]
|
|
28
29
|
|
|
@@ -279,11 +280,50 @@ def test_manifest_configuration_matches_the_live_config(manifest):
|
|
|
279
280
|
assert recorded[key] == value, f"manifest configuration[{key!r}] = {recorded[key]!r}, config.py says {value!r}"
|
|
280
281
|
|
|
281
282
|
|
|
283
|
+
def test_manifest_fixed_defects_match_the_generator(manifest):
|
|
284
|
+
"""The stored defect notes must be exactly what the generator writes.
|
|
285
|
+
|
|
286
|
+
The same prose lives in two places: ``generate_reference.FIXED_DEFECTS`` and the committed
|
|
287
|
+
``manifest.json``. Nothing else reads it, so an edit to one copy alone would leave the manifest
|
|
288
|
+
describing a fix the generator no longer states, with every other test still green. Compare the
|
|
289
|
+
UTF-8 bytes per key, not just the parsed dicts, so the failure names the entry that drifted.
|
|
290
|
+
"""
|
|
291
|
+
stored = manifest.get("fixed_defects")
|
|
292
|
+
assert isinstance(stored, dict), "manifest has no fixed_defects mapping"
|
|
293
|
+
expected = generate_reference.FIXED_DEFECTS
|
|
294
|
+
assert set(stored) == set(expected), (
|
|
295
|
+
f"manifest fixed_defects keys {sorted(stored)} differ from the generator's {sorted(expected)}"
|
|
296
|
+
)
|
|
297
|
+
for key, text in expected.items():
|
|
298
|
+
assert stored[key].encode("utf-8") == text.encode("utf-8"), (
|
|
299
|
+
f"fixed_defects[{key!r}] in manifest.json differs from generate_reference.FIXED_DEFECTS; "
|
|
300
|
+
"edit the generator and regenerate rather than editing either copy alone"
|
|
301
|
+
)
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
def test_posterior_manifest_defect_note_points_at_a_recorded_fix(manifest):
|
|
305
|
+
"""The posterior manifest explains its NaN noise evidence by pointing at ``fixed_defects``.
|
|
306
|
+
|
|
307
|
+
That note has no generator in this repository, so it cannot be compared against one. What can
|
|
308
|
+
be checked is that the pointer resolves: the defect it names must have an entry in the
|
|
309
|
+
artifact manifest, or the explanation sends the reader to a record that does not exist.
|
|
310
|
+
"""
|
|
311
|
+
if not POSTERIOR_MANIFEST_PATH.exists():
|
|
312
|
+
pytest.fail(f"reference posterior manifest absent: {POSTERIOR_MANIFEST_PATH}")
|
|
313
|
+
note = json.loads(POSTERIOR_MANIFEST_PATH.read_text())["unavailable_at_this_revision"]["log_noise_evidence"]
|
|
314
|
+
assert "noise_log_likelihood()" in note, "log_noise_evidence note no longer names the defective method"
|
|
315
|
+
assert "fixed_defects in manifest.json" in note, "log_noise_evidence note no longer points at fixed_defects"
|
|
316
|
+
assert "noise_log_likelihood" in manifest.get("fixed_defects", {}), (
|
|
317
|
+
"posterior manifest points at fixed_defects for noise_log_likelihood, but manifest.json has no such entry"
|
|
318
|
+
)
|
|
319
|
+
|
|
320
|
+
|
|
282
321
|
def test_manifest_provenance_is_not_from_a_dirty_tree(manifest):
|
|
283
322
|
"""A recorded revision that cannot reproduce the artifacts is worse than none.
|
|
284
323
|
|
|
285
|
-
|
|
286
|
-
manifest named ``main``, whose code raises
|
|
324
|
+
The artifacts frozen with the ``noise_log_likelihood`` fix were first generated from a working
|
|
325
|
+
tree carrying that fix uncommitted, so the manifest named ``main``, whose code raises
|
|
326
|
+
``IndexError`` and cannot produce two of the keys
|
|
287
327
|
the manifest describes. Nothing detected it — the digests were self-consistent and every test
|
|
288
328
|
passed. This asserts the generator was run on a clean tree, which is what makes
|
|
289
329
|
``git_revision`` a reproduction instruction rather than a decoration.
|