ramanujan-qft 0.3.0a4__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 (118) hide show
  1. ramanujan_qft-0.3.0a4/AUDIT.md +207 -0
  2. ramanujan_qft-0.3.0a4/CHANGELOG.md +170 -0
  3. ramanujan_qft-0.3.0a4/CITATION.cff +17 -0
  4. ramanujan_qft-0.3.0a4/CONTRIBUTING.md +64 -0
  5. ramanujan_qft-0.3.0a4/LICENSE +21 -0
  6. ramanujan_qft-0.3.0a4/MANIFEST.in +20 -0
  7. ramanujan_qft-0.3.0a4/PKG-INFO +337 -0
  8. ramanujan_qft-0.3.0a4/README.md +308 -0
  9. ramanujan_qft-0.3.0a4/THIRD_PARTY_NOTICES.md +14 -0
  10. ramanujan_qft-0.3.0a4/benchmarks/bench_fair.py +58 -0
  11. ramanujan_qft-0.3.0a4/benchmarks/bench_release.py +123 -0
  12. ramanujan_qft-0.3.0a4/benchmarks/bench_vs_scipy.py +36 -0
  13. ramanujan_qft-0.3.0a4/benchmarks/data/release_comparison.json +234 -0
  14. ramanujan_qft-0.3.0a4/benchmarks/data/sunset_audit.json +953 -0
  15. ramanujan_qft-0.3.0a4/benchmarks/data/sunset_budgets.json +321 -0
  16. ramanujan_qft-0.3.0a4/benchmarks/looptools/compare_looptools.sh +30 -0
  17. ramanujan_qft-0.3.0a4/benchmarks/looptools/timing_driver.F +30 -0
  18. ramanujan_qft-0.3.0a4/docs/CAPABILITIES.md +60 -0
  19. ramanujan_qft-0.3.0a4/docs/COMPARISON.md +189 -0
  20. ramanujan_qft-0.3.0a4/docs/PRIOR_ART.md +159 -0
  21. ramanujan_qft-0.3.0a4/docs/RELEASE_PLAN.md +81 -0
  22. ramanujan_qft-0.3.0a4/docs/RELEASING.md +157 -0
  23. ramanujan_qft-0.3.0a4/docs/SCIENTIFIC_REVIEW.md +115 -0
  24. ramanujan_qft-0.3.0a4/docs/_static/custom.css +18 -0
  25. ramanujan_qft-0.3.0a4/docs/_static/try_it.css +92 -0
  26. ramanujan_qft-0.3.0a4/docs/_static/try_it.js +341 -0
  27. ramanujan_qft-0.3.0a4/docs/_static/try_it_worker.js +99 -0
  28. ramanujan_qft-0.3.0a4/docs/api/index.md +94 -0
  29. ramanujan_qft-0.3.0a4/docs/api/legacy.md +60 -0
  30. ramanujan_qft-0.3.0a4/docs/api/mellin.md +36 -0
  31. ramanujan_qft-0.3.0a4/docs/api/multiloop.md +20 -0
  32. ramanujan_qft-0.3.0a4/docs/api/one_loop.md +19 -0
  33. ramanujan_qft-0.3.0a4/docs/api/rmt.md +14 -0
  34. ramanujan_qft-0.3.0a4/docs/api/sunset.md +16 -0
  35. ramanujan_qft-0.3.0a4/docs/api/sunset_rmt.md +12 -0
  36. ramanujan_qft-0.3.0a4/docs/api/sunset_taylor.md +9 -0
  37. ramanujan_qft-0.3.0a4/docs/changelog.md +2 -0
  38. ramanujan_qft-0.3.0a4/docs/citing.md +87 -0
  39. ramanujan_qft-0.3.0a4/docs/conf.py +75 -0
  40. ramanujan_qft-0.3.0a4/docs/getting_started/index.md +8 -0
  41. ramanujan_qft-0.3.0a4/docs/getting_started/installation.md +111 -0
  42. ramanujan_qft-0.3.0a4/docs/getting_started/quickstart.md +196 -0
  43. ramanujan_qft-0.3.0a4/docs/index.md +191 -0
  44. ramanujan_qft-0.3.0a4/docs/requirements.txt +9 -0
  45. ramanujan_qft-0.3.0a4/docs/try_it.md +69 -0
  46. ramanujan_qft-0.3.0a4/docs/user_guide/conventions.md +132 -0
  47. ramanujan_qft-0.3.0a4/docs/user_guide/index.md +15 -0
  48. ramanujan_qft-0.3.0a4/docs/user_guide/mellin.md +347 -0
  49. ramanujan_qft-0.3.0a4/docs/user_guide/multiloop.md +212 -0
  50. ramanujan_qft-0.3.0a4/docs/user_guide/one_loop.md +234 -0
  51. ramanujan_qft-0.3.0a4/docs/user_guide/precision.md +169 -0
  52. ramanujan_qft-0.3.0a4/docs/user_guide/rmt.md +295 -0
  53. ramanujan_qft-0.3.0a4/docs/user_guide/sunset.md +178 -0
  54. ramanujan_qft-0.3.0a4/docs/user_guide/sunset_rmt.md +303 -0
  55. ramanujan_qft-0.3.0a4/docs/user_guide/sunset_taylor.md +92 -0
  56. ramanujan_qft-0.3.0a4/docs/validation.md +145 -0
  57. ramanujan_qft-0.3.0a4/examples/01_ramanujan_master_theorem.py +28 -0
  58. ramanujan_qft-0.3.0a4/examples/02_mellin_products.py +36 -0
  59. ramanujan_qft-0.3.0a4/examples/03_one_loop_integrals.py +25 -0
  60. ramanujan_qft-0.3.0a4/examples/04_sunset_dispersion.py +18 -0
  61. ramanujan_qft-0.3.0a4/examples/05_multiloop_graphs.py +28 -0
  62. ramanujan_qft-0.3.0a4/examples/06_sunset_rmt.py +29 -0
  63. ramanujan_qft-0.3.0a4/examples/07_sunset_taylor.py +18 -0
  64. ramanujan_qft-0.3.0a4/examples/GALLERY_HEADER.rst +6 -0
  65. ramanujan_qft-0.3.0a4/notebooks/quickstart.ipynb +241 -0
  66. ramanujan_qft-0.3.0a4/notebooks/research_alpha.ipynb +249 -0
  67. ramanujan_qft-0.3.0a4/pyproject.toml +42 -0
  68. ramanujan_qft-0.3.0a4/ramanujan_qft/__init__.py +32 -0
  69. ramanujan_qft-0.3.0a4/ramanujan_qft/brackets.py +126 -0
  70. ramanujan_qft-0.3.0a4/ramanujan_qft/core/__init__.py +3 -0
  71. ramanujan_qft-0.3.0a4/ramanujan_qft/core/dispersion_mob.py +65 -0
  72. ramanujan_qft-0.3.0a4/ramanujan_qft/core/mob_dynamic_engine.py +159 -0
  73. ramanujan_qft-0.3.0a4/ramanujan_qft/core/ramanujan_framework.py +70 -0
  74. ramanujan_qft-0.3.0a4/ramanujan_qft/mellin.py +811 -0
  75. ramanujan_qft-0.3.0a4/ramanujan_qft/multiloop.py +394 -0
  76. ramanujan_qft-0.3.0a4/ramanujan_qft/one_loop.py +584 -0
  77. ramanujan_qft-0.3.0a4/ramanujan_qft/rmt.py +238 -0
  78. ramanujan_qft-0.3.0a4/ramanujan_qft/solvers/__init__.py +1 -0
  79. ramanujan_qft-0.3.0a4/ramanujan_qft/solvers/feynman_mob_solver.py +155 -0
  80. ramanujan_qft-0.3.0a4/ramanujan_qft/sunset.py +299 -0
  81. ramanujan_qft-0.3.0a4/ramanujan_qft/sunset_rmt.py +327 -0
  82. ramanujan_qft-0.3.0a4/ramanujan_qft/sunset_taylor.py +162 -0
  83. ramanujan_qft-0.3.0a4/ramanujan_qft/utils/__init__.py +2 -0
  84. ramanujan_qft-0.3.0a4/ramanujan_qft/utils/mob_convergence_filter.py +171 -0
  85. ramanujan_qft-0.3.0a4/ramanujan_qft/utils/ramanujan_continuation.py +79 -0
  86. ramanujan_qft-0.3.0a4/ramanujan_qft.egg-info/PKG-INFO +337 -0
  87. ramanujan_qft-0.3.0a4/ramanujan_qft.egg-info/SOURCES.txt +116 -0
  88. ramanujan_qft-0.3.0a4/ramanujan_qft.egg-info/dependency_links.txt +1 -0
  89. ramanujan_qft-0.3.0a4/ramanujan_qft.egg-info/requires.txt +13 -0
  90. ramanujan_qft-0.3.0a4/ramanujan_qft.egg-info/top_level.txt +1 -0
  91. ramanujan_qft-0.3.0a4/setup.cfg +4 -0
  92. ramanujan_qft-0.3.0a4/setup.py +4 -0
  93. ramanujan_qft-0.3.0a4/tests/conftest.py +29 -0
  94. ramanujan_qft-0.3.0a4/tests/data/looptools_reference.csv +24 -0
  95. ramanujan_qft-0.3.0a4/tests/data/sunset_rmt_reference.json +49 -0
  96. ramanujan_qft-0.3.0a4/tests/test_legacy_api.py +67 -0
  97. ramanujan_qft-0.3.0a4/tests/test_mellin.py +87 -0
  98. ramanujan_qft-0.3.0a4/tests/test_mellin_regressions.py +153 -0
  99. ramanujan_qft-0.3.0a4/tests/test_multiloop.py +285 -0
  100. ramanujan_qft-0.3.0a4/tests/test_one_loop.py +157 -0
  101. ramanujan_qft-0.3.0a4/tests/test_publisher_preflight.py +61 -0
  102. ramanujan_qft-0.3.0a4/tests/test_report_reproducibility.py +31 -0
  103. ramanujan_qft-0.3.0a4/tests/test_rmt.py +43 -0
  104. ramanujan_qft-0.3.0a4/tests/test_round2_regressions.py +221 -0
  105. ramanujan_qft-0.3.0a4/tests/test_round3_regressions.py +132 -0
  106. ramanujan_qft-0.3.0a4/tests/test_sunset.py +74 -0
  107. ramanujan_qft-0.3.0a4/tests/test_sunset_audit.py +17 -0
  108. ramanujan_qft-0.3.0a4/tests/test_sunset_rmt.py +249 -0
  109. ramanujan_qft-0.3.0a4/tests/test_sunset_taylor.py +111 -0
  110. ramanujan_qft-0.3.0a4/tools/audit_sunset.py +161 -0
  111. ramanujan_qft-0.3.0a4/tools/audit_sunset_budgets.py +74 -0
  112. ramanujan_qft-0.3.0a4/tools/check_browser_console.py +131 -0
  113. ramanujan_qft-0.3.0a4/tools/check_doc_snippets.py +120 -0
  114. ramanujan_qft-0.3.0a4/tools/check_notebook.py +40 -0
  115. ramanujan_qft-0.3.0a4/tools/check_pypi_publisher.py +72 -0
  116. ramanujan_qft-0.3.0a4/tools/check_release_metadata.py +31 -0
  117. ramanujan_qft-0.3.0a4/tools/generate_sunset_rmt_references.py +45 -0
  118. ramanujan_qft-0.3.0a4/tools/smoke_release.py +69 -0
