gbskernels 0.2.0__tar.gz → 0.2.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 (234) hide show
  1. gbskernels-0.2.1/CHANGELOG.md +92 -0
  2. {gbskernels-0.2.0 → gbskernels-0.2.1}/CITATION.cff +2 -2
  3. {gbskernels-0.2.0 → gbskernels-0.2.1}/MANIFEST.in +3 -1
  4. {gbskernels-0.2.0 → gbskernels-0.2.1}/PKG-INFO +30 -14
  5. {gbskernels-0.2.0 → gbskernels-0.2.1}/README.md +29 -13
  6. gbskernels-0.2.1/THIRD_PARTY_NOTICES.md +27 -0
  7. {gbskernels-0.2.0 → gbskernels-0.2.1}/bench/_provenance.py +21 -0
  8. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/README.md +10 -1
  9. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/certified.cu +179 -63
  10. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/certified_dd.cu +95 -39
  11. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_certified.cu +133 -0
  12. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_host_api.cu +35 -0
  13. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_tor_recursive.cu +60 -0
  14. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/dd.cuh +2 -0
  15. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/host_api.cu +21 -4
  16. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/tor_recursive.cu +109 -50
  17. {gbskernels-0.2.0 → gbskernels-0.2.1}/cpu_ref/certified.py +170 -40
  18. {gbskernels-0.2.0 → gbskernels-0.2.1}/docs/benchmark_protocol.md +6 -2
  19. {gbskernels-0.2.0 → gbskernels-0.2.1}/docs/confirmatory_v2.md +7 -5
  20. gbskernels-0.2.1/docs/dd_certificate_proof.md +398 -0
  21. gbskernels-0.2.1/docs/preregistration_jiuzhang1_confirmatory.md +192 -0
  22. {gbskernels-0.2.0 → gbskernels-0.2.1}/envs/rental_4090.md +22 -16
  23. {gbskernels-0.2.0 → gbskernels-0.2.1}/envs/rental_datacenter.md +3 -3
  24. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/README.md +46 -2
  25. gbskernels-0.2.1/examples/jiuzhang/campaign.py +290 -0
  26. gbskernels-0.2.1/examples/jiuzhang/campaign_confirmatory.py +520 -0
  27. gbskernels-0.2.1/examples/jiuzhang/dd_adversarial_enclosure.py +320 -0
  28. gbskernels-0.2.1/examples/jiuzhang/decode_events.py +163 -0
  29. gbskernels-0.2.1/examples/jiuzhang/gate_a_pilot.py +311 -0
  30. gbskernels-0.2.1/examples/jiuzhang/gate_c_probe.py +209 -0
  31. gbskernels-0.2.1/examples/jiuzhang/q7_conditioned.py +353 -0
  32. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/q7_construction.py +3 -1
  33. gbskernels-0.2.1/examples/jiuzhang/q7_parity.py +351 -0
  34. gbskernels-0.2.1/examples/jiuzhang/select_confirmatory.py +388 -0
  35. gbskernels-0.2.1/examples/jiuzhang/validation_data/README.md +20 -0
  36. gbskernels-0.2.1/examples/jiuzhang/validation_data/T_full.npy +0 -0
  37. gbskernels-0.2.1/examples/jiuzhang/validation_data/click_probs_squashed_0.npy +0 -0
  38. gbskernels-0.2.1/examples/jiuzhang/validation_data/click_probs_squeezed_0.npy +0 -0
  39. gbskernels-0.2.1/examples/jiuzhang/validation_data/empirical_click_rates.npy +0 -0
  40. gbskernels-0.2.1/examples/jiuzhang/validation_data/events_band13_32.npy +0 -0
  41. gbskernels-0.2.1/examples/jiuzhang/validation_data/squeezing parameters.txt +25 -0
  42. {gbskernels-0.2.0 → gbskernels-0.2.1}/gbskernels/__init__.py +78 -16
  43. {gbskernels-0.2.0 → gbskernels-0.2.1}/gbskernels.egg-info/PKG-INFO +30 -14
  44. {gbskernels-0.2.0 → gbskernels-0.2.1}/gbskernels.egg-info/SOURCES.txt +36 -0
  45. {gbskernels-0.2.0 → gbskernels-0.2.1}/pyproject.toml +1 -1
  46. gbskernels-0.2.1/results/jiuzhang/legacy_fixed_sample/README.md +63 -0
  47. gbskernels-0.2.1/results/jiuzhang/legacy_fixed_sample/confirmatory_C27_b1.jsonl +800 -0
  48. gbskernels-0.2.1/results/jiuzhang/legacy_fixed_sample/confirmatory_C28_b1.jsonl +500 -0
  49. gbskernels-0.2.1/results/jiuzhang/legacy_fixed_sample/confirmatory_C29_s1.jsonl +400 -0
  50. gbskernels-0.2.1/results/jiuzhang/legacy_fixed_sample/confirmatory_C30_b4.jsonl +150 -0
  51. gbskernels-0.2.1/results/jiuzhang/legacy_fixed_sample/confirmatory_C30_s1.jsonl +150 -0
  52. gbskernels-0.2.1/results/jiuzhang/legacy_fixed_sample/private_fixed_sample_result_v2.json +623 -0
  53. gbskernels-0.2.1/results/jiuzhang/legacy_fixed_sample/private_fixed_sample_selection_v2.npz +0 -0
  54. {gbskernels-0.2.0 → gbskernels-0.2.1}/sampling/gbs.py +8 -3
  55. {gbskernels-0.2.0 → gbskernels-0.2.1}/scripts/README.md +9 -5
  56. {gbskernels-0.2.0 → gbskernels-0.2.1}/scripts/gpu_session.sh +284 -3
  57. gbskernels-0.2.1/scripts/launch_session.sh +174 -0
  58. gbskernels-0.2.1/scripts/prepare_validation_data.py +57 -0
  59. gbskernels-0.2.1/tests/conftest.py +111 -0
  60. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_bench_provenance.py +3 -1
  61. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_certified.py +128 -0
  62. gbskernels-0.2.1/tests/test_certified_api_refusals.py +89 -0
  63. gbskernels-0.2.1/tests/test_dd_adversarial_enclosure.py +53 -0
  64. gbskernels-0.2.1/tests/test_legacy_private_sample.py +275 -0
  65. gbskernels-0.2.1/tests/test_release_metadata.py +43 -0
  66. gbskernels-0.2.1/tests/test_release_runtime.py +36 -0
  67. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_threshold_O_xxpp.py +11 -0
  68. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_tor_recursive.py +31 -0
  69. gbskernels-0.2.1/tests/test_validation_data.py +26 -0
  70. gbskernels-0.2.1/uv.lock +848 -0
  71. gbskernels-0.2.0/CHANGELOG.md +0 -36
  72. gbskernels-0.2.0/scripts/launch_session.sh +0 -86
  73. {gbskernels-0.2.0 → gbskernels-0.2.1}/LICENSE +0 -0
  74. {gbskernels-0.2.0 → gbskernels-0.2.1}/bench/__init__.py +0 -0
  75. {gbskernels-0.2.0 → gbskernels-0.2.1}/bench/_inputs.py +0 -0
  76. {gbskernels-0.2.0 → gbskernels-0.2.1}/bench/accuracy.py +0 -0
  77. {gbskernels-0.2.0 → gbskernels-0.2.1}/bench/accuracy_permanent.py +0 -0
  78. {gbskernels-0.2.0 → gbskernels-0.2.1}/bench/calibrate_auto.py +0 -0
  79. {gbskernels-0.2.0 → gbskernels-0.2.1}/bench/crossover.py +0 -0
  80. {gbskernels-0.2.0 → gbskernels-0.2.1}/bench/kernel_footprint.py +0 -0
  81. {gbskernels-0.2.0 → gbskernels-0.2.1}/bench/plot_crossover.py +0 -0
  82. {gbskernels-0.2.0 → gbskernels-0.2.1}/bench/repeated_ab.py +0 -0
  83. {gbskernels-0.2.0 → gbskernels-0.2.1}/bench/sampler_throughput.py +0 -0
  84. {gbskernels-0.2.0 → gbskernels-0.2.1}/bench/throughput.py +0 -0
  85. {gbskernels-0.2.0 → gbskernels-0.2.1}/bench/throughput_end_to_end.py +0 -0
  86. {gbskernels-0.2.0 → gbskernels-0.2.1}/bench/throughput_gpu.py +0 -0
  87. {gbskernels-0.2.0 → gbskernels-0.2.1}/bench/tightness.py +0 -0
  88. {gbskernels-0.2.0 → gbskernels-0.2.1}/bench/walrus_baseline.py +0 -0
  89. {gbskernels-0.2.0 → gbskernels-0.2.1}/bindings/CMakeLists.txt +0 -0
  90. {gbskernels-0.2.0 → gbskernels-0.2.1}/bindings/README.md +0 -0
  91. {gbskernels-0.2.0 → gbskernels-0.2.1}/bindings/gbskernels_ext.cpp +0 -0
  92. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/CMakeLists.txt +0 -0
  93. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/bench_kernels.cu +0 -0
  94. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/certified_rounding.cuh +0 -0
  95. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_haf_coop.cu +0 -0
  96. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_haf_small.cu +0 -0
  97. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_hafnian.cu +0 -0
  98. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_hafnian_dd.cu +0 -0
  99. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_lhaf_coop.cu +0 -0
  100. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_loop_hafnian.cu +0 -0
  101. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_loop_hafnian_dd.cu +0 -0
  102. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_permanent.cu +0 -0
  103. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_permanent_coop.cu +0 -0
  104. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_permanent_dd.cu +0 -0
  105. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_permanent_warp.cu +0 -0
  106. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_repeated.cu +0 -0
  107. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_sampler_draw.cu +0 -0
  108. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_sampler_gather.cu +0 -0
  109. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_sampler_haf_varn.cu +0 -0
  110. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_sampler_session.cu +0 -0
  111. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_session.cu +0 -0
  112. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_tor_coop.cu +0 -0
  113. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_torontonian.cu +0 -0
  114. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_torontonian_dd.cu +0 -0
  115. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/check_torontonian_real_chol.cu +0 -0
  116. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/hafnian.cu +0 -0
  117. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/hafnian_dd.cu +0 -0
  118. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/loop_hafnian.cu +0 -0
  119. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/loop_hafnian_dd.cu +0 -0
  120. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/permanent.cu +0 -0
  121. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/permanent_coop.cu +0 -0
  122. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/permanent_coop.cuh +0 -0
  123. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/permanent_dd.cu +0 -0
  124. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/permanent_warp.cu +0 -0
  125. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/preflight/cuda/cuComplex.h +0 -0
  126. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/preflight/cuda/cuda_runtime.h +0 -0
  127. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/preflight/cuda/curand_kernel.h +0 -0
  128. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/preflight/run_preflight.sh +0 -0
  129. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/repeated.cu +0 -0
  130. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/sampler_draw.cu +0 -0
  131. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/sampler_gather.cu +0 -0
  132. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/sampler_session.cu +0 -0
  133. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/subset_engine.cuh +0 -0
  134. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/torontonian.cu +0 -0
  135. {gbskernels-0.2.0 → gbskernels-0.2.1}/core/torontonian_dd.cu +0 -0
  136. {gbskernels-0.2.0 → gbskernels-0.2.1}/cpu_ref/__init__.py +0 -0
  137. {gbskernels-0.2.0 → gbskernels-0.2.1}/cpu_ref/dd.py +0 -0
  138. {gbskernels-0.2.0 → gbskernels-0.2.1}/cpu_ref/diagnostics.py +0 -0
  139. {gbskernels-0.2.0 → gbskernels-0.2.1}/cpu_ref/hafnian.py +0 -0
  140. {gbskernels-0.2.0 → gbskernels-0.2.1}/cpu_ref/loop_hafnian.py +0 -0
  141. {gbskernels-0.2.0 → gbskernels-0.2.1}/cpu_ref/permanent.py +0 -0
  142. {gbskernels-0.2.0 → gbskernels-0.2.1}/cpu_ref/repeated.py +0 -0
  143. {gbskernels-0.2.0 → gbskernels-0.2.1}/cpu_ref/tor_recursive.py +0 -0
  144. {gbskernels-0.2.0 → gbskernels-0.2.1}/cpu_ref/torontonian.py +0 -0
  145. {gbskernels-0.2.0 → gbskernels-0.2.1}/docs/DESIGN.md +0 -0
  146. {gbskernels-0.2.0 → gbskernels-0.2.1}/docs/confirmatory_v2_design_spec.template.json +0 -0
  147. {gbskernels-0.2.0 → gbskernels-0.2.1}/docs/confirmatory_v2_plan.template.json +0 -0
  148. {gbskernels-0.2.0 → gbskernels-0.2.1}/docs/device_resident_contract.md +0 -0
  149. {gbskernels-0.2.0 → gbskernels-0.2.1}/docs/exploratory_exposure_manifest.template.json +0 -0
  150. {gbskernels-0.2.0 → gbskernels-0.2.1}/envs/Dockerfile +0 -0
  151. {gbskernels-0.2.0 → gbskernels-0.2.1}/envs/README.md +0 -0
  152. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/gbs_demo.py +0 -0
  153. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/absolute_predictive_checks.py +0 -0
  154. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/analyze_refusals.py +0 -0
  155. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/audit_selection_population.py +0 -0
  156. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/build_exclusion_ledger.py +0 -0
  157. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/calibration_normalizer_replicates.py +0 -0
  158. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/campaign_confirmatory_v2.py +0 -0
  159. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/click_count_dist.npy +0 -0
  160. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/coherence_family.py +0 -0
  161. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/confirmatory_common.py +0 -0
  162. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/confirmatory_contract.py +0 -0
  163. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/confirmatory_design.py +0 -0
  164. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/confirmatory_inference.py +0 -0
  165. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/confirmatory_release.py +0 -0
  166. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/dd_frontier_20260708T105821Z.json +0 -0
  167. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/dd_validate.py +0 -0
  168. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/jiuzhang1_frontier_20260707T164417Z.json +0 -0
  169. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/jiuzhang_frontier.py +0 -0
  170. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/joint_normalizer_replicates.py +0 -0
  171. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/make_precision_wall.py +0 -0
  172. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/prepare_registration_v2.py +0 -0
  173. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/reconstruction_replicates.py +0 -0
  174. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/registration_readiness_v2.py +0 -0
  175. {gbskernels-0.2.0 → gbskernels-0.2.1}/examples/jiuzhang/select_confirmatory_v2.py +0 -0
  176. {gbskernels-0.2.0 → gbskernels-0.2.1}/gbskernels.egg-info/dependency_links.txt +0 -0
  177. {gbskernels-0.2.0 → gbskernels-0.2.1}/gbskernels.egg-info/requires.txt +0 -0
  178. {gbskernels-0.2.0 → gbskernels-0.2.1}/gbskernels.egg-info/top_level.txt +0 -0
  179. {gbskernels-0.2.0 → gbskernels-0.2.1}/highprec_ref/__init__.py +0 -0
  180. {gbskernels-0.2.0 → gbskernels-0.2.1}/highprec_ref/hafnian.py +0 -0
  181. {gbskernels-0.2.0 → gbskernels-0.2.1}/highprec_ref/loop_hafnian.py +0 -0
  182. {gbskernels-0.2.0 → gbskernels-0.2.1}/highprec_ref/permanent.py +0 -0
  183. {gbskernels-0.2.0 → gbskernels-0.2.1}/highprec_ref/torontonian.py +0 -0
  184. {gbskernels-0.2.0 → gbskernels-0.2.1}/sampling/__init__.py +0 -0
  185. {gbskernels-0.2.0 → gbskernels-0.2.1}/sampling/boson_sampling.py +0 -0
  186. {gbskernels-0.2.0 → gbskernels-0.2.1}/sampling/sampler.py +0 -0
  187. {gbskernels-0.2.0 → gbskernels-0.2.1}/scripts/session.py +0 -0
  188. {gbskernels-0.2.0 → gbskernels-0.2.1}/setup.cfg +0 -0
  189. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_absolute_predictive_checks_v2.py +0 -0
  190. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_bench_accuracy.py +0 -0
  191. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_bench_calibrate_auto.py +0 -0
  192. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_bench_crossover.py +0 -0
  193. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_bench_throughput.py +0 -0
  194. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_bench_walrus_baseline.py +0 -0
  195. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_calibration_normalizer_replicates_v2.py +0 -0
  196. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_coherence_family.py +0 -0
  197. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_confirmatory_design_v2.py +0 -0
  198. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_confirmatory_inference_v2.py +0 -0
  199. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_confirmatory_registration_v2.py +0 -0
  200. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_confirmatory_release_v2.py +0 -0
  201. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_confirmatory_run_v2.py +0 -0
  202. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_confirmatory_selection_v2.py +0 -0
  203. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_cuda_preflight.py +0 -0
  204. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_dd_arithmetic.py +0 -0
  205. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_exclusion_ledger_v2.py +0 -0
  206. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_gbs_layer4.py +0 -0
  207. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_gbs_sampler.py +0 -0
  208. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_gpu_bindings.py +0 -0
  209. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_hafnian_highprec.py +0 -0
  210. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_hafnian_layer1.py +0 -0
  211. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_hafnian_layer2_3.py +0 -0
  212. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_highprec_ref.py +0 -0
  213. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_joint_normalizer_replicates_v2.py +0 -0
  214. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_kernel_footprint.py +0 -0
  215. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_layer1_combinatorial.py +0 -0
  216. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_layer2_thewalrus.py +0 -0
  217. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_layer3_properties.py +0 -0
  218. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_layer5_cancellation.py +0 -0
  219. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_layer5_engineering.py +0 -0
  220. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_loop_hafnian.py +0 -0
  221. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_precision_auto.py +0 -0
  222. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_reconstruction_replicates_v2.py +0 -0
  223. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_refusal_analysis_v2.py +0 -0
  224. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_registration_readiness_v2.py +0 -0
  225. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_repeated.py +0 -0
  226. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_sampler_precision_cutoff.py +0 -0
  227. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_sampler_resident.py +0 -0
  228. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_sampling_bosonsampling.py +0 -0
  229. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_sampling_displaced.py +0 -0
  230. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_sampling_gpu_backend.py +0 -0
  231. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_sampling_threshold_tor.py +0 -0
  232. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_tightness.py +0 -0
  233. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_torontonian.py +0 -0
  234. {gbskernels-0.2.0 → gbskernels-0.2.1}/tests/test_workspace_bucketing.py +0 -0
