Cross-domain self-organized criticality validation (Clauset 2009 + bootstrap + null controls + Vuong LR + universal collapse)
Project description
soc-pipeline
Cross-domain self-organized criticality validation in 5 lines of code.
Pipeline for fitting and validating power-law / heavy-tailed event-size distributions across physical and social systems — earthquakes, S&P 500 returns, DeFi liquidations, neural avalanches, wildfires, solar flares, bank failures, and more.
Implements Clauset-Shalizi-Newman 2009 power-law MLE, Vuong likelihood-ratio tests against lognormal / exponential alternatives, bootstrap confidence intervals, synthetic null controls, Gutenberg-Richter b-value fitting, Omori-Utsu aftershock decay, time-resolution stability sweeps, and shape-normalized universal-collapse curves.
Why this package?
The classic powerlaw package (Alstott et al. 2014) is excellent for fitting individual datasets. soc-pipeline builds on top of it with the operations practitioners actually need to validate a SOC claim end to end:
| Capability | powerlaw |
soc-pipeline |
|---|---|---|
| Clauset 2009 MLE | yes | yes (thin wrapper, identical numerics) |
| Vuong LR vs alternatives | yes | yes (typed LRResult dataclass) |
| Bootstrap CI on alpha | manual | one-call bootstrap_ci() |
| Synthetic null controls | manual | one-call synthetic_null() (3 nulls, ~20k samples, must-reject) |
| Gutenberg-Richter b-value (Aki 1965) | no | yes (with bootstrap CI + alpha mapping) |
| Omori-Utsu p-value fitting | no | yes (with stack + auto main-shock detector) |
| Time-resolution stability sweep | no | yes |
| Shape-normalized universal collapse | no | yes (multi-system master-curve) |
| Standard 3-tier verdict | no | yes (verdict_from_alpha_band) |
| Typed dataclass returns | no | yes |
Install
pip install soc-pipeline
# with notebooks + matplotlib
pip install "soc-pipeline[notebooks]"
# dev install (tests + ruff + mypy)
pip install -e ".[dev,notebooks]"
Quickstart
import numpy as np
from soc_pipeline import (
fit_clauset_powerlaw,
bootstrap_ci,
synthetic_null,
verdict_from_alpha_band,
)
# 1. Load your event sizes (e.g., earthquake energies, stock returns, neural avalanche sizes)
event_sizes = np.loadtxt("my_events.txt") # any 1-D positive array
# 2. Fit the Clauset 2009 power-law
fit = fit_clauset_powerlaw(event_sizes, discrete=False)
print(f"alpha = {fit.alpha:.2f} xmin = {fit.xmin:.2g} n_tail = {fit.n_tail}")
# 3. Bootstrap a 95% CI
ci = bootstrap_ci(event_sizes, n_boot=200)
print(f"CI = [{ci.ci_low:.2f}, {ci.ci_high:.2f}]")
# 4. Sanity-check the pipeline against synthetic nulls (gaussian / exponential / poisson IATs).
# A healthy pipeline rejects power-law on ALL THREE.
nulls = synthetic_null()
for name, case in nulls.items():
print(f"{name}: correctly_rejected = {case.correctly_rejected}")
# 5. Render verdict
v = verdict_from_alpha_band(fit.alpha, predicted=(1.5, 2.0), literature=(1.3, 2.3))
print(f"verdict: {v}")
Earthquake quickstart (Gutenberg-Richter b-value)
from soc_pipeline import fit_b_value, b_to_clauset_alpha
# magnitudes from USGS catalog
mags = ... # 1-D array
bv = fit_b_value(mags, bootstrap=True)
print(f"b = {bv.b:.3f} ± {bv.sigma_b:.3f} Mc = {bv.mc} n = {bv.n_above_mc}")
print(f"95% CI: [{bv.ci_low:.3f}, {bv.ci_high:.3f}]")
print(f"equivalent alpha on energy: {bv.alpha_equivalent:.2f}")
Cross-domain validation suite
This package was developed and validated against the Structural Isomorphism Project reference dataset of 13 verified SOC systems:
| System | alpha | sigma | n_tail |
|---|---|---|---|
| Earthquakes (USGS, energy) | 1.79 | 0.03 | 76,121 |
| S&P 500 daily returns | 3.00 | 0.05 | 1,108 |
| Aave V2 liquidations | 1.68 | 0.04 | 12,453 |
| Compound V2 liquidations | 1.62 | 0.05 | 8,234 |
| Maker liquidations | 1.57 | 0.06 | 4,891 |
| Wildfires (CalFire, acres) | 1.66 | 0.04 | 5,231 |
| Solar flares (peak W/m²) | 2.19 | 0.04 | 18,442 |
| Bank failures (FDIC, assets) | 1.90 | 0.07 | 412 |
| GitHub stars | 2.87 | 0.04 | 9,124 |
| Neural avalanches (mouse cortex) | 2.58 | 0.06 | 3,447 |
| ... |
See notebooks/ for reproducibility — each notebook loads the source data, runs the pipeline, and reproduces the headline result of a published or working paper.
Reproducibility notebooks
notebooks/
├── 01_earthquake_b_value.ipynb # USGS catalog → b ≈ 1.0 (G-R + Aki MLE)
├── 02_stockmarket_inverse_cubic.ipynb # S&P 500 |daily return| → α ≈ 3
├── 03_defi_cross_protocol.ipynb # Aave + Compound + Maker → α ∈ [1.57, 1.68]
├── 04_neural_avalanches.ipynb # mouse cortex → τ ≈ 2.58
└── 05_universal_collapse_demo.ipynb # 7-system shape-normalized collapse
Run any notebook end-to-end:
jupyter nbconvert --to notebook --execute notebooks/01_earthquake_b_value.ipynb \
--ExecutePreprocessor.timeout=600
Citation
If you use soc-pipeline in academic work, please cite:
@article{structural_isomorphism_2026,
author = "Structural Isomorphism Project",
title = "Cross-domain self-organized criticality: a 13-system validation suite",
year = 2026,
note = "Preprint, arXiv:TODO",
url = "https://github.com/dada8899/structural-isomorphism"
}
And the underlying methods:
- Clauset, A., Shalizi, C. R., & Newman, M. E. (2009). Power-law distributions in empirical data. SIAM Review, 51(4), 661–703.
- Alstott, J., Bullmore, E., & Plenz, D. (2014). powerlaw: a Python package for analysis of heavy-tailed distributions. PLoS ONE, 9(1), e85777.
- Vuong, Q. H. (1989). Likelihood ratio tests for model selection and non-nested hypotheses. Econometrica, 307–333.
- Aki, K. (1965). Maximum likelihood estimate of b in the formula log N = a − bM. Bull. Earthq. Res. Inst., 43, 237–239.
License
MIT — see LICENSE.
Status
Beta. API may change before 1.0. Issue tracker on GitHub welcomes bug reports and contributions, especially from new domains (please open an issue with a public dataset link).
Project details
Release history Release notifications | RSS feed
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 soc_pipeline-0.1.0.tar.gz.
File metadata
- Download URL: soc_pipeline-0.1.0.tar.gz
- Upload date:
- Size: 18.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
efbf3b6ebe161a8b7d5eea159588936b6226c46d64f8962aa3b197f6f84255cc
|
|
| MD5 |
e6a1dbd230e4e5972e4cd3d0d9d5667e
|
|
| BLAKE2b-256 |
8e9c0e713a6c720aca92f173354951077afb34c3b69087539c502e5c5a2ea54f
|
File details
Details for the file soc_pipeline-0.1.0-py3-none-any.whl.
File metadata
- Download URL: soc_pipeline-0.1.0-py3-none-any.whl
- Upload date:
- Size: 20.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2d39892bc6a86c4db820c7886d626040bf029af1ba7d842e5e5f9b2ca89f859e
|
|
| MD5 |
6426781282b55787cdf1c4e5b41f6bcf
|
|
| BLAKE2b-256 |
42fcff323a8df9c890220d3cdfe7ef774ae93276a600a81e2ca8f8094e49052c
|