@@ -0,0 +1,207 @@
1
+ # Pre-release audit (October 2026)
2
+
3
+ This file records what was checked before making the repository public, how it
4
+ was checked, what was found, and what was changed. Every number below can be
5
+ reproduced with the scripts in `tests/` and `benchmarks/`.
6
+
7
+ ## How the code was checked
8
+
9
+ * **LoopTools 2.16** (the vendored copy, built with gfortran) as the reference
10
+ for one-loop integrals: values in `tests/data/looptools_reference.csv`.
11
+ * **Independent integrations** written from first principles: Feynman-parameter
12
+ integrals with the inner integration done analytically (mpmath), and 2-D
13
+ Feynman-parameter integrals for the two-loop sunset (SciPy).
14
+ * **Several working precisions** (15, 30, 50/60 digits). A correct method must
15
+ give the same answer at every precision.
16
+ * **A clean install** of the package outside the repository, in a fresh venv.
17
+
18
+ ## Findings in version 0.1 and their status
19
+
20
+ | # | Component | Finding | Evidence | Status in 0.2 |
21
+ |---|-----------|---------|----------|---------------|
22
+ | 1 | Packaging | `import ramanujan_qft` failed after installation: `core/ramanujan_framework.py` imported `feynman_atlas`, a file in the repository root that is not part of the package. | `ModuleNotFoundError: feynman_atlas` in a clean environment | **Fixed.** `pyproject.toml` added; clean venv install tested |
23
+ | 2 | `solve_B0_standard`, equal-mass `solve_C0_standard` above threshold | A hard-coded regulator `delta = 1e-30` combined with the precision setting gave correct values only for `precision >= 50`. At 30 digits B0(1;1,1) returned -0.375 instead of -0.391, and C0(0,0,5;1,1,1) was off by 0.11. At 15 digits it crashed with "gamma function pole". | `tests/test_legacy_api.py`, `tests/test_one_loop.py` | **Fixed.** Exact closed forms, correct at every precision |
24
+ | 3 | `solve_B0_standard` convention | The finite part differs from LoopTools by exactly -γ_E (RAF -0.39102 vs LoopTools +0.18620 at p²=1). The README stated a perfect match with LoopTools. | LoopTools run | **Documented.** The legacy method keeps its convention; the new `one_loop.B0` uses LoopTools conventions |
25
+ | 4 | Unequal-mass C0 | **Correct.** Matches LoopTools and the independent integration to working precision, including degenerate masses. | `tests/test_one_loop.py` | Kept (moved to `one_loop.C0`) |
26
+ | 5 | `massive_sunset_residue`, Euclidean branch | Integrated `F/U^3` over the simplex. That is not the sunset finite part: it is linear in p² by construction and jumps from 466 to 1.4 across threshold. | Discontinuity test | **Withdrawn** (raises `NotImplementedError`) |
27
+ | 6 | Sunset Im part (`phase_space_3body`) | Correct shape, but the prefactor was π/(16s) instead of π/s, and the sign was flipped. This is the "16× normalisation discovery" in `global_sunset_benchmark.py`: it is a bug, not a new effect. | Ratio is exactly 16.000000 against the Feynman-parameter Im part | **Fixed** in `sunset.sunset_im` |
28
+ | 7 | Sunset real part (`sunset_real_dispersion`) | Fixed placeholder subtraction constants `s0 = -0.5`, `s1 = 0.1`. The dispersion integral ran straight through the pole at t = s (no principal value). | Source | **Replaced** by `sunset.sunset_subtracted`, validated to 1e-11 to 1e-14 against Feynman parameters |
29
+ | 8 | `solve_P126` | Hard-coded log coefficients and a fixed +iπ phase, which gives a spurious imaginary part in the Euclidean region. Does not reproduce the target -1.039367 printed by the module itself (returns 0.5617+0.1401i). | Run | **Withdrawn** |
30
+ | 9 | `solve_graph_polynomials`, `solve_elliptic_kite`, `solve_double_box_inv`, `solve_triangle3L` | The "topology parser" classifies by polynomial degree. The kite and double box were routed to the sunset with masses (1,2,3) regardless of input: changing s,t from (-3,-2) to (-30,-99) changed the "double box" only through the sunset quadrature. The 3-loop triangle and any user polynomial returned exactly 0. The "elliptic" series was an ad hoc expression. | `PolynomialStructuralParser.identify` output | **Withdrawn** |
31
+ | 10 | `MoBDynamicEngine` | Analyses the bracket matrix, then returns `complex(0)`. | Source | **Raises** `NotImplementedError` |
32
+ | 11 | `solve_bessel_exp_product` | Returned 0 for every input (the residue formula evaluated Γ at its poles, and a bare `except` returned 0). | `(3,4) -> 0.0` instead of 0.2 | **Fixed** via `mellin.product_integral` |
33
+ | 12 | RACE (`solve_product`) | Correct for exp × J0 / Gaussian away from the convergence boundary. Near it, accuracy degraded silently: exp(-3x)J0(4x) gave 0.2000042 instead of 0.2. Errors were returned as strings. Poles from the large-x expansion of a factor were ignored, so factors such as 1/(x+m) gave wrong results. | Closed forms | **Rewritten:** both expansions, convergence control, pole collisions, exceptions |
34
+ | 13 | Speed claims ("O(1)", faster than LoopTools) | LoopTools: C0 ≈ 24 µs, B0 ≈ 0.8 µs per call. RAF 0.1: C0 ≈ 22 ms, B0 up to 4.5 ms. 0.2 (precision-checked): C0 ≈ 11 ms, B0 ≈ 0.27 ms. Evaluation is not O(1) in any meaningful sense: it calls special functions and series of growing length. | `benchmarks/looptools/compare_looptools.sh` | **Claims removed** from README |
35
+ | 14 | pySecDec "fails at the branch cut" (C0 table) | The value -0.1474950302 is not a pySecDec limitation. LoopTools and the independent integration both give -0.4219-0.3367i, and pySecDec handles this case with contour deformation. The run was most likely misconfigured (parameter order or missing contour deformation). | — | **Claim removed** |
36
+ | 15 | Tests | The `test_*.py` files in the root contained no assertions. Some printed hard-coded "Target" values for competitors. | Source | **New suite** in `tests/`: 311 tests |
37
+ | 16 | Benchmark scripts in the root | Require pySecDec libraries that are not in the repository (`RECREATION/`, `pysecdec_*`). Several print fixed reference numbers and labels such as "Competitor Killer". | Source | **Left untouched;** listed below for you to decide |
38
+
39
+ ## Originality review
40
+
41
+ A literature review (references checked online or against local copies) found
42
+ that RACE and the other methods in the package are **classical**. Credit goes
43
+ to Hardy, Marichev and Adamchik–Marichev, Slater, Fikioris, SymPy
44
+ `meijerint`, mpmath `meijerg`, Gonzalez–Moll–Schmidt, Prausa,
45
+ Ananthanarayan–Banik–Friot–Ghosh and others. No copied code was found. The
46
+ contribution is the implementation. See [docs/PRIOR_ART.md](docs/PRIOR_ART.md).
47
+
48
+ ## RACE (Mellin residue engine): two adversarial audits
49
+
50
+ Each round used independent hunters that tried to break the engine with
51
+ about 2,000–4,000 cases checked against closed forms (DLMF, Gradshteyn–Ryzhik,
52
+ SymPy) and independent quadratures (contour rotation, Gauss–Legendre,
53
+ QUADPACK). Separate agents then reproduced every claimed defect with a
54
+ different method.
55
+
56
+ **Round 1 (19 confirmed defects in the first rewrite), all fixed:**
57
+
58
+ * Invalid contour closures: the asymptotic "expand the Gaussian" series
59
+ returned silent zeros, e.g. ∫e^(−x²)cos x dx = 0.
60
+ * Wrong branch of the Weber–Schafheitlin discontinuous integrals.
61
+ * Divergent integrals returned as finite numbers.
62
+ * Uncompensated cancellation, losing 7–10 digits.
63
+ * Near pole collisions accepted with errors up to 10¹³.
64
+ * Tiny results accepted with only absolute accuracy.
65
+ * Parameters frozen at 15 digits.
66
+ * A dead `nsum` fallback.
67
+ * A leaked private exception.
68
+ * Quadratic-time summation.
69
+
70
+ **Round 2 (28 confirmed defects after the fixes), all fixed:**
71
+
72
+ *RACE:*
73
+
74
+ * Inputs within 10⁻¹⁶ of a lattice point (e.g. s = 10⁻⁴⁰, ν = 10⁻²⁵) were rounded,
75
+ returning 0. Inputs are now represented exactly.
76
+ * A late peak of the terms (`gaussian_bessel`) stopped the summation early. An
77
+ a-priori peak estimate now guards the stopping rule.
78
+ * An over-optimistic Wynn-ε error estimate. Wynn is now used only for
79
+ alternating series, with disjoint-window checks.
80
+ * Collisions near a singularity of I(s). The step δ is now scaled to the
81
+ distance from the singularity, with Richardson extrapolation.
82
+ * Equal-frequency integrals with a vanishing beat term were called divergent.
83
+ The strip check now uses the asymptotic phases.
84
+ * The precision cap gave up too early, with a misleading message.
85
+ * A raw mpmath `NoConvergence` leaked out.
86
+ * `error_estimate` ignored the final rounding.
87
+
88
+ *One-loop and sunset:*
89
+
90
+ * Catastrophic cancellation in B0 and C0 at extreme kinematics: B0(10⁻¹²; 1, 10⁶)
91
+ was 330% off. All one-loop functions are now certified by two-precision agreement.
92
+ * C0 raised ZeroDivisionError at regular points.
93
+ * The all-massless sunset returned an undefined quantity.
94
+ * A quadrature node landing on t = s caused a crash.
95
+ * The massless D=3 bubble crashed.
96
+
97
+ *Helpers and tests:*
98
+
99
+ * `mellin_numeric` accepted integrals divergent at x = 0.
100
+ * A complex-z misuse of the 2F1 continuation gave the wrong branch.
101
+ * The legacy HCF series summation was inaccurate.
102
+ * Missing input validation.
103
+ * Test-suite flaws: a vacuous symmetry test, a wrong reference constant, a wrong
104
+ closed form in a comment.
105
+
106
+ Final random sweeps: every result was either correct to the requested
107
+ accuracy or a raised `SeriesConvergenceError` / `ValueError`. **No silent wrong
108
+ result remained.** Known, documented refusals: the convergence boundary ρ = 1
109
+ (e.g. e^(−x) J₀(x), equal-scale products), fixed-sign series with ρ very close
110
+ to 1, and cases needing more than `max_terms` terms. All 47 cases are
111
+ regression tests (`tests/test_mellin_regressions.py`,
112
+ `tests/test_round2_regressions.py`).
113
+
114
+ ## Round 3: one-loop and sunset
115
+
116
+ A third round targeted silent wrong results only.
117
+
118
+ **One-loop functions: no silent wrong result.**
119
+
120
+ * 1,820 random B0 / C0 / bubble_3d / B0_mob / C0_mob cases were checked at 15, 30
121
+ and 50 digits, with masses from 10⁻¹² to 10¹², thresholds and pseudo-thresholds
122
+ included.
123
+ * 1,740 cases at s = 0 were checked.
124
+ * A 24,000-point comparison against LoopTools was run.
125
+ * At the extreme hierarchies where the two disagreed, LoopTools (double precision)
126
+ was the one in error. The package agreed with 90-digit independent quadrature.
127
+
128
+ **Defects found, all fixed:**
129
+
130
+ * **`sunset_im`.** It suffered catastrophic cancellation near threshold and
131
+ could return 0 there. It also gave precision-independent errors at small
132
+ scales, because mpmath's quadrature tolerance is absolute. It now uses exact
133
+ homogeneity scaling, factored Källén functions with an endpoint-free
134
+ substitution, error-checked quadrature and a two-precision check.
135
+ * **`sunset_subtracted` / `sunset_d2`.** These were up to 22% wrong at scales
136
+ around 10¹², and wrong at small scales and large |s|/th. They are now scaled
137
+ to the threshold, use a 1/t tail map, normalise each integrand, and are
138
+ certified. They are validated against a closed form for masses (0, 0, M).
139
+ * **C0 with a massless internal line.** It was refused with a false "IR
140
+ divergent" message. IR-finite configurations are now supported through a
141
+ general imaginary part with clipped roots. Only the truly divergent cases
142
+ (m1 = m2 = 0 or m2 = m3 = 0) raise.
143
+ * **C0 at s = 0.** An unchecked quadrature fooled the certification for masses
144
+ ≳ 2¹⁴⁰. It is replaced by the exact divided-difference closed form.
145
+ * **Non-finite inputs.** These are now rejected with `ValueError`. Previously one
146
+ call ran for more than 14 minutes.
147
+ * **Docs.** The "exact" wording for numerical sunset values, a mis-rounded
148
+ LoopTools example and stale test counts were corrected.
149
+
150
+ **Cost.** Certified `sunset_subtracted` / `sunset_d2` take about 10 s per value
151
+ (up to ~40 s for |s| ≫ threshold).
152
+
153
+ ## Round 3: RACE
154
+
155
+ The first two RACE hunters were stopped by usage limits, so the round was
156
+ completed by a smaller, bounded run: one hunter and one independent reproducer.
157
+
158
+ **Defect from the interrupted hunter (fixed).** For (x+m)^(−v) with v ≫ k·m, the
159
+ residue terms dip and then peak again near n ≈ v. The stopping rule fired in the
160
+ dip, so wrong values were returned silently: relative errors up to 10²¹ while
161
+ claiming 10⁻¹⁶. The a-priori peak estimate now includes the Gamma-argument
162
+ offsets |s|, v and |ν|. The hunter's lead maps now pass:
163
+
164
+ | Map | Before | After |
165
+ |---|---|---|
166
+ | exp × inverse_power, large v | 34 + 21 bad | 0 bad of 288 |
167
+ | hump / inverse-power-pair scans | 18 + 2 bad | 0 bad |
168
+ | exp × ip and ip × ip at 15/30/50 digits | 60 bad (at 50 digits) | 0 bad of 2,880 |
169
+
170
+ **Bounded hunter: 785 cases.** 700 correct and 31 honest refusals. No silent
171
+ error for large Bessel orders (up to 200), large or complex s (|Im s| up to 400),
172
+ inverse-power pairs with large v, `gaussian_bessel` with large ν, Wynn on growing
173
+ alternating series, `continuation=True`, exact and near collisions, or the
174
+ legacy engines. It found two defects, both confirmed by the reproducer with
175
+ independent closed forms, and both fixed:
176
+
177
+ 1. **Long decimal-string s next to a pole of I(s).** Up to 1.4% error at dps 15.
178
+ String inputs are now sized by their digits and the requested precision.
179
+ 2. **Strip edges frozen at construction precision.** For string ν or v, some
180
+ divergent integrals returned values, and one existing integral was reported
181
+ divergent. The strip is now computed from the raw parameters at
182
+ input-sized precision.
183
+
184
+ Regression tests for all of these are in `tests/test_round3_regressions.py`.
185
+
186
+ ## Repository hygiene: cleanup completed
187
+
188
+ The research-alpha cleanup removed obsolete material from the current tree:
189
+
190
+ - Vendored third-party source trees, tarballs and compiled drivers. The maintained
191
+ `benchmarks/looptools/compare_looptools.sh` downloads LoopTools when requested.
192
+ - Generated `HEAD_TO_HEAD/` SecDec runs, backups and executables, and the local
193
+ `secdec3_local` checkout.
194
+ - Downloaded reference PDFs, personal notes, old benchmark plots, superseded
195
+ paper/results drafts and the exploratory Minkowski strategy note.
196
+ - Root-level experimental scripts and old benchmark/test drivers, plus `runners/`
197
+ and `scratch/`. Supported examples are in `examples/`; maintained benchmarks
198
+ are in `benchmarks/` and regression tests are in `tests/`.
199
+
200
+ The numerical package, tested legacy compatibility interfaces, independent
201
+ reference fixtures, current audit report and reproduction tools are retained.
202
+ Original scientific findings above remain part of the audit record, including
203
+ historical filenames and withdrawn claims.
204
+
205
+ This cleanup does not rewrite Git history: earlier commits still contain the
206
+ removed files. A local archive was also made before removal. Copyright-holder
207
+ metadata and any future history rewrite are separate from this cleanup.
@@ -0,0 +1,170 @@
1
+ # Changelog
2
+
3
+ ## Unreleased
4
+
5
+ ## 0.3.0a4 — research alpha
6
+
7
+ - Address all six nonblocking findings in the supplementary review of 0.3.0a2;
8
+ retain the original report and its scope with the release evidence.
9
+ - Make audit and benchmark reports work from source archives without Git,
10
+ using source SHA-256 hashes as the binding provenance identifiers.
11
+ - Replace ambiguous numerical “certified” claims with precision checks and
12
+ explain the dimension-independent zero in the sunset Gamma families.
13
+ - Publish measured default-budget coverage at 10, 20 and 30 digits, with
14
+ accurate values and typed budget refusals reported separately.
15
+ - Validate product benchmarks against a separate Gaussian Fourier/angular
16
+ representation, then regenerate the accuracy-checked measurements.
17
+ - Credit Reetamshu consistently in package and citation metadata.
18
+ - Numerical algorithms and documented domains are unchanged from 0.3.0a2.
19
+
20
+ ## 0.3.0a3 — replacement TestPyPI release
21
+
22
+ - Restore TestPyPI availability after the earlier releases were accidentally
23
+ deleted. A new version is required because deleted filenames cannot be reused.
24
+ - Use `publish.yml` and the protected `pypi` environment for TestPyPI uploads,
25
+ matching the replacement trusted publisher. Manual uploads target only
26
+ TestPyPI and require full validation and an installation check.
27
+ - Authentication diagnostics now select PyPI or TestPyPI explicitly and report
28
+ allowlisted rejection codes without exposing credentials.
29
+ - Numerical algorithms are unchanged from 0.3.0a2. Review and production PyPI publication were pending at preparation time.
30
+
31
+ ## 0.3.0a2 — historical TestPyPI rehearsal (files subsequently deleted)
32
+
33
+ - Fixed browser startup by loading Pyodide's compiled NumPy before importing
34
+ the package, including custom dependency-wheel configurations.
35
+ - Added browser examples for graph-derived sunset RMT and equal-mass Taylor
36
+ evaluation, and real Chromium checks for examples, references and reset.
37
+ - Added a reproducible 30-digit comparison with three mpmath quadrature
38
+ methods, raw timings, source hashes and explicit accuracy failures.
39
+ Historical one-loop timings are labelled separately; unsupported broad
40
+ rankings were removed.
41
+ - Added production publisher authentication preflight without upload, plus
42
+ an installation check outside the checkout after production publication.
43
+ - Refreshed candidate metadata and the independent-parameter audit. External
44
+ scientific review remains pending; automated validation is not peer review.
45
+
46
+ ## 0.3.0a1 — TestPyPI rehearsal (not published to production PyPI)
47
+
48
+ ### Equal-mass continuation and release preparation
49
+ - Added a separate D=2 equal-mass transformed Taylor series for vacuum and
50
+ finite Euclidean momentum, with an analytic tail bound and precision control
51
+ for the unstable coefficient recurrence. RMT calls retain their own domains.
52
+ - Added a reproducible independent-parameter audit, capability table, scientific
53
+ review packet, research notebook and contribution instructions.
54
+ - Publication now depends on tests, numerical audit, docs/notebook checks and
55
+ installed wheel/sdist checks across Linux, Windows and macOS. Added a manual
56
+ TestPyPI rehearsal. Hosted candidate checks passed; external review and
57
+ publication remain pending.
58
+
59
+ ### Repository cleanup
60
+ - Removed obsolete root scripts, superseded plots/results drafts, generated
61
+ SecDec runs, vendored tools, binaries and downloaded PDFs from the current tree.
62
+ - Retained the supported package and compatibility APIs, current examples,
63
+ maintained benchmarks, independent fixtures and reproducible audit report.
64
+ - Updated ignore rules and packaging so generated output stays outside version
65
+ control and the source distribution contains the maintained reproduction files.
66
+ - Git history is preserved; this cleanup is not a history rewrite.
67
+
68
+ ### Multivariate Ramanujan sunset series
69
+ - Added exact Schwinger bracket matrices and basis solving with inspectable
70
+ Gamma-function summands; nonsingularity makes no convergence claim.
71
+ - Added `compile_sunset_rmt` and `integrate_graph_rmt` for the massive,
72
+ unit-power two-loop sunset in D=2. The momentum-dominant and mass-dominant
73
+ Euclidean charts have explicit sufficient convergence domains.
74
+ - Resolved coalescing poles analytically into logarithms and harmonic numbers.
75
+ Evaluation uses arbitrary-precision series summation, an analytic tail bound,
76
+ precision checks and bounded work, with no numerical integration fallback.
77
+ - Added independent 40/55-digit simplex references, regulated Gamma-family
78
+ checks, boundary/budget tests, and comparisons with the hybrid graph backend.
79
+ Equal-mass vacuum and the gap between charts remain explicitly unsupported.
80
+
81
+ ### Multiloop graphs
82
+ - Added immutable `ScalarEdge` and `ScalarGraph` objects with exact Symanzik
83
+ polynomials, conserved Euclidean external vectors, graph-derived loop counts,
84
+ and UV power counting over all cyclic edge subsets.
85
+ - Added experimental `integrate_graph`: RMT integration of the Schwinger scale,
86
+ factored Hepp sectors with smooth boundary maps, and replicated scrambled
87
+ Sobol integration. Supports convergent massive scalar graphs and positive
88
+ fractional powers/dimension, subject to explicit work budgets.
89
+ - Added `MultiloopResult` statistical diagnostics and strict convergence failure
90
+ via `MultiloopConvergenceError`; SciPy is an optional `multiloop` extra.
91
+ - Added independent one- through four-loop checks, a graph example, and a guide
92
+ documenting Euclidean normalization and the remaining path to general
93
+ multivariate RMT, regulator expansions, and physical-region coverage.
94
+
95
+ ### Documentation
96
+ - Documentation website (Sphinx, pydata-sphinx-theme), deployed to GitHub Pages by
97
+ `.github/workflows/docs.yml`: landing page, installation, quickstart, user guide
98
+ (Master Theorem, product integrals, one-loop, sunset, precision, conventions),
99
+ API reference, example gallery, validation, comparison, prior art, citing.
100
+ - "Try it in your browser": an in-browser console (Pyodide in a Web Worker) that
101
+ runs the package without installation; a Colab quickstart notebook
102
+ (`notebooks/quickstart.ipynb`).
103
+ - NumPy-style docstrings with examples for every public function; the examples run
104
+ as doctests in CI, and `tools/check_doc_snippets.py` runs the examples on the
105
+ documentation pages.
106
+ - `CITATION.cff`; `publish.yml` for PyPI trusted publishing on a GitHub release.
107
+ - LICENSE: the copyright line reads "In memory of Ramanujan".
108
+
109
+ ## 0.2.0
110
+
111
+ ### Added
112
+ - `ramanujan_qft.rmt`: `ramanujan_master_theorem`, `mellin_numeric`, `massive_propagator_rmt`.
113
+ - `ramanujan_qft.mellin`: `product_integral` with both residue expansions, the
114
+ large-x poles of each factor, convergence control (`SeriesConvergenceError`)
115
+ and pole collisions (logarithmic results). Atlas: exponential, gaussian,
116
+ bessel_j, cosine, sine, inverse_power, gaussian_bessel.
117
+ - `ramanujan_qft.one_loop`: `B0` (all masses), `B0_mob`, `C0`, `C0_mob`, `bubble_3d`
118
+ in LoopTools conventions, certified to the requested digits (evaluation at two
119
+ working precisions, raised until they agree).
120
+ - `ramanujan_qft.sunset`: `sunset_im`, `sunset_subtracted`, `sunset_d2`.
121
+ - Test suite (311 tests) with LoopTools 2.16 reference values, independent
122
+ integrations and regression tests from two adversarial audits; GitHub Actions workflow; `pyproject.toml`; examples; benchmarks.
123
+
124
+ ### Fixed
125
+ - The package can now be imported after installation (it no longer depends on
126
+ `feynman_atlas.py` in the repository root).
127
+ - `solve_B0_standard` / `solve_C0_standard` are correct at every precision
128
+ (previously correct only for `precision >= 50`, and crashing at 15).
129
+ - Sunset imaginary part: prefactor π/s instead of π/(16s), and the correct sign.
130
+ - `solve_bessel_exp_product` returned 0.
131
+ - `DispersionMoBEngine.reconstruct_complex`: principal value above threshold.
132
+ - `HypergeometricConvergenceFilter.check_convergence`: a divergent series with
133
+ p − q − 1 = 0 was labelled "conditional".
134
+ - Constructors no longer change the global `mpmath.mp.dps`.
135
+
136
+ - RACE (`product_integral`), after two adversarial audits (47 confirmed defects,
137
+ all regression-tested):
138
+ - a-priori validity check of the contour closure (Gamma orders and scale ratio);
139
+ - existence check of the integral, with asymptotic phases for equal frequencies;
140
+ - exact representation of inputs near lattice points;
141
+ - a stopping rule guarded by the terms' a-priori peak;
142
+ - cancellation-compensated precision;
143
+ - Wynn epsilon only for alternating series;
144
+ - Richardson-extrapolated pole collisions;
145
+ - honest `error_estimate`.
146
+ - B0/C0 cancellation at extreme kinematics (certification), C0 ZeroDivisionError at
147
+ regular points, massless D=3 bubble, sunset edge cases, `mellin_numeric` checks.
148
+ - Round 3:
149
+ - sunset functions rewritten (scaling, factored Kallen functions, normalised
150
+ and error-checked quadrature, certification); accurate at threshold and for
151
+ scales 1e-12..1e12;
152
+ - C0 with IR-finite massless internal lines;
153
+ - exact C0 at s = 0;
154
+ - non-finite inputs rejected;
155
+ - RACE: Gamma-argument offsets in the peak estimate (second peak for large v),
156
+ exact sizing of decimal-string inputs, strip edges from raw parameters.
157
+
158
+ ### Withdrawn (raise `NotImplementedError`; see AUDIT.md)
159
+ - `FeynmanMoBSolver.massive_sunset_residue`, `solve_massive_sunset`,
160
+ `solve_graph_polynomials`, `solve_P126`, `solve_triangle3L`,
161
+ `solve_elliptic_kite`, `solve_double_box_inv`.
162
+ - `RamanujanContinuationEngine.sunset_real_dispersion`, `evaluate_minkowski_residues`.
163
+ - `HypergeometricConvergenceFilter.compute_p126_*`.
164
+ - `MoBDynamicEngine.stage_D_dynamic_evaluation` (it returned 0).
165
+
166
+ ### Changed
167
+ - Default `precision` of the legacy classes is now 30 (was 100). Results no
168
+ longer depend on it.
169
+ - RACE methods raise exceptions instead of returning error strings.
170
+ - `matplotlib`, `scipy` and `pySecDec` are no longer runtime dependencies.
@@ -0,0 +1,17 @@
1
+ cff-version: 1.2.0
2
+ message: >-
3
+ If you use ramanujan-qft, please cite it as below, and please also cite the
4
+ original methods it implements (see docs/PRIOR_ART.md).
5
+ title: "ramanujan-qft: Ramanujan's Master Theorem, Mellin residue summation and arbitrary-precision Feynman integrals"
6
+ version: 0.3.0a4
7
+ license: MIT
8
+ authors:
9
+ - given-names: Reetamshu
10
+ repository-code: "https://github.com/reetanshuh1998/Ramanujan_master_theorem"
11
+ url: "https://reetanshuh1998.github.io/Ramanujan_master_theorem/"
12
+ keywords:
13
+ - Ramanujan's Master Theorem
14
+ - Mellin transform
15
+ - Feynman integrals
16
+ - arbitrary precision
17
+ - mpmath
@@ -0,0 +1,64 @@
1
+ # Contributing
2
+
3
+ The aim is a reproducible scientific package built around Ramanujan and Mellin
4
+ methods. Read [the capability table](docs/CAPABILITIES.md) and
5
+ [the release plan](docs/RELEASE_PLAN.md) before proposing extensions.
6
+
7
+ ## Development
8
+
9
+ ```bash
10
+ python -m pip install -e ".[test]"
11
+ python -m pytest -q -m "not slow"
12
+ python -m pytest -q # includes slow independent quadrature
13
+ python tools/audit_sunset.py --output /tmp/sunset_audit.json
14
+ ```
15
+
16
+ On Windows, choose a writable output path instead of `/tmp/sunset_audit.json`.
17
+ Release tooling and documentation builds use Python 3.12; the numerical
18
+ package supports Python 3.9 and later.
19
+
20
+ Browser-console changes must pass `tools/check_browser_console.py` against the
21
+ built documentation with its bundled wheel. The documentation workflow installs
22
+ Playwright/Chromium and runs this check before deployment. To run it locally:
23
+
24
+ ```bash
25
+ python -m pip install "playwright>=1.50,<2"
26
+ python -m playwright install chromium
27
+ python tools/check_browser_console.py --site docs/_build/html
28
+ ```
29
+
30
+ The check needs network access to Pyodide's CDN. It executes the visible examples,
31
+ independent numerical assertions, Reset, and the custom dependency-wheel path.
32
+
33
+ Keep maintained examples in `examples/`, benchmarks in `benchmarks/`, and
34
+ regression tests with their reference fixtures in `tests/`. Download external
35
+ tools into ignored build directories. Do not commit generated comparison runs,
36
+ compiled binaries, downloaded papers or unreviewed benchmark claims. The fixed
37
+ `benchmarks/data/sunset_audit.json` report is intentional validation evidence.
38
+
39
+ ## Scientific changes
40
+
41
+ Include the integral's normalization and domain, a derivation with primary
42
+ references, and an independent numerical or analytic reference. A nonsingular
43
+ exponent matrix alone does not establish convergence. Document pole collisions,
44
+ error controls and resource limits. Keep distinct evaluation methods visible
45
+ in the API and returned diagnostics; do not add silent quadrature fallbacks.
46
+
47
+ For a bug, provide the smallest reproducing graph or function call, exact input
48
+ strings, requested precision, installed version, actual result and independent
49
+ expected value with its provenance. Add a regression test when fixing it.
50
+
51
+ Tests should establish scientific behavior, numerical robustness or public API
52
+ contracts. Timing measurements should include hardware/software versions,
53
+ precision and a matched accuracy target. Avoid unconditional speed claims.
54
+
55
+ ## Pull requests and releases
56
+
57
+ Describe the mathematical or numerical problem, resulting behavior, limitations
58
+ and validation. The [scientific review packet](docs/SCIENTIFIC_REVIEW.md) lists
59
+ open review questions for the new backends. Keep the fixed audit seed and record
60
+ source hashes when regenerating benchmark data.
61
+
62
+ Only maintainers publish releases. The [release checklist](docs/RELEASING.md)
63
+ separates local preparation, hosted CI, external scientific review and public
64
+ publication. Cite both the software version and the original methods.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 In memory of Ramanujan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,20 @@
1
+ include README.md
2
+ include LICENSE
3
+ include CHANGELOG.md
4
+ include CITATION.cff
5
+ include CONTRIBUTING.md
6
+ include AUDIT.md
7
+ include THIRD_PARTY_NOTICES.md
8
+ recursive-include ramanujan_qft *.py
9
+ recursive-include tests *.py *.csv *.json
10
+ recursive-include tools *.py
11
+ recursive-include notebooks *.ipynb
12
+ recursive-include examples *.py *.txt *.rst
13
+ recursive-include benchmarks *.py *.sh *.F
14
+ recursive-include docs *.md *.py *.txt *.css *.html *.js
15
+ prune docs/_build
16
+ prune docs/auto_examples
17
+ prune benchmarks/looptools/_build
18
+ include benchmarks/data/sunset_audit.json
19
+ include benchmarks/data/release_comparison.json
20
+ include benchmarks/data/sunset_budgets.json