@@ -0,0 +1,92 @@
1
+ # Changelog
2
+
3
+ ## [0.2.1] - 2026-07-24
4
+
5
+ ### Correctness
6
+
7
+ - Add explicit absolute underflow terms to the certified FP64 and
8
+ double-double permanent, hafnian, loop-hafnian, and recursive-torontonian
9
+ recurrences.
10
+ Per-operation propagation now encloses mixed-scale products where an
11
+ intermediate underflows and a later factor amplifies the lost term.
12
+ - Replace assumed forward constants for double-double division and square root
13
+ with outward FMA residual bounds on the values actually returned. Complex
14
+ division refuses denominator, numerator-product, and dot-product ranges that
15
+ cannot be enclosed safely, and preserves tiny numerator uncertainty through
16
+ large quotient amplification.
17
+ - Preserve `+inf` refusal through host subtree reductions. Certified Python
18
+ APIs now reject non-finite inputs and refuse non-finite values, negative or
19
+ non-finite bounds, and invalid tolerances; an explicit `rtol` may escalate a
20
+ refused certificate to an independently computed finite reference value.
21
+ - Make `tor_single` fail before GPU dispatch unless its real binary64 input is
22
+ finite and exactly symmetric. The recursive Cholesky walk consumes one
23
+ triangle, so silently accepting a nonsymmetric matrix made the evaluated
24
+ problem depend on storage convention.
25
+ - Explicitly symmetrize the xxpp Husimi covariance and returned
26
+ `threshold_O_xxpp` matrix after binary64 linear algebra, satisfying the new
27
+ single-large input contract without retaining inversion roundoff skew.
28
+ - Replace the historical Jiuzhang fixed-sample summary with its actual
29
+ finite-population stratified estimand. Remove pseudo-confirmatory intervals
30
+ and normalizer significance calculations that could not be justified from
31
+ the retained inputs; report the event standard error, normalizer diagonal
32
+ sensitivity, and arithmetic proxy separately.
33
+
34
+ ### Reproducibility
35
+
36
+ - Extend artifact provenance with the full Git commit and a tracked-dirty
37
+ indicator, so output generated from modified tracked sources cannot be
38
+ attributed to a clean release commit.
39
+ - Package the deterministic historical selector, aggregator, decoder audit,
40
+ five retained checkpoint JSONL files, and a hash-bound regenerated
41
+ selection/result pair under `results/jiuzhang/legacy_fixed_sample/`.
42
+ - The retained checkpoint rows predate the common provenance schema and do not
43
+ contain recoverable original GPU, container, driver, or commit metadata. The
44
+ release preserves their exact hashes and records current provenance for the
45
+ audit artifacts; it does not invent missing historical environment data.
46
+
47
+ ### Scope
48
+
49
+ - The historical fixed sample was selected and evaluated during exploratory
50
+ development. It is not held out, preregistered, or confirmatory, and this
51
+ correction does not turn it into a confirmatory scientific result.
52
+ - The v0.2.1 tag is conditioned on a clean-tree release-validation session:
53
+ all 24 device gates, the Python binding smoke, adversarial and physical
54
+ enclosure coverage, and the Jiuzhang Gate C probe. The GitHub release carries
55
+ a hash-bound validation manifest for the exact tagged commit. Retained v0.2.0
56
+ RTX 4090 evidence remains historical rather than validation of v0.2.1.
57
+
58
+ ## [0.2.0] - 2026-07-22
59
+
60
+ ### Important Correction
61
+
62
+ - Replace the legacy Jiuzhang state reconstruction with the published
63
+ paired-source Q7 construction and the exact real xxpp threshold-torontonian
64
+ matrix. The two v0.1 frontier JSON files remain historical artifacts and are
65
+ rejected by the current figure tooling.
66
+
67
+ ### Added
68
+
69
+ - A fail-closed Jiuzhang confirmatory-v2 workflow covering exposure-ledger
70
+ audit, outcome-blind design, immutable public registration and beacon-derived
71
+ selection, content-addressed evaluation, refusal recovery,
72
+ reconstruction/calibration uncertainty, joint normalizer replicates,
73
+ absolute predictive checks, simultaneous coherence-grid inference, and
74
+ hash-verified release bundles.
75
+ - Canonical registration, design, and exposure templates plus focused contract
76
+ and regression tests for the workflow and exact xxpp construction.
77
+
78
+ ### Fixed
79
+
80
+ - Harden certified recursive-torontonian bounds with directed downward
81
+ subtraction, sound double-double magnitude bounds, and explicit
82
+ double-double-to-FP64 collapse residual accounting, plus a dedicated
83
+ enclosure gate.
84
+
85
+ ### Scope
86
+
87
+ - This release provides code, templates, and validation contracts. It contains
88
+ no completed v2 registration or new scientific outcome; external calibration,
89
+ public timestamp/beacon evidence, and acquisition inputs remain required.
90
+
91
+ [0.2.1]: https://github.com/chaofanzhougit/GBSKernels/compare/v0.2.0...v0.2.1
92
+ [0.2.0]: https://github.com/chaofanzhougit/GBSKernels/compare/v0.1.1...v0.2.0
@@ -1,8 +1,8 @@
1
1
  cff-version: 1.2.0
