Files
EquationMiner/src/fitseg/pipeline.py
T

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