Releases: apiprdt/PhysicsPaper
Release list
ADCD v3.0.0
ADCD v3.0.0 — Submission-ready
Science rarely discovers from a blank slate — it corrects.
ADCD automates the step between anomaly and theory correction: given a classical law and data that disagrees with it, it searches for the minimal physically-valid correction term Δ — passing every candidate through dimensional, asymptotic, and complexity gates before a single parameter is ever fit.
This is the official code repository for Anomaly-Driven Correction Discovery (ADCD), a physics-informed symbolic regression framework designed to mimic the evolutionary nature of scientific discovery. Rather than learning entire equations from scratch, ADCD takes a known classical physical law and seeks to discover the mathematical structure of the dimensionless correction term (Δ) that explains the discrepancy between classical predictions and anomalous experimental observations.
🆕 What's New in v3.0.0
This is a submission-ready release accompanying the arXiv preprint. It bundles a substantial research expansion over v2.1.3:
Scientific content
- SPARC MOND capstone — Radial Acceleration Relation fitting on 175 disk galaxies with cross-validation parity, cluster bootstrap validation, and direct comparison to McGaugh et al. (2016).
-
Cosmological probes — New experiments on the
$f\sigma_8$ growth-rate tension (Alestas et al. 2022) and cosmic chronometer Hubble data. - Wide-binary appendix — Feasibility study referencing Chae (2023), Banik et al. (2024), and Pittordis & Sutherland (2023).
- EFT framing — New discussion positioning ADCD's correction terms within the Effective Field Theory tradition (Weinberg 1979; Georgi 1993; Kaplan 1995).
- Structural dichotomy paragraph articulating ADCD's unique contribution vs. from-scratch symbolic regression.
Methodology & fairness
- Fair PySR comparison — Cross-validation parity (same folds, same noise profiles), generous time budget, and cluster bootstrap confidence intervals. ADCD outperforms PySR by +77.8 percentage points at 5% noise.
- Multi-seed reproducibility — 5–16 seeds across all 9 scenarios × 4 noise levels, with a guard script (
scripts/verify_paper_claims.py) that fails loudly if any headline number drifts.
Repo & paper hygiene
- Full reproducibility stack —
reproduce_all.{ps1,sh}scripts, frozen random seeds, and per-claim JSON output cross-checks. - Clean source tree — Removed scratch/debug scripts, build artifacts, intermediate JSONs, log files, and PNG duplicates. The repo now contains only paper source, package code, tests, and data.
- AI use disclosure — Transparency statement in the paper Acknowledgments.
- Hardened metadata — DOI, version, and license wired into
.zenodo.json,CITATION.cff, andpyproject.toml.
⚡ Key Features
- Correction-First Paradigm — Starts from a known classical law, not a blank slate. Focuses the search space on the discrepancy Δ between theory and experiment.
- Cascaded Physics Gates — AST complexity, dimensional homogeneity, transcendental guardrails, and asymptotic consistency (ARC) gates screen out unphysical candidates before running parameter-fitting.
- JAX-Traced L-BFGS-B Optimizer — Highly optimized parameter-scaled differentiable fitting with multi-restart log-uniform initialization.
- BIC Model Selection — Employs the Bayesian Information Criterion (BIC) to rank models, favoring simpler physical theories over overly complex numerical fits.
- Residual Feature Intelligence — Extracts mathematical features (monotonicity, curvature, oscillation, decay) from residuals to bias proposal templates.
- Phase 2: Multivariable Discovery — Buckingham Π group decomposition + per-variable Sequential ARC + variance-factorization separability detection for multi-input physical laws.
- Real-World Validated — Successfully identifies correct structural classes on Mercury's perihelion (GR), Lamb Shift (QED), Muon g-2 (Schwinger), and Blackbody (Planck).
📚 Key References
ADCD builds on and extends the symbolic-regression and physics-informed discovery tradition. The foundational works most directly related to this project:
- Udrescu & Tegmark (2020) — AI Feynman [Sci. Adv. 6(16)]. Physics-inspired symbolic regression. —
udrescu2020ai - Cranmer (2020) — PySR [arXiv:2007.03738]. Primary baseline for fair comparison in this work. —
cranmer2020pysr - Schmidt & Lipson (2009) — Distilling free-form natural laws [Science 324]. Foundational symbolic regression. —
schmidt2009distilling - Brunton, Proctor & Kutz (2016) — SINDy [PNAS 113(15)]. Sparse identification of governing equations. —
brunton2016sindy - Tenachi, Ibata & Diakogiannis (2023) — PhySO [ApJ 959(2)]. Dimensional-constraint-guided deep symbolic regression. —
tenachi2023physo
The complete bibliography (34 references) is available in paper/main.tex.
📦 Download this release
| Artifact | Contents | Size |
|---|---|---|
Source code (adcd-v3.0.0.zip) |
Full repository: package + tests + paper + data | ~2.3 MB |
arXiv paper source (adcd-paper-source-v3.0.0.tar.gz) |
LaTeX + figures + generated tables (flat) | ~1.9 MB |
Paper PDF (paper/main.pdf) |
Compiled manuscript | — |
📖 Citing This Work
If you use ADCD in your research, please cite:
@software{erdita2026adcd,
author = {Erdita, Muhammad Afif},
title = {{Anomaly-Driven Correction Discovery (ADCD): Physics-Constrained
Symbolic Regression for Evolutionary Scientific Discovery}},
year = {2026},
publisher = {Zenodo},
version = {3.0.0},
doi = {10.5281/zenodo.20534940},
url = {https://doi.org/10.5281/zenodo.20534940}
}Full Changelog: v2.1.3...v3.0.0
ADCD v2.2.1 — SPARC MOND validation
Changelog
All notable changes to ADCD will be documented in this file.
Format follows Keep a Changelog.
This project adheres to Semantic Versioning.
[2.2.1] — 2026-06-20
Added
- SPARC MOND validation: rigorous galaxy-level cross-validation (10 repeated 50/50 train/test splits), 50-resample bootstrap parameter CIs, and three-tier quality-cut robustness study on the SPARC sample
-
Bootstrap CI table (
tab_sparc_bootstrap.tex) with display symbols$\theta_0$ ,$\theta_1$ rendered in canonical order -
Paper text: parameter-degeneracy discussion (deep-MOND
$\hat\theta_0\sqrt{\hat\theta_1}$ invariance) added to bootstrap and robustness sections to explain the wide$\hat\theta_0$ CI
Changed
- Lelli et al. SPARC citation corrected: The Astrophysical Journal 836:152 (2017) → The Astronomical Journal 152:157 (2016); dropped non-author Pawlowski and aligned
.bibentry - Lint/format config aligned:
[tool.black]line-length raised 100 → 120 to match.flake8max-line-length; removed redundant[tool.flake8]block frompyproject.toml - Version strings synced to 2.2.1 across
README.md,CITATION.cff,.zenodo.json,docs/index.md,docs/paper.md(previously a mix of 2.1.3 / 2.2.0) - Test counts updated 95/77 → 116 in README badge, project structure, docs hero stats, and installation guide
- Docs hero stat corrected: stale "+44.5 pp over PySR" → +77.8 pp (the value used everywhere else)
Fixed
-
CI lint gate: 7 flake8 errors in
src/adcd/experiments/sparc_robustness.py(unused importspandas,stack_sparc_galaxies,nu_standard_mond,jnp; unusedexpr/theta_symbols/jax_fnbindings; missing whitespace after keyword on twoprint(...)calls); CI lint step now passes clean -
scripts/generate_sparc_tables.py: bootstrap row symbols now maptheta_r1_0/theta_r1_1→$\theta_0$ /$\theta_1$ and sort by trailing index instead of lexicographic order
ADCD v2.2.0
ADCD v2.2.0 — Phase 2 Multivariable Correction Discovery
Physics-constrained symbolic regression that discovers correction terms
rather than learning equations from scratch.
What's new (Phase 2 — Multivariable Discovery)
- 🧩 Buckingham Π group engine (
buckingham_pi.py): nullspace-based dimensional Π-group generator - 📐 Sequential ARC (
sequential_arc.py): per-variable asymptotic-limit gate - 🔬 Residual Factorizer v2 (
residual_factorizer_v2.py): variance-decomposition separability detection - 🎯 Multivariable Orchestrator (
multivar_orchestrator.py): end-to-end multi-input correction search - 📊 Phase 2 benchmark: 2/4 multivariable scenarios solved (Yukawa Mass-Ratio, Turbulent Drag)
Headline results
| Benchmark | Result |
|---|---|
| 9-scenario (seed=42) | 94.4% structural recovery |
| 5-seed multi-seed (Tier B+) | 82.8% ± 7.7% |
| vs PySR fair @ 5% noise | 88.9% vs 11.1% (77.8 pp gap) |
| Real-world | 4/4 structural (Mercury, Lamb Shift, Muon g-2, Blackbody) |
Links
- Docs: https://apiprdt.github.io/PhysicsPaper/
- Paper PDF: included as supplementary (
main.pdf) - Zenodo: https://doi.org/10.5281/zenodo.20534940
Full Changelog: v2.1.3...v2.2.0
ADCD v2.1.3
ADCD v2.1.3 — Submission-ready paper polish
- Evaluation regimes disclosure (Primary Mock 5-seed / Supplementary Hybrid / Real-world)
- Fresh Tier B+ benchmarks: 82.8% ± 7.7% mean structural recovery
- PySR fair gap fix: 77.8 pp at 5% noise (abstract + body consistent)
- Related Work: PhySO + LaSR (v2.1.1)
verify_paper_claims.pyall claims pass
See CHANGELOG.md for full details.
ADCD v2.1.2
Changelog
All notable changes to ADCD will be documented in this file.
Format follows Keep a Changelog.
This project adheres to Semantic Versioning.
[2.1.2] — 2026-06-10
Added
docs/SUBMISSION_CHECKLIST_v2.1.2.md: step-by-step GitHub Release, Zenodo, and arXiv submission guidescripts/verify_paper_claims.py: PySR fair 77.8 pp gap guard at 5% noise
Changed
- Paper narrative polish (8/10 path): evaluation regimes paragraph (Primary / Supplementary / Real-world); quantitative claims reframed (structural lead, Blackbody NMSE qualifier); ARC collective-filter framing aligned with ablation
- Multi-seed benchmark refreshed (Tier B+): mean structural recovery 82.8% ± 7.7% (was 81.1% ± 10.3% on pre-fix pipeline)
- Abstract PySR comparison corrected to 77.8 percentage-point gap vs PySR fair at 5% noise (was incorrectly 44.4 pp from legacy fast profile)
-
README PySR table updated to fair profile; Mercury NMSE corrected to
$1.11 \times 10^{-5}$
Fixed
- LaTeX table generators:
tab_pysr_config.texrow endings (\\\\);tab_pulsar_sensitivity.texunderscore escaping and math mode gate_telemetry.jsonrefreshed viarun_correction_discovery.py --proposer mock
[2.1.1] — 2026-06-10
Added
- Related Work: PhySO (Tenachi et al. 2023) and LaSR (Grayeli et al. 2024) positioning paragraphs
hybrid_seed42_results.json: frozen Hybrid Proposer benchmark (33/36 = 91.7% at seed=42)docs/ZENODO_RELEASE_v2.1.0.md,docs/GITHUB_RELEASE_v2.1.0.md
Changed
- Paper tone:
prune→filter,guarantee→screenwith dimensional-relaxation qualifier (\Cref{sec:limitations}) - Package version synced to 2.1.0 in
pyproject.tomland__init__.py reproduce_all.ps1: step 8 replaced withpytest tests/test_real_data.py -k mercury
Fixed
- Paper statistics aligned with frozen
reproducibility_results.json(seed disclosure, per-seed rates) - Binary pulsar framing: sensitivity study separated from main 4/4 real-world headline
[2.1.0] — 2026-06-09
Added
- Binary pulsar v2.1 reduced-variable benchmark (fixed M, a, e; varying P) with Peters prefactor helper
run_binary_pulsar_sensitivity.py: P_only / P_e / P_e_M / full variant study for reviewer-facing ablationscripts/generate_real_world_tables.py: auto-generates parameter recovery, template leakage, and sensitivity LaTeX tablestests/test_metrics_scale.py: guards against scale-adaptive NMSE regressions on sub-nano residuals
Changed
-
Real-world reporting now separates structural (5/5), quantitative NMSE
$< 10^{-4}$ (3/5), and optimizer convergence (2/5) -
evaluate_correction: SymPylambdifyevaluation replaces fragileeval()string substitution -
Stage-2 BIC reranking uses post-hoc validated NMSE from
evaluate_correction, not optimizer-internal scores
Fixed
-
Scale-adaptive NMSE in
jax_optimizer.pyandmetrics.py(fixed$\varepsilon=10^{-10}$ floor caused false convergence on binary pulsar data$\sim 10^{-15}$ ) -
Binary pulsar false positive: degenerate
$\theta_0\to 0$ models no longer win BIC with NMSE$= 1.0$ whileclass_match=true
[2.0.0] — 2026-06-08
Added
- Parameter-scaled L-BFGS-B optimizer (
jax_optimizer.py): each restart now normalises variables to O(1) by dividing by their initial values, completely eliminating gradient underflow on extreme-scale parameters (e.g.G = 6.67e-11) - Mixed log-uniform initialisation: 50/50 blend of narrow
[-6, 6]and wide[-20, 20]exponent ranges for better coverage of both standard and astrophysical/quantum scales loss_mode='auto'with dynamic-range threshold1e4: high-DR scenarios (e.g. Blackbody, DR ≈ 7.1e4) automatically switch to full-reconstruction loss; all 9 standard scenarios remain on residual loss- Negative power-law templates added to
CorrectionMockProposer:-(θ₀/v₁)⁴,-(θ₀/v₁)^θ₁,θ₀(θ₁/v₁)⁴ − 1,-(θ₀/v₁)^θ₁ + θ₂— fixes Net Radiation 4/4 discovery - Degenerate exponent detection in
classify_structure: power-law expressions whereθ ≈ 1.0are reclassified as polynomial, avoiding false class mismatches on Muon g-2 - AST node-count tie-breaker in BIC sort (
correction_orchestrator.py): prefers structurally simpler expressions when BIC scores are equal n_restarts = 15(up from 5) in JAXOptimizer for improved global search coverage- 58 automated unit tests covering all pipeline gates, optimizer, proposer, and public API
run_real_data_benchmark.pyextended with Mercury Perihelion, Lamb Shift, Muon g-2, and Blackbody scenariosrun_reproducibility.pymulti-seed study: 5 seeds × 9 scenarios × 4 noise levels = 180 runs
Changed
DYNAMIC_RANGE_THRESHOLDraised from1e3→1e4(prevents Screened Coulomb 5%/10% regression)MockProposernow injectstheta_0 * {v1} / {const}templates in physical-constant injection phase- Benchmark table in
README.mdcorrected to use actual scenario names (previously listed wrong scenario names) .gitignoreupdated: ignoresscratch/,scratch_*,baseline_pre_fix.json,*.zip,*.tar.gz
Fixed
- Net Radiation (0/4 → 4/4): negative power-law correction
-(T_env/T)⁴now discovered reliably at all noise levels - Screened Coulomb 5%/10% regression: dynamic-range threshold fix restores
residualloss mode for standard scenarios - Blackbody structural match:
loss_mode='auto'correctly switches to full-reconstruction loss for DR ≈ 7.1e4
[1.1.0] — 2026-06-04
Added
src/adcd/installable package structure with__init__.pypublic APIpyproject.tomlfor PEP 517/518 build system (pip install adcd)- GitHub Actions CI workflow: test suite on Python 3.10 + 3.11, LaTeX paper compilation
- GitHub Actions publish workflow: Trusted Publishing to PyPI on release
CONTRIBUTING.md,CODE_OF_CONDUCT.md, issue/PR templatesLICENSE(MIT)CHANGELOG.md(this file)
Changed
- All internal imports migrated from
from src.Xtofrom adcd.X README.mdupdated with installation badge, Quick Start, and BibTeX citation
Fixed
- Overclaims corrected in paper: "guarantees" → "strongly enforces"; ARC/gate individual ablation clarified; timing claim removed
- Author email
[email protected]added to paper and Zenodo metadata
[1.0.0] — 2026-06-04 (Initial Zenodo Release)
Added
- Full ADCD discovery pipeline: AST complexity gate → dimensional checker → transcendental guardrail → ARC asymptotic gate → JAX L-BFGS-B optimizer → BIC reranker
- 9-scenario benchmark suite: Relativistic KE, Yukawa Gravity, Anharmonic Spring, Screened Coulomb, Net Radiation, Nonlinear Drag, Mystery-A, Mystery-B, Mystery-C
- PySR baseline comparison (22.2–66.7% vs ADCD 88.9–100%)
- MLP baseline comparison (NMSE: 8.56e-5 at 0% noise vs ADCD 5.51e-12)
- Blind generalization test: Van der Waals, Stokes-Einstein, Wien displacement
- Ablation study: gates, BIC reranking
- LaTeX paper with full reproducibility data
- Zenodo DOI:
10.5281/zenodo.20534940
ADCD v2.1.0
Changelog
All notable changes to ADCD will be documented in this file.
Format follows Keep a Changelog.
This project adheres to Semantic Versioning.
[2.1.0] — 2026-06-09
Added
- Binary pulsar v2.1 reduced-variable benchmark (fixed M, a, e; varying P) with Peters prefactor helper
run_binary_pulsar_sensitivity.py: P_only / P_e / P_e_M / full variant study for reviewer-facing ablationscripts/generate_real_world_tables.py: auto-generates parameter recovery, template leakage, and sensitivity LaTeX tablestests/test_metrics_scale.py: guards against scale-adaptive NMSE regressions on sub-nano residuals
Changed
-
Real-world reporting now separates structural (5/5), quantitative NMSE
$< 10^{-4}$ (3/5), and optimizer convergence (2/5) -
evaluate_correction: SymPylambdifyevaluation replaces fragileeval()string substitution -
Stage-2 BIC reranking uses post-hoc validated NMSE from
evaluate_correction, not optimizer-internal scores
Fixed
-
Scale-adaptive NMSE in
jax_optimizer.pyandmetrics.py(fixed$\varepsilon=10^{-10}$ floor caused false convergence on binary pulsar data$\sim 10^{-15}$ ) -
Binary pulsar false positive: degenerate
$\theta_0\to 0$ models no longer win BIC with NMSE$= 1.0$ whileclass_match=true
[2.0.0] — 2026-06-08
Added
- Parameter-scaled L-BFGS-B optimizer (
jax_optimizer.py): each restart now normalises variables to O(1) by dividing by their initial values, completely eliminating gradient underflow on extreme-scale parameters (e.g.G = 6.67e-11) - Mixed log-uniform initialisation: 50/50 blend of narrow
[-6, 6]and wide[-20, 20]exponent ranges for better coverage of both standard and astrophysical/quantum scales loss_mode='auto'with dynamic-range threshold1e4: high-DR scenarios (e.g. Blackbody, DR ≈ 7.1e4) automatically switch to full-reconstruction loss; all 9 standard scenarios remain on residual loss- Negative power-law templates added to
CorrectionMockProposer:-(θ₀/v₁)⁴,-(θ₀/v₁)^θ₁,θ₀(θ₁/v₁)⁴ − 1,-(θ₀/v₁)^θ₁ + θ₂— fixes Net Radiation 4/4 discovery - Degenerate exponent detection in
classify_structure: power-law expressions whereθ ≈ 1.0are reclassified as polynomial, avoiding false class mismatches on Muon g-2 - AST node-count tie-breaker in BIC sort (
correction_orchestrator.py): prefers structurally simpler expressions when BIC scores are equal n_restarts = 15(up from 5) in JAXOptimizer for improved global search coverage- 58 automated unit tests covering all pipeline gates, optimizer, proposer, and public API
run_real_data_benchmark.pyextended with Mercury Perihelion, Lamb Shift, Muon g-2, and Blackbody scenariosrun_reproducibility.pymulti-seed study: 5 seeds × 9 scenarios × 4 noise levels = 180 runs
Changed
DYNAMIC_RANGE_THRESHOLDraised from1e3→1e4(prevents Screened Coulomb 5%/10% regression)MockProposernow injectstheta_0 * {v1} / {const}templates in physical-constant injection phase- Benchmark table in
README.mdcorrected to use actual scenario names (previously listed wrong scenario names) .gitignoreupdated: ignoresscratch/,scratch_*,baseline_pre_fix.json,*.zip,*.tar.gz
Fixed
- Net Radiation (0/4 → 4/4): negative power-law correction
-(T_env/T)⁴now discovered reliably at all noise levels - Screened Coulomb 5%/10% regression: dynamic-range threshold fix restores
residualloss mode for standard scenarios - Blackbody structural match:
loss_mode='auto'correctly switches to full-reconstruction loss for DR ≈ 7.1e4
[1.1.0] — 2026-06-04
Added
src/adcd/installable package structure with__init__.pypublic APIpyproject.tomlfor PEP 517/518 build system (pip install adcd)- GitHub Actions CI workflow: test suite on Python 3.10 + 3.11, LaTeX paper compilation
- GitHub Actions publish workflow: Trusted Publishing to PyPI on release
CONTRIBUTING.md,CODE_OF_CONDUCT.md, issue/PR templatesLICENSE(MIT)CHANGELOG.md(this file)
Changed
- All internal imports migrated from
from src.Xtofrom adcd.X README.mdupdated with installation badge, Quick Start, and BibTeX citation
Fixed
- Overclaims corrected in paper: "guarantees" → "strongly enforces"; ARC/gate individual ablation clarified; timing claim removed
- Author email
[email protected]added to paper and Zenodo metadata
[1.0.0] — 2026-06-04 (Initial Zenodo Release)
Added
- Full ADCD discovery pipeline: AST complexity gate → dimensional checker → transcendental guardrail → ARC asymptotic gate → JAX L-BFGS-B optimizer → BIC reranker
- 9-scenario benchmark suite: Relativistic KE, Yukawa Gravity, Anharmonic Spring, Screened Coulomb, Net Radiation, Nonlinear Drag, Mystery-A, Mystery-B, Mystery-C
- PySR baseline comparison (22.2–66.7% vs ADCD 88.9–100%)
- MLP baseline comparison (NMSE: 8.56e-5 at 0% noise vs ADCD 5.51e-12)
- Blind generalization test: Van der Waals, Stokes-Einstein, Wien displacement
- Ablation study: gates, BIC reranking
- LaTeX paper with full reproducibility data
- Zenodo DOI:
10.5281/zenodo.20534940