2
2
  message: "If you use this software, please cite it as below."
3
3
  title: "GBSKernels: a GPU-native, batched library of photonic sampling matrix functions"
4
- version: 0.2.0
5
- date-released: 2026-07-22
4
+ version: 0.2.1
5
+ date-released: 2026-07-24
6
6
  license: Apache-2.0
7
7
  repository-code: "https://github.com/chaofanzhougit/GBSKernels"
8
8
  authors:
@@ -7,7 +7,9 @@ graft examples
7
7
  graft docs
8
8
  graft scripts
9
9
  graft envs
10
- include LICENSE README.md CHANGELOG.md CITATION.cff pyproject.toml
10
+ graft tests
11
+ graft results/jiuzhang/legacy_fixed_sample
12
+ include LICENSE README.md CHANGELOG.md CITATION.cff THIRD_PARTY_NOTICES.md pyproject.toml uv.lock
11
13
  prune core/build
12
14
  prune core/build_prof
13
15
  prune bindings/build
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gbskernels
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: GPU-native, batched library of photonic sampling matrix functions (hafnian, loop hafnian, permanent, torontonian).
5
5
  Author-email: Chaofan Zhou <chaofanzhou97@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -44,24 +44,31 @@ companion with an explicit accuracy characterization. The Walrus is used here as
