Anomaly-Driven Correction Discovery: Physics-Constrained Symbolic Regression for Evolutionary Scientific Discovery
Project description
ADCD — Anomaly-Driven Correction Discovery
Physics-Constrained Symbolic Regression for Evolutionary Scientific Discovery
Explore the Documentation »
Quick Start
·
Key Features
·
Benchmarks
·
Run in Colab
Science rarely discovers from a blank slate — it corrects.
ADCD automates the step between anomaly and theory correction, the same step that led from Newtonian gravity to General Relativity, from Dirac to QED, and from Rayleigh-Jeans to Planck.
⚡ Key Features
- Correction-First Paradigm — Starts from a known classical law, not a blank slate. Focuses the search space on the discrepancy $\Delta$ 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).
📦 Installation
Install the stable package from PyPI:
pip install adcd
Or install from source:
git clone https://github.com/apiprdt/PhysicsPaper.git
cd PhysicsPaper
pip install -e ".[dev]"
Verify your installation:
pytest tests/
💻 Quick Start
1. High-Level Scientific API
Running ADCD on predefined physics benchmarks is extremely simple:
import adcd
# 1. Load a pre-defined benchmark scenario (e.g. Relativistic Kinetic Energy)
scenarios = adcd.get_all_scenarios()
scenario = scenarios[0]
# 2. Run discovery in a single line!
result = adcd.discover_correction(scenario, max_iterations=5, proposer="mock")
# 3. View the best fit
print(f"Discovered correction: {result.best_expr}") # θ₀ * (v/c)**2
print(f"LaTeX representation: {result.export_latex()}") # \theta_0 \left(\frac{v}{c}\right)^2
print(f"Parameters: {result.best_theta}")
print(f"BIC Score: {result.best_bic:.2f}")
# 4. Plot residuals
result.plot_residuals()
2. Custom Experimental Datasets
For custom datasets, use the adcd.fit function:
import numpy as np
import adcd
# Your custom data
x = np.linspace(1.0, 5.0, 100)
X = {"x": x}
y_classical = 2.0 * x
y_observed = 2.0 * x + 0.5 * x**2 # True correction is 0.5 * x^2
# Run ADCD
result = adcd.fit(
X=X,
y_obs=y_observed,
y_classical=y_classical,
limit_variable="x",
limit_direction="0",
correction_mode="additive"
)
result.summary()
📊 Benchmark Results
1. Standard Benchmark (seed=42, Mock Proposer)
| Scenario | Tier | 0% Noise | 1% Noise | 5% Noise | 10% Noise |
|---|---|---|---|---|---|
| Relativistic KE | Textbook | ✓ | ✓ | ✓ | ✓ |
| Yukawa Gravity | Textbook | ✓ | ✓ | ✓ | ✓ |
| Anharmonic Spring | Textbook | ✓ | ✓ | ✓ | ✓ |
| Screened Coulomb | Cross-Domain | ✓ | ✓ | ✗ | ✗ |
| Net Radiation | Cross-Domain | ✓ | ✓ | ✓ | ✓ |
| Nonlinear Drag | Cross-Domain | ✓ | ✓ | ✓ | ✓ |
| Mystery-A (tanh²) | Synthetic | ✓ | ✓ | ✓ | ✓ |
| Mystery-B (sinc) | Synthetic | ✓ | ✓ | ✓ | ✓ |
| Mystery-C (log-quotient) | Synthetic | ✓ | ✓ | ✓ | ✓ |
| Overall | 100% | 100% | 88.9% | 88.9% |
2. PySR Comparison (fair profile: 100 iterations, 60s timeout)
| Method | 0% Noise | 1% Noise | 5% Noise | 10% Noise |
|---|---|---|---|---|
| ADCD (ours, seed=42) | 9/9 (100%) | 9/9 (100%) | 8/9 (88.9%) | 8/9 (88.9%) |
| PySR fair | 4/9 (44.4%) | 5/9 (55.6%) | 1/9 (11.1%) | 5/9 (55.6%) |
ADCD outperforms PySR by +77.8 percentage points at 5% noise.
3. Phase 2: Multivariable Benchmark (v2.2.1)
| Scenario | Variables | ADCD Solved | Notes |
|---|---|---|---|
| Yukawa Mass-Ratio | m, M, r, r₀ | ✓ | Π groups: m/M, r/r₀ |
| Turbulent Drag | v, ρ, A, C_D | ✓ | Separable multiplicative |
| Coupled Oscillator | k, m, Ω, ω₀ | ✗ | Mixed functional form |
| Van der Waals MV | a, b, P, V, T | ✗ | Requires 3rd Π group |
| Overall | 2/4 (50%) | Baseline: 0/4 |
4. Real-World Physical Constants
Validation on historical anomalies using physical constants from JPL DE440, NIST, and CODATA:
| Physical Scenario | Discovered Correction | Converged | Class Match | NMSE |
|---|---|---|---|---|
| Mercury Perihelion (GR) | θ₀·vc² |
— | ✓ polynomial | 1.11e-05 |
| Hydrogen Lamb Shift (QED) | θ₀(n/θ₁)^(-θ₂) |
✓ | ✓ power_law | 1.82e-18 |
| Muon g-2 (Schwinger) | θ₀(α/π)^θ₁ |
✓ | ✓ polynomial | 7.94e-07 |
| Blackbody (Planck) | -1 + e^(-f/θ₁) |
— | ✓ exponential | 2.59e-02 |
📁 Project Structure
PhysicsPaper/
├── src/adcd/ # Installable package
│ ├── __init__.py # Public API (fit, discover_correction)
│ ├── anomaly_scenarios.py # 9 standard + 3 blind + 4 multivariable scenarios
│ ├── arc_scorer.py # Asymptotic consistency gate (ARC)
│ ├── buckingham_pi.py # [Phase 2] Buckingham Π group engine
│ ├── coarse_evaluator.py # Coarse numerical pre-filter
│ ├── correction_orchestrator.py # Main multi-iteration discovery loop
│ ├── dimensional_checker.py # Dimensional homogeneity + transcendental gate
│ ├── jax_optimizer.py # JAX L-BFGS-B optimizer
│ ├── llm_proposer.py # Mock + Gemini + OpenAI proposers
│ ├── metrics.py # NMSE, BIC, structural classification
│ ├── multivar_orchestrator.py # [Phase 2] Multivariable correction pipeline
│ ├── pipeline.py # Stage 1 filter cascade
│ ├── real_data_loader.py # Real-world data loading (JPL, NIST, CODATA)
│ ├── residual_factorizer_v2.py # [Phase 2] Variance-decomposition separability
│ ├── result.py # CorrectionResult object
│ └── sequential_arc.py # [Phase 2] Per-variable Sequential ARC checker
├── tests/ # 116 unit + integration tests
├── paper/ # LaTeX source (main.tex) + figures
├── run_correction_discovery.py # Benchmark runner
└── README.md # This file
📖 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 = {2.2.1},
doi = {10.5281/zenodo.20534940},
url = {https://doi.org/10.5281/zenodo.20534940}
}
👥 AI Disclosure
This project was developed with assistance from Google DeepMind's Antigravity AI assistant. AI was used as a pair-programming and writing tool. All scientific content, experimental design decisions, and intellectual contributions are the author's own.
📄 License
This project is licensed under the MIT License.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file adcd-2.2.1.tar.gz.
File metadata
- Download URL: adcd-2.2.1.tar.gz
- Upload date:
- Size: 124.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
05470ff299c2b72d104f1a72e7362aba21706fced0ab5bda3d3aaecbcab418de
|
|
| MD5 |
0852335f6af1b210dbd07c8225877827
|
|
| BLAKE2b-256 |
5d1718eb5cbbc5a1fe56d334a6faa217d2fe45f9d166119005cfaa5f52c004b9
|
Provenance
The following attestation bundles were made for adcd-2.2.1.tar.gz:
Publisher:
publish.yml on apiprdt/PhysicsPaper
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
adcd-2.2.1.tar.gz -
Subject digest:
05470ff299c2b72d104f1a72e7362aba21706fced0ab5bda3d3aaecbcab418de - Sigstore transparency entry: 1877966780
- Sigstore integration time:
-
Permalink:
apiprdt/PhysicsPaper@18d1eeda2a1f0d6068fa9c3dad4a6df272168789 -
Branch / Tag:
refs/tags/v2.2.1 - Owner: https://github.com/apiprdt
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@18d1eeda2a1f0d6068fa9c3dad4a6df272168789 -
Trigger Event:
release
-
Statement type:
File details
Details for the file adcd-2.2.1-py3-none-any.whl.
File metadata
- Download URL: adcd-2.2.1-py3-none-any.whl
- Upload date:
- Size: 115.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1a724c9c6394218ad23a62a51567c6ce658da190e1963c87431e8344670b02ba
|
|
| MD5 |
4c70fa102beba05b534332c9a8fefc68
|
|
| BLAKE2b-256 |
c1b4a6c3f85b75cc6a41d71164e9c9f181be1a2c711ed080e46cb4c31be71449
|
Provenance
The following attestation bundles were made for adcd-2.2.1-py3-none-any.whl:
Publisher:
publish.yml on apiprdt/PhysicsPaper
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
adcd-2.2.1-py3-none-any.whl -
Subject digest:
1a724c9c6394218ad23a62a51567c6ce658da190e1963c87431e8344670b02ba - Sigstore transparency entry: 1877966890
- Sigstore integration time:
-
Permalink:
apiprdt/PhysicsPaper@18d1eeda2a1f0d6068fa9c3dad4a6df272168789 -
Branch / Tag:
refs/tags/v2.2.1 - Owner: https://github.com/apiprdt
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@18d1eeda2a1f0d6068fa9c3dad4a6df272168789 -
Trigger Event:
release
-
Statement type: