39 lines
1.7 KiB
Python
39 lines
1.7 KiB
Python
"""Fit di tutti i modelli abilitati su ogni (dominio, serie) e scelta con la regola automatica."""
|
|
|
|
import numpy as np
|
|
|
|
from .domini import sigma_rumore
|
|
from .fit import adatta
|
|
from .selezione import scegli
|
|
|
|
|
|
def analizza_domini(t, serie, domini, cfg):
|
|
"""Ritorna la lista dei risultati, uno per dominio, con i fit di ogni serie e la scelta."""
|
|
c, f = cfg["domini"], cfg["fit"]
|
|
rng = np.random.default_rng(f["seed"])
|
|
risultati = []
|
|
for k, d in enumerate(domini, 1):
|
|
i0 = d["i0"] + (c["scarta_dopo_salto_n"] if d["tipo"] != "riposo" else 0)
|
|
i1 = d["i1"]
|
|
t0 = t[d["i0"]]
|
|
voce = {"k": k, "tipo": d["tipo"], "t0_s": float(t[d["i0"]]), "t1_s": float(t[i1 - 1]),
|
|
"n": int(i1 - d["i0"]), "n_fit": int(i1 - i0), "serie": {}}
|
|
for nome_serie, y in serie.items():
|
|
ty, yy = t[i0:i1] - t0, y[i0:i1]
|
|
sigma = sigma_rumore(yy)
|
|
voce_s = {"sigma": float(sigma), "fit": [], "scelta": None}
|
|
if len(yy) < c["n_min_punti"]:
|
|
voce_s["motivo"] = f"indeterminato: {len(yy)} campioni < n_min_punti"
|
|
else:
|
|
for m in f["modelli_abilitati"]:
|
|
from .modelli import MODELLI
|
|
if len(MODELLI[m][1]) > len(yy) - 2:
|
|
continue
|
|
voce_s["fit"].append(adatta(ty, yy, m, sigma, cfg, rng))
|
|
scelto, motivo, adeguato = scegli(voce_s["fit"], sigma, cfg)
|
|
voce_s["scelta"] = scelto["modello"] if scelto else None
|
|
voce_s["motivo"], voce_s["adeguato"] = motivo, adeguato
|
|
voce["serie"][nome_serie] = voce_s
|
|
risultati.append(voce)
|
|
return risultati
|