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.
Files changed (175) hide show
  1. {nullcal-0.3.0 → nullcal-0.3.1}/.github/workflows/codeql.yml +3 -3
  2. {nullcal-0.3.0 → nullcal-0.3.1}/.github/workflows/scheduled_release.yml +1 -1
  3. {nullcal-0.3.0 → nullcal-0.3.1}/.github/workflows/support_floor_update.yml +1 -1
  4. {nullcal-0.3.0 → nullcal-0.3.1}/.pre-commit-config.yaml +4 -4
  5. {nullcal-0.3.0 → nullcal-0.3.1}/PKG-INFO +1 -1
  6. {nullcal-0.3.0 → nullcal-0.3.1}/pyproject.toml +3 -3
  7. {nullcal-0.3.0 → nullcal-0.3.1}/scripts/lwa_leakage_study.py +6 -5
  8. {nullcal-0.3.0 → nullcal-0.3.1}/scripts/run_reference_blackjax.py +1 -1
  9. {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/generate_reference.py +20 -15
  10. {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/reference/manifest.json +1 -1
  11. {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/reference/posterior_manifest.json +1 -1
  12. {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/test_reference_artifacts.py +43 -3
  13. {nullcal-0.3.0 → nullcal-0.3.1}/uv.lock +278 -253
  14. {nullcal-0.3.0 → nullcal-0.3.1}/.coderabbit.yaml +0 -0
  15. {nullcal-0.3.0 → nullcal-0.3.1}/.github/ISSUE_TEMPLATE/bug-report.md +0 -0
  16. {nullcal-0.3.0 → nullcal-0.3.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  17. {nullcal-0.3.0 → nullcal-0.3.1}/.github/ISSUE_TEMPLATE/feature-request.md +0 -0
  18. {nullcal-0.3.0 → nullcal-0.3.1}/.github/pull_request_template.md +0 -0
  19. {nullcal-0.3.0 → nullcal-0.3.1}/.github/workflows/ci.yml +0 -0
  20. {nullcal-0.3.0 → nullcal-0.3.1}/.github/workflows/documentation.yml +0 -0
  21. {nullcal-0.3.0 → nullcal-0.3.1}/.github/workflows/draft_release.yml +0 -0
  22. {nullcal-0.3.0 → nullcal-0.3.1}/.github/workflows/publish.yml +0 -0
  23. {nullcal-0.3.0 → nullcal-0.3.1}/.github/workflows/publish_testpypi.yml +0 -0
  24. {nullcal-0.3.0 → nullcal-0.3.1}/.github/workflows/release.yml +0 -0
  25. {nullcal-0.3.0 → nullcal-0.3.1}/.github/workflows/semantic_pull_request.yml +0 -0
  26. {nullcal-0.3.0 → nullcal-0.3.1}/.gitignore +0 -0
  27. {nullcal-0.3.0 → nullcal-0.3.1}/.markdownlint.yaml +0 -0
  28. {nullcal-0.3.0 → nullcal-0.3.1}/.prettierignore +0 -0
  29. {nullcal-0.3.0 → nullcal-0.3.1}/.prettierrc.yaml +0 -0
  30. {nullcal-0.3.0 → nullcal-0.3.1}/.typos.toml +0 -0
  31. {nullcal-0.3.0 → nullcal-0.3.1}/CODE_OF_CONDUCT.md +0 -0
  32. {nullcal-0.3.0 → nullcal-0.3.1}/CONTRIBUTING.md +0 -0
  33. {nullcal-0.3.0 → nullcal-0.3.1}/LICENSE +0 -0
  34. {nullcal-0.3.0 → nullcal-0.3.1}/MANIFEST.in +0 -0
  35. {nullcal-0.3.0 → nullcal-0.3.1}/README.md +0 -0
  36. {nullcal-0.3.0 → nullcal-0.3.1}/cliff.toml +0 -0
  37. {nullcal-0.3.0 → nullcal-0.3.1}/docs/.gitignore +0 -0
  38. {nullcal-0.3.0 → nullcal-0.3.1}/docs/contributing.md +0 -0
  39. {nullcal-0.3.0 → nullcal-0.3.1}/docs/dev/architecture.md +0 -0
  40. {nullcal-0.3.0 → nullcal-0.3.1}/docs/index.md +0 -0
  41. {nullcal-0.3.0 → nullcal-0.3.1}/docs/javascripts/mathjax.js +0 -0
  42. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/index.md +0 -0
  43. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/clustering/base.md +0 -0
  44. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/clustering/index.md +0 -0
  45. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/clustering/injection.md +0 -0
  46. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/clustering/precompute.md +0 -0
  47. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/clustering/single.md +0 -0
  48. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/clustering/time_frequency_map.md +0 -0
  49. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/data.md +0 -0
  50. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/index.md +0 -0
  51. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/likelihood/index.md +0 -0
  52. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/likelihood/recalibration_likelihood.md +0 -0
  53. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/metadata/index.md +0 -0
  54. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/metadata/yaml.md +0 -0
  55. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/null_stream/calibration.md +0 -0
  56. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/null_stream/index.md +0 -0
  57. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/null_stream/null_stream.md +0 -0
  58. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/null_stream/projector.md +0 -0
  59. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/null_stream/whiten.md +0 -0
  60. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/result/index.md +0 -0
  61. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/result/result.md +0 -0
  62. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/result/utils.md +0 -0
  63. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/time_frequency_transform/index.md +0 -0
  64. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/time_frequency_transform/inverse_wavelet_freq_funcs.md +0 -0
  65. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/time_frequency_transform/inverse_wavelet_time_funcs.md +0 -0
  66. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/time_frequency_transform/stft.md +0 -0
  67. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/time_frequency_transform/transform_freq_funcs.md +0 -0
  68. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/time_frequency_transform/transform_time_funcs.md +0 -0
  69. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/time_frequency_transform/utils.md +0 -0
  70. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/time_frequency_transform/wavelet_transforms.md +0 -0
  71. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/utils/index.md +0 -0
  72. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/utils/log.md +0 -0
  73. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/utils/snr.md +0 -0
  74. {nullcal-0.3.0 → nullcal-0.3.1}/docs/reference/nullcal/version.md +0 -0
  75. {nullcal-0.3.0 → nullcal-0.3.1}/docs/security.md +0 -0
  76. {nullcal-0.3.0 → nullcal-0.3.1}/docs/user-guide/installation.md +0 -0
  77. {nullcal-0.3.0 → nullcal-0.3.1}/docs/user-guide/quickstart.md +0 -0
  78. {nullcal-0.3.0 → nullcal-0.3.1}/renovate.json +0 -0
  79. {nullcal-0.3.0 → nullcal-0.3.1}/scripts/calibration_bilby_anchor.py +0 -0
  80. {nullcal-0.3.0 → nullcal-0.3.1}/scripts/diagnose_likelihood_agreement.py +0 -0
  81. {nullcal-0.3.0 → nullcal-0.3.1}/scripts/jax_wdm_verification.py +0 -0
  82. {nullcal-0.3.0 → nullcal-0.3.1}/scripts/release_version.py +0 -0
  83. {nullcal-0.3.0 → nullcal-0.3.1}/scripts/spline_resolution_study.py +0 -0
  84. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/__init__.py +0 -0
  85. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/calibration.py +0 -0
  86. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/clustering/__init__.py +0 -0
  87. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/clustering/base.py +0 -0
  88. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/clustering/injection.py +0 -0
  89. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/clustering/precompute.py +0 -0
  90. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/clustering/single.py +0 -0
  91. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/clustering/time_frequency_map.py +0 -0
  92. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/data.py +0 -0
  93. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/likelihood/__init__.py +0 -0
  94. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/likelihood/recalibration_likelihood.py +0 -0
  95. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/metadata/__init__.py +0 -0
  96. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/metadata/yaml.py +0 -0
  97. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/null_stream/__init__.py +0 -0
  98. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/null_stream/calibration.py +0 -0
  99. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/null_stream/null_stream.py +0 -0
  100. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/null_stream/projector.py +0 -0
  101. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/null_stream/whiten.py +0 -0
  102. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/result/__init__.py +0 -0
  103. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/result/result.py +0 -0
  104. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/result/utils.py +0 -0
  105. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/sampler.py +0 -0
  106. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/studies/__init__.py +0 -0
  107. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/studies/gpu_cost.py +0 -0
  108. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/studies/lwa_leakage.py +0 -0
  109. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/studies/spline_resolution.py +0 -0
  110. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/time_frequency_transform/README.md +0 -0
  111. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/time_frequency_transform/__init__.py +0 -0
  112. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/time_frequency_transform/inverse_wavelet_freq_funcs.py +0 -0
  113. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/time_frequency_transform/inverse_wavelet_time_funcs.py +0 -0
  114. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/time_frequency_transform/stft.py +0 -0
  115. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/time_frequency_transform/transform_freq_funcs.py +0 -0
  116. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/time_frequency_transform/transform_time_funcs.py +0 -0
  117. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/time_frequency_transform/utils.py +0 -0
  118. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/time_frequency_transform/wavelet_transforms.py +0 -0
  119. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/utils/__init__.py +0 -0
  120. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/utils/log.py +0 -0
  121. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/utils/snr.py +0 -0
  122. {nullcal-0.3.0 → nullcal-0.3.1}/src/nullcal/version.py +0 -0
  123. {nullcal-0.3.0 → nullcal-0.3.1}/tests/.gitignore +0 -0
  124. {nullcal-0.3.0 → nullcal-0.3.1}/tests/calibration/bilby_anchor.md +0 -0
  125. {nullcal-0.3.0 → nullcal-0.3.1}/tests/calibration/test_model.py +0 -0
  126. {nullcal-0.3.0 → nullcal-0.3.1}/tests/calibration/test_posterior_summary.py +0 -0
  127. {nullcal-0.3.0 → nullcal-0.3.1}/tests/clustering/conftest.py +0 -0
  128. {nullcal-0.3.0 → nullcal-0.3.1}/tests/clustering/test_clustering_algorithm.py +0 -0
  129. {nullcal-0.3.0 → nullcal-0.3.1}/tests/clustering/test_clustering_classes.py +0 -0
  130. {nullcal-0.3.0 → nullcal-0.3.1}/tests/clustering/test_single_clustering.py +0 -0
  131. {nullcal-0.3.0 → nullcal-0.3.1}/tests/clustering/test_time_frequency_map.py +0 -0
  132. {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/README.md +0 -0
  133. {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/__init__.py +0 -0
  134. {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/config.py +0 -0
  135. {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/diagnostics/likelihood_agreement.json +0 -0
  136. {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/generate_reference_inputs.py +0 -0
  137. {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/pipeline.py +0 -0
  138. {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/reference/artifacts.npz +0 -0
  139. {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/reference/blackjax_posterior_manifest.json +0 -0
  140. {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/reference/blackjax_posterior_samples.npz +0 -0
  141. {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/reference/inputs.npz +0 -0
  142. {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/reference/inputs_manifest.json +0 -0
  143. {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/reference/posterior_samples.npz +0 -0
  144. {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/test_blackjax_posterior.py +0 -0
  145. {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/test_noise_log_likelihood_filter_domain.py +0 -0
  146. {nullcal-0.3.0 → nullcal-0.3.1}/tests/e2e/test_reference_posterior.py +0 -0
  147. {nullcal-0.3.0 → nullcal-0.3.1}/tests/likelihood/test_logdensity.py +0 -0
  148. {nullcal-0.3.0 → nullcal-0.3.1}/tests/likelihood/test_recalibration_direction.py +0 -0
  149. {nullcal-0.3.0 → nullcal-0.3.1}/tests/likelihood/test_recalibration_likelihood.py +0 -0
  150. {nullcal-0.3.0 → nullcal-0.3.1}/tests/metadata/test_yaml.py +0 -0
  151. {nullcal-0.3.0 → nullcal-0.3.1}/tests/null_stream/test_calibration_jax.py +0 -0
  152. {nullcal-0.3.0 → nullcal-0.3.1}/tests/null_stream/test_null_stream.py +0 -0
  153. {nullcal-0.3.0 → nullcal-0.3.1}/tests/null_stream/test_projector.py +0 -0
  154. {nullcal-0.3.0 → nullcal-0.3.1}/tests/null_stream/test_whiten.py +0 -0
  155. {nullcal-0.3.0 → nullcal-0.3.1}/tests/result/test_result.py +0 -0
  156. {nullcal-0.3.0 → nullcal-0.3.1}/tests/smoke_test.py +0 -0
  157. {nullcal-0.3.0 → nullcal-0.3.1}/tests/studies/test_gpu_cost.py +0 -0
  158. {nullcal-0.3.0 → nullcal-0.3.1}/tests/studies/test_lwa_leakage.py +0 -0
  159. {nullcal-0.3.0 → nullcal-0.3.1}/tests/studies/test_spline_resolution.py +0 -0
  160. {nullcal-0.3.0 → nullcal-0.3.1}/tests/test_blackjax_boundary.py +0 -0
  161. {nullcal-0.3.0 → nullcal-0.3.1}/tests/test_data.py +0 -0
  162. {nullcal-0.3.0 → nullcal-0.3.1}/tests/test_dependencies_are_declared.py +0 -0
  163. {nullcal-0.3.0 → nullcal-0.3.1}/tests/test_jax_wdm_verification.py +0 -0
  164. {nullcal-0.3.0 → nullcal-0.3.1}/tests/test_release_version.py +0 -0
  165. {nullcal-0.3.0 → nullcal-0.3.1}/tests/test_sampler.py +0 -0
  166. {nullcal-0.3.0 → nullcal-0.3.1}/tests/time_frequency_transform/test_jax_transform.py +0 -0
  167. {nullcal-0.3.0 → nullcal-0.3.1}/tests/time_frequency_transform/test_stft.py +0 -0
  168. {nullcal-0.3.0 → nullcal-0.3.1}/tests/time_frequency_transform/test_time_domain_transform.py +0 -0
  169. {nullcal-0.3.0 → nullcal-0.3.1}/tests/time_frequency_transform/test_transform_freq_funcs.py +0 -0
  170. {nullcal-0.3.0 → nullcal-0.3.1}/tests/time_frequency_transform/test_utils.py +0 -0
  171. {nullcal-0.3.0 → nullcal-0.3.1}/tests/time_frequency_transform/test_wavelet_transforms.py +0 -0
  172. {nullcal-0.3.0 → nullcal-0.3.1}/tests/time_frequency_transform/test_wdm_window.py +0 -0
  173. {nullcal-0.3.0 → nullcal-0.3.1}/tests/utils/test_log.py +0 -0
  174. {nullcal-0.3.0 → nullcal-0.3.1}/tests/utils/test_snr.py +0 -0
  175. {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@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4
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@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4
31
+ uses: github/codeql-action/autobuild@24c54180a607b1449ed407dd24f251e4e9147c8d # v4
32
32
 
33
33
  - name: Perform CodeQL Analysis
34
- uses: github/codeql-action/analyze@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4
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@051225b2ef2faf2a02d61f16d1a027cdf941498d # v0.0.21
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@af9e20cfdcb7d14a4c08614e981e8c2339d3da0f # v0.2.11
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.16.10
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.50.3
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.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.12.23
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.0
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.16.10",
57
- "prek>=0.5.4",
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.67", "mkdocstrings-python>=2.0.9"]
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 M3 LWA validity band on this grid{bracket}. "
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 for M3
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 M4 D2 result: it uses monochromatic bins, fixed SNR, independent equal ET-D
220
- noise, a MAP rather than a posterior, and calibration parameters free at each frequency. M4 must use
221
- a broadband source, the 19-knot calibration curve, posterior coverage, more noise realizations, and
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
 
@@ -1,4 +1,4 @@
1
- """Run the fixed BlackJAX acceptance posterior against immutable R1 inputs."""
1
+ """Run the fixed BlackJAX acceptance posterior against the immutable end-to-end reference inputs."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
@@ -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 R17 artifacts were first generated from a
44
- working tree carrying an uncommitted fix, so the manifest named a revision that raises
45
- ``IndexError`` and cannot produce them — provenance pointing at the opposite implementation
46
- from the one that ran. A reviewer caught it; this makes it self-reporting.
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 in R17. Before that, 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."
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 (the R1 defect, fixed in R17), and bilby calls it unconditionally after sampling. log_bayes_factor is NaN for the same reason. Neither is part of the anchor."
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
- R17's artifacts were first generated from a working tree carrying an uncommitted fix, so the
286
- manifest named ``main``, whose code raises ``IndexError`` and cannot produce two of the keys
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.