44
44
  one of several independent test oracles.
45
45
 
46
46
  > **Status.** The CPU library is complete and `pip`-installable (pure Python,
47
- > `numpy` + `mpmath` only). Historical release validation covers NVIDIA hardware
48
- > (RTX 4090, A100); the v0.2 changes pass the CPU host-shim gates and still require
49
- > a fresh on-device validation session. This is pre-1.0 software and the public
50
- > API may change.
51
-
52
- Version 0.2.0 adds the fail-closed Jiuzhang confirmatory workflow and corrects
53
- the real threshold-torontonian construction used by the Jiuzhang examples. See
54
- the [changelog](CHANGELOG.md) for the release scope and compatibility notes.
47
+ > `numpy` + `mpmath` only). A v0.2.1 tag is released only with a clean-tree GPU
48
+ > validation manifest covering all 24 device gates, the Python binding smoke,
49
+ > adversarial and physical enclosure families, and the Jiuzhang Gate C probe.
50
+ > The manifest and its hash-bound evidence are attached to the GitHub release
51
+ > and identify the exact commit. Historical v0.2.0 RTX 4090 and A100 evidence is
52
+ > retained separately; see the [device evidence](results/README.md#v020-device-validation).
53
+ > This is pre-1.0 software and the public API may change.
54
+
55
+ Version 0.2.1 is a correctness patch that adds subnormal-aware certified bounds
56
+ and fail-closed certificate handling, makes the single-large real torontonian
57
+ input contract explicit, removes inversion roundoff skew from the xxpp
58
+ construction, records whether artifacts came from modified tracked sources,
59
+ and packages the corrected historical Jiuzhang fixed-sample audit. That audit
60
+ is exploratory, not a retrospective confirmatory result. See the
61
+ [changelog](CHANGELOG.md) for the release scope.
55
62
 
56
63
  ## Installation
57
64
 
58
- Not yet on PyPI; install from source. The CPU backend needs only `numpy` +
59
- `mpmath`; the CUDA extension is a separate, optional build (see
65
+ The CPU package is available from
66
+ [PyPI](https://pypi.org/project/gbskernels/0.2.1/) and needs only `numpy` +
67
+ `mpmath`. The CUDA extension is a separate, optional source build (see
60
68
  [`bindings/README.md`](bindings/README.md)):
61
69
 
62
70
  ```bash
63
- uv build # -> dist/gbskernels-*.whl, then pip install it
64
- # pip install gbskernels # planned once published to PyPI
71
+ python -m pip install gbskernels==0.2.1
65
72
  ```
66
73
 
67
74
  ## Quick start
@@ -103,7 +110,7 @@ implicit:
103
110
  | `"dd"` | Double-double arithmetic carried internally through the cancelling sum (a GPU tier); recovers a correct double-precision result where plain double precision cancels. |
104
111
  | `"ref"` | Arbitrary-precision reference (`mpmath`); the accuracy ground truth. |
105
112
  | `"auto"` | Double precision plus a per-evaluation cancellation indicator; evaluations flagged as risky are recomputed in a higher tier (`mpmath` on CPU, double-double on GPU). The indicator is a calibrated heuristic, not a certificate. |
106
- | `"certified"` | The double-precision value together with a **rigorous a-posteriori error bound**: `\|value − exact\| ≤ abs_error_bound`, a running error bound in the standard model of floating-point arithmetic (on the GPU, the bound arithmetic uses per-instruction directed rounding). Available for all four functions on CPU and GPU. With `rtol=`, a failed certified-fp64 bound escalates to the arbitrary-precision reference; GPU permanent and hafnian first try a certified double-double bound. The reference result is flagged as non-certified. `tor_single(..., dd=True)` provides a separate certified-double-double large-torontonian path. |
113
+ | `"certified"` | The double-precision value together with a **rigorous a-posteriori error bound**: `\|value − exact\| ≤ abs_error_bound`, including explicit absolute terms for subnormal underflow (on the GPU, bound arithmetic uses per-instruction directed rounding). Non-finite inputs and invalid/non-finite certificates fail closed. Available for all four functions on CPU and GPU. With `rtol=`, a failed or refused certified-fp64 result escalates to the arbitrary-precision reference; GPU permanent and hafnian first try a certified double-double bound. The reference result is flagged as non-certified. `tor_single(..., dd=True)` provides a separate certified-double-double large-torontonian path. |
107
114
 
108
115
  ## Features
109
116
 
@@ -161,6 +168,15 @@ The Jiuzhang v2 tooling adds workflow-contract tests for canonical hashing,
161
168
  registration timing, exclusion-ledger completeness, selection, immutable run
162
169
  reduction, refusal recovery, inference, reconstruction, and release assembly.
163
170
 
171
+ To run the public v0.2.1 GPU validation from a fresh clone, first stage the
172
+ small hash-bound inputs (the raw USTC and Zenodo archives remain
173
+ external; see [`THIRD_PARTY_NOTICES.md`](THIRD_PARTY_NOTICES.md) for data
174
+ attribution and licensing scope):
175
+
176
+ ```bash
177
+ python scripts/prepare_validation_data.py
178
+ ```
179
+
164
180
  The development discipline is CPU-first: host-shim-compatible CUDA kernels are
165
181
  compiled and run through the CPU pre-flight (part of the test suite), then the
166
182
  full source set is checked on-device against independent CPU references before
@@ -22,24 +22,31 @@ companion with an explicit accuracy characterization. The Walrus is used here as
22
22
  one of several independent test oracles.
23
23
 
24
24
  > **Status.** The CPU library is complete and `pip`-installable (pure Python,
25
- > `numpy` + `mpmath` only). Historical release validation covers NVIDIA hardware
26
- > (RTX 4090, A100); the v0.2 changes pass the CPU host-shim gates and still require
27
- > a fresh on-device validation session. This is pre-1.0 software and the public
28
- > API may change.
29
-
30
- Version 0.2.0 adds the fail-closed Jiuzhang confirmatory workflow and corrects
31
- the real threshold-torontonian construction used by the Jiuzhang examples. See
32
- the [changelog](CHANGELOG.md) for the release scope and compatibility notes.
25
+ > `numpy` + `mpmath` only). A v0.2.1 tag is released only with a clean-tree GPU
26
+ > validation manifest covering all 24 device gates, the Python binding smoke,
27
+ > adversarial and physical enclosure families, and the Jiuzhang Gate C probe.
28
+ > The manifest and its hash-bound evidence are attached to the GitHub release
29
+ > and identify the exact commit. Historical v0.2.0 RTX 4090 and A100 evidence is
30
+ > retained separately; see the [device evidence](results/README.md#v020-device-validation).
31
+ > This is pre-1.0 software and the public API may change.
32
+
33
+ Version 0.2.1 is a correctness patch that adds subnormal-aware certified bounds
34
+ and fail-closed certificate handling, makes the single-large real torontonian
35
+ input contract explicit, removes inversion roundoff skew from the xxpp
36
+ construction, records whether artifacts came from modified tracked sources,
37
+ and packages the corrected historical Jiuzhang fixed-sample audit. That audit
38
+ is exploratory, not a retrospective confirmatory result. See the
39
+ [changelog](CHANGELOG.md) for the release scope.
33
40
 
34
41
  ## Installation
35
42
 
36
- Not yet on PyPI; install from source. The CPU backend needs only `numpy` +
37
- `mpmath`; the CUDA extension is a separate, optional build (see
43
+ The CPU package is available from
44
+ [PyPI](https://pypi.org/project/gbskernels/0.2.1/) and needs only `numpy` +
45
+ `mpmath`. The CUDA extension is a separate, optional source build (see
38
46
  [`bindings/README.md`](bindings/README.md)):
39
47
 
40
48
  ```bash
41
- uv build # -> dist/gbskernels-*.whl, then pip install it
42
- # pip install gbskernels # planned once published to PyPI
49
+ python -m pip install gbskernels==0.2.1
43
50
  ```
44
51
 
45
52
  ## Quick start
@@ -81,7 +88,7 @@ implicit:
81
88
  | `"dd"` | Double-double arithmetic carried internally through the cancelling sum (a GPU tier); recovers a correct double-precision result where plain double precision cancels. |
82
89
  | `"ref"` | Arbitrary-precision reference (`mpmath`); the accuracy ground truth. |
83
90
  | `"auto"` | Double precision plus a per-evaluation cancellation indicator; evaluations flagged as risky are recomputed in a higher tier (`mpmath` on CPU, double-double on GPU). The indicator is a calibrated heuristic, not a certificate. |
84
- | `"certified"` | The double-precision value together with a **rigorous a-posteriori error bound**: `\|value − exact\| ≤ abs_error_bound`, a running error bound in the standard model of floating-point arithmetic (on the GPU, the bound arithmetic uses per-instruction directed rounding). Available for all four functions on CPU and GPU. With `rtol=`, a failed certified-fp64 bound escalates to the arbitrary-precision reference; GPU permanent and hafnian first try a certified double-double bound. The reference result is flagged as non-certified. `tor_single(..., dd=True)` provides a separate certified-double-double large-torontonian path. |
91
+ | `"certified"` | The double-precision value together with a **rigorous a-posteriori error bound**: `\|value − exact\| ≤ abs_error_bound`, including explicit absolute terms for subnormal underflow (on the GPU, bound arithmetic uses per-instruction directed rounding). Non-finite inputs and invalid/non-finite certificates fail closed. Available for all four functions on CPU and GPU. With `rtol=`, a failed or refused certified-fp64 result escalates to the arbitrary-precision reference; GPU permanent and hafnian first try a certified double-double bound. The reference result is flagged as non-certified. `tor_single(..., dd=True)` provides a separate certified-double-double large-torontonian path. |
85
92
 
86
93
  ## Features
87
94
 
@@ -139,6 +146,15 @@ The Jiuzhang v2 tooling adds workflow-contract tests for canonical hashing,
139
146
  registration timing, exclusion-ledger completeness, selection, immutable run
140
147
  reduction, refusal recovery, inference, reconstruction, and release assembly.
141
148
 
149
+ To run the public v0.2.1 GPU validation from a fresh clone, first stage the
150
+ small hash-bound inputs (the raw USTC and Zenodo archives remain
151
+ external; see [`THIRD_PARTY_NOTICES.md`](THIRD_PARTY_NOTICES.md) for data
152
+ attribution and licensing scope):
153
+
154
+ ```bash
155
+ python scripts/prepare_validation_data.py
156
+ ```
157
+
142
158
  The development discipline is CPU-first: host-shim-compatible CUDA kernels are
143
159
  compiled and run through the CPU pre-flight (part of the test suite), then the
144
160
  full source set is checked on-device against independent CPU references before
@@ -0,0 +1,27 @@
1
+ # Third-party validation data
2
+
3
+ The Apache-2.0 license for GBSKernels source code does not relicense the
4
+ third-party scientific data under `examples/jiuzhang/validation_data/`.
5
+
6
+ The files `click_probs_squeezed_0.npy` and
7
+ `click_probs_squashed_0.npy` are retained Jiuzhang 1.0 probability arrays from:
8
+
9
+ - Javier Martinez-Cifuentes, Karen Milena Fonseca-Romero, and Nicolas Quesada,
10
+ "Classical models are a better explanation of the Jiuzhang 1.0 Gaussian
11
+ Boson Sampler than its targeted squeezed light model," Zenodo record
12
+ [7194775](https://doi.org/10.5281/zenodo.7194775), licensed
13
+ [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/).
14
+
15
+ The files `T_full.npy`, `events_band13_32.npy`,
16
+ `squeezing parameters.txt`, and `empirical_click_rates.npy` are small derived
17
+ validation inputs from the Jiuzhang 1.0 data published by Han-Sen Zhong et al.:
18
+
19
+ - [Experimental raw data of "Quantum computational advantage using
20
+ photons"](https://quantum.ustc.edu.cn/web/en/node/915), University of Science
21
+ and Technology of China, 2020.
22
+
23
+ The USTC page makes the raw data publicly downloadable but does not state a
24
+ separate data license. These derived inputs are included for validation,
25
+ attribution, and reproducibility; no Apache-2.0 license is asserted over the
26
+ underlying USTC data. Every redistributed or derived file is bound to the
27
+ SHA-256 digest in `scripts/prepare_validation_data.py`.
@@ -77,6 +77,25 @@ def commit() -> str | None:
77
77
  return None
78
78
 
79
79
 
80
+ def git_state() -> dict[str, Any]:
81
+ """Record whether local tracked bytes are exactly represented by a commit."""
82
+ env_commit = os.environ.get("GBS_COMMIT", "").strip()
83
+ if env_commit:
84
+ return {"commit": env_commit, "tracked_dirty": None, "source": "GBS_COMMIT"}
85
+ try:
86
+ full = subprocess.run(
87
+ ["git", "rev-parse", "HEAD"], capture_output=True, text=True, timeout=10
88
+ ).stdout.strip()
89
+ if not full:
90
+ return {"commit": None, "tracked_dirty": None, "source": "unavailable"}
91
+ dirty = subprocess.run(
92
+ ["git", "diff", "--quiet", "HEAD", "--"], timeout=10
93
+ ).returncode != 0
94
+ return {"commit": full, "tracked_dirty": dirty, "source": "git"}
95
+ except Exception:
96
+ return {"commit": None, "tracked_dirty": None, "source": "unavailable"}
97
+
98
+
80
99
  def container_digest() -> str | None:
81
100
  """The pinned container image digest the run was launched from (or None)."""
82
101
  env = os.environ.get("GBS_CONTAINER_DIGEST", "").strip()
@@ -95,8 +114,10 @@ def container_digest() -> str | None:
95
114
  def provenance() -> dict[str, Any]:
96
115
  """The common provenance block embedded in every artifact (commit + container digest +
97
116
  machine environment), so a result reproduces from the file alone (docs/DESIGN.md §9)."""
117
+ state = git_state()
98
118
  return {
99
119
  "commit": commit(),
120
+ "git": state,
100
121
  "container_digest": container_digest(),
101
122
  "hostname": platform.node() or None,
102
123
  "captured_utc": datetime.now(timezone.utc).isoformat(),
@@ -28,6 +28,14 @@ and run on the CPU (`core/preflight/`, exercised by the test suite via
28
28
  against independent CPU references. Device-only variants, including
29
29
  `permanent_warp.cu`, are validated in the CUDA session rather than the host shim.
30
30
 
31
+ **Certified arithmetic is relative-plus-absolute.** Every recurrence includes
32
+ an explicit binary64 subnormal floor, and mixed-scale products propagate that
33
+ absolute error through later factors. Double-double division and square root
34
+ are bounded from outward FMA residuals of the values actually returned rather
35
+ than assumed forward constants. Unsafe division ranges and any non-finite or
36
+ negative certificate refuse instead of producing a finite claim; see
37
+ [`docs/dd_certificate_proof.md`](../docs/dd_certificate_proof.md).
38
+
31
39
  **Execution model.** The default kernels evaluate one instance per thread and
32
40
  batch across the grid. Only the permanent uses the Gray-code delta walk; the
33
41
  hafnian, loop hafnian, and torontonian enumerate the `2^k` subsets independently,
@@ -41,7 +49,8 @@ inputs.
41
49
  **Size limits** (fixed per-thread buffers): permanent ≤ 28, hafnian ≤ 20 (double-
42
50
  double ≤ 16), loop hafnian ≤ 20 (double-double ≤ 14), torontonian 2n ≤ 24; larger
43
51
  inputs are rejected at the Python boundary. The single-large recursive torontonian
44
- extends to dimension 64.
52
+ extends to dimension 64 and requires a finite matrix that is exactly symmetric
53
+ after conversion to binary64, because its Cholesky walk consumes one triangle.
45
54
 
46
55
  ### Build and run
47
56