Semplifica: CLI a due comandi, moduli piatti, solo modelli usati; test unitari su segnale sintetico

- rimossi scripts/, stadi.py, docs/USO.md, modelli non usati, partenze casuali, output ridondanti
- uscita unica (report.md con grafici per dominio, risultati.json, proposta.png)
- test: unitari su segnale sintetico, integrazione su dati/gen_*.csv (saltati se mancano)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
davideandClaude Sonnet 5.5 committed 2026-10-29 10:13:01 +01:00
1 parent b8c8aeb60e
commit d92bcd198b
22 files changed
+678 -683

No files matched your search

+43
View File
@@ -0,0 +1,43 @@
"""Fixture comuni: configurazione, segnale sintetico (verità nota) e CSV generati da gen_data (se presenti)."""
from pathlib import Path
import numpy as np
import pytest
from fitseg import config
RADICE = Path(__file__).parent.parent
SEEDS = [1, 2, 3]
# verità del segnale sintetico
TAU, T_AMB = 16.0, 23.0
GRADINI = [(15.0, 80.0), (18.0, 70.0), (22.0, 60.0)] # (istante [s], ampiezza [°C])
@pytest.fixture(scope="session")
def cfg():
return config.leggi(RADICE / "config.toml")
def segnale(rumore=0.1, seed=0, gradini=GRADINI, durata=120.0, dt=0.15):
"""T(t) = ambiente + Σ ampiezza·exp(−(t−t_j)/τ) per t ≥ t_j, più rumore gaussiano: nessun disturbo a salto."""
rng = np.random.default_rng(seed)
t = np.arange(dt, durata, dt)
x = sum(a * np.exp(-(t - tj) / TAU) * (t >= tj) for tj, a in gradini) if gradini else np.zeros_like(t)
T = T_AMB + x + rumore * rng.standard_normal(len(t))
return t, {"T_C": T, "dT_C": T - T_AMB}
@pytest.fixture(scope="session")
def sintetico():
return segnale()
@pytest.fixture(params=SEEDS)
def csv_gen(request):
"""CSV prodotto da gen_data per il seed; il test è saltato se il file non c'è (dati/ non è in git)."""
percorso = RADICE / f"dati/gen_{request.param}.csv"
if not percorso.exists():
pytest.skip(f"{percorso} assente: rigenera con gen_data (vedi README)")
return percorso