This release is a pre-release and may not be stable for production use.
stoppower
Dimensionar la ventana de un criterio de detención por análisis de potencia, en vez de elegirla por costumbre.
pip install stoppower
El problema
Casi todo el mundo decide que un modelo "convergió" comparando dos o tres evaluaciones y aflojando la tolerancia cuando la detección falla. Eso ataca el término equivocado. En el caso medido (Zenodo 10.5281/zenodo.21630279), la ganancia total de detección se descompone en 7.0× por alargar la ventana y solo 1.31× por cambiar el estadístico. La tolerancia casi no mueve la aguja.
Peor: cuando la relación señal-ruido cae por debajo de 1, ninguna tolerancia recupera la decisión. El error tipo I y el tipo II dejan de poder separarse.
La regla
Para n evaluaciones equiespaciadas, el error estándar de la pendiente OLS decrece como
n^(-3/2), contra n^(-1/2) del simple promediado:
EE(b) = σ · sqrt( 12 / (n(n² − 1)) )
b* ≥ (z_α + z_β) · EE(b)
Uso
from stoppower import window_for, sigma_from_pilot, evaluate, prereg_text, pts
# 1) ¿Qué ventana necesito para no pasar por alto 1 punto de accuracy cada 2500 pasos?
plan = window_for(b_star=pts(1.0), sigma=0.0082, eval_every=500)
print(plan) # -> n=11 evaluaciones = 5000 pasos
# 2) ¿Qué potencia tiene la ventana que ya uso?
from stoppower import power_of
power_of(pts(1.0), sigma=0.0082, n=3, eval_every=500) # -> 0.097
# 3) Decidir con datos
evaluate(steps, accs, b_star=pts(1.0))
stoppower design --b-star 0.01 --sigma 0.0082 --eval-every 500 --prereg
stoppower power --b-star 0.01 --sigma 0.0082 --n 3 --eval-every 500
stoppower check historial.csv --b-star 0.01 --span 5000 10000
Un caso real, de punta a punta
Historial de validación de un modelo entrenado 10 000 pasos, evaluando cada 500. La pregunta es si en el tramo final sigue mejorando o ya se puede cortar.
$ stoppower check historial.csv --b-star 0.01 --span 5000 10000
sigma estimada en el tramo 5000-10000: 0.010593
INDECIDIBLE · pendiente +0.006424 por 2500 pasos (IC95 [-0.003474, +0.01632])
t=1.27 p=0.1017 · n=11 evaluaciones · potencia=0.63 para b*=0.01
! potencia 0.63 < 0.8: con esta ventana no se puede afirmar convergencia,
solo que no se detectó mejora. Alargá la ventana antes de concluir.
El criterio de dos puntos habría dicho "convergió". Acá el veredicto es indecidible, con el número al lado: la ventana no tiene potencia para sostener esa afirmación.
Y si en vez del tramo estable se le pide toda la corrida, avisa antes de responder:
$ stoppower check historial.csv --b-star 0.01 --span 500 10000
! el ruido cambia 7.4x dentro de la ventana (sigma=0.06951 en la 1ª mitad vs
0.009344 en la 2ª, más alto al principio): la ecuación supone ruido constante.
Acortá la ventana o corrésela al régimen estable.
Tres cosas que lo distinguen de copiar la fórmula
1. σ se estima en el tramo, no sobre toda la corrida. El ruido de validación no es constante. Medido sobre 8 semillas de un mismo modelo:
| paso | 500 | 1000 | 1500 | 2000 | 2500 | 5000 | 7500 |
|---|---|---|---|---|---|---|---|
| SD entre semillas | .101 | .073 | .038 | .010 | .014 | .009 | .011 |
Un factor 9. Quien meta una σ global en la ecuación se equivoca por un factor grande, y por eso
acá el tramo es un argumento obligatorio. homoscedasticity_check avisa cuando el supuesto de
ruido constante no se sostiene ni siquiera dentro de la ventana:
! el ruido cambia 7.4x dentro de la ventana (sigma=0.0695 en la 1ª mitad vs 0.0093 en la 2ª):
la ecuación supone ruido constante. Acortá la ventana o corrésela al régimen estable.
2. No confunde "no detecté mejora" con "convergió". evaluate devuelve converged=None
cuando la potencia no alcanza, en vez de dar un falso verde:
INDECIDIBLE · pendiente +0.0064 por 2500 pasos (IC95 [-0.0035, +0.0163])
t=1.27 p=0.1017 · n=11 evaluaciones · potencia=0.63 para b*=0.01
! potencia 0.63 < 0.8: no se puede afirmar convergencia, solo que no se detectó mejora.
3. Escupe el párrafo pre-registrable. prereg_text(plan) da el texto con σ, su procedencia, el
nivel, la potencia y la ventana resultante — para pegar en el protocolo antes de ver los datos.
Cómo estimar σ sin circularidad
| situación | función |
|---|---|
| el conjunto de validación se remuestrea | sigma_floor(p, n_val) — cota analítica, sin entrenar |
| conjunto fijo, tenés un piloto | sigma_from_pilot(steps, values, span=(desde, hasta)) |
| tenés varias semillas corridas | sigma_from_runs(runs, at_index=...) |
Fijar una ventana a partir de un piloto no es lo mismo que recalibrar una tolerancia después de ver los resultados: se fija el diseño, no el veredicto.
Alcance
Sin dependencias (solo la biblioteca estándar). No entrena, no toca tu bucle, no decide por vos. No modela el efecto del hardware: está medido que cambiar de backend aporta 0.53× la variación entre semillas en régimen tardío, despreciable frente a lo que ya se reporta.
Cita
Speranza, M. R. (2026). Stopping criteria below the signal-to-noise floor: window length, not tolerance, governs convergence detection in architecture comparisons. 10.5281/zenodo.21630279
MIT.
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 stoppower-0.1.0rc1.tar.gz.
File metadata
- Download URL: stoppower-0.1.0rc1.tar.gz
- Upload date:
- Size: 17.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
99a57eeb6eaf43f61a32eae0a89eb8d028f11b380eb9b5293ac399d067b4d07a
|
|
| MD5 |
ef72bacd24433e12a30a83cddb7ae7a1
|
|
| BLAKE2b-256 |
82fddcc4af85bfc760061d633f8f8e61bd8bdc6ebfea1154290cb6b5bc99bd22
|
Provenance
The following attestation bundles were made for stoppower-0.1.0rc1.tar.gz:
Publisher:
publish.yml on SperanzaMax/stoppower
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
stoppower-0.1.0rc1.tar.gz -
Subject digest:
99a57eeb6eaf43f61a32eae0a89eb8d028f11b380eb9b5293ac399d067b4d07a - Sigstore transparency entry: 2295985114
- Sigstore integration time:
-
Permalink:
SperanzaMax/stoppower@ddb9df46650ecb243e89ce7a09ff37aa9eb63e92 -
Branch / Tag:
refs/heads/master - Owner: https://github.com/SperanzaMax
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ddb9df46650ecb243e89ce7a09ff37aa9eb63e92 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file stoppower-0.1.0rc1-py3-none-any.whl.
File metadata
- Download URL: stoppower-0.1.0rc1-py3-none-any.whl
- Upload date:
- Size: 15.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e1aac41f81584cf54e05d67c2d19f69dbd1641e94ef908d071a2c5b2b25486fb
|
|
| MD5 |
941dc2b0a8d22213d1699a0d7cc5be52
|
|
| BLAKE2b-256 |
5f0e1f90b20f859e10f6e8bf89d16f08ab2a280868c9c154485486e2708830ec
|
Provenance
The following attestation bundles were made for stoppower-0.1.0rc1-py3-none-any.whl:
Publisher:
publish.yml on SperanzaMax/stoppower
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
stoppower-0.1.0rc1-py3-none-any.whl -
Subject digest:
e1aac41f81584cf54e05d67c2d19f69dbd1641e94ef908d071a2c5b2b25486fb - Sigstore transparency entry: 2295985130
- Sigstore integration time:
-
Permalink:
SperanzaMax/stoppower@ddb9df46650ecb243e89ce7a09ff37aa9eb63e92 -
Branch / Tag:
refs/heads/master - Owner: https://github.com/SperanzaMax
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ddb9df46650ecb243e89ce7a09ff37aa9eb63e92 -
Trigger Event:
workflow_dispatch
-
Statement type: