112 lines
3.9 KiB
Python
112 lines
3.9 KiB
Python
"""Riconoscimento dei domini (riposo / riscaldamento / raffreddamento) su segnali sintetici."""
|
|
|
|
import itertools
|
|
|
|
import pytest
|
|
from conftest import GRADINI, segnale
|
|
|
|
from fitseg import domini
|
|
|
|
|
|
def tipi(t, serie, cfg):
|
|
return [d["tipo"] for d in domini.proponi(t, serie, cfg)]
|
|
|
|
|
|
def test_tre_gradini(sintetico, cfg):
|
|
t, serie = sintetico
|
|
assert tipi(t, serie, cfg) == ["riposo", "riscaldamento", "raffreddamento", "riscaldamento", "raffreddamento",
|
|
"riscaldamento", "raffreddamento"]
|
|
|
|
|
|
def test_riscaldamento_e_la_salita_rapida(sintetico, cfg):
|
|
t, serie = sintetico
|
|
for d in domini.proponi(t, serie, cfg):
|
|
if d["tipo"] == "riscaldamento":
|
|
assert d["i1"] - d["i0"] <= 3 # pochi campioni
|
|
|
|
|
|
def test_confini_vicini_agli_istanti_dei_gradini(sintetico, cfg):
|
|
t, serie = sintetico
|
|
ds = domini.proponi(t, serie, cfg)
|
|
for d, (tj, _) in zip(ds[1::2], GRADINI, strict=True): # i riscaldamenti sono i domini 2, 4, 6
|
|
assert abs(t[d["i0"]] - tj) < 0.5
|
|
|
|
|
|
def test_domini_contigui_e_completi(sintetico, cfg):
|
|
t, serie = sintetico
|
|
ds = domini.proponi(t, serie, cfg)
|
|
assert ds[0]["i0"] == 0 and ds[-1]["i1"] == len(t)
|
|
assert all(a["i1"] == b["i0"] for a, b in itertools.pairwise(ds))
|
|
|
|
|
|
def test_senza_gradini_un_solo_riposo(cfg):
|
|
t, serie = segnale(gradini=[])
|
|
assert tipi(t, serie, cfg) == ["riposo"]
|
|
|
|
|
|
def test_un_solo_gradino(cfg):
|
|
t, serie = segnale(gradini=[(20.0, 80.0)])
|
|
assert tipi(t, serie, cfg) == ["riposo", "riscaldamento", "raffreddamento"]
|
|
|
|
|
|
def test_gradino_sotto_soglia_ignorato(cfg):
|
|
t, serie = segnale(gradini=[(20.0, 10.0)]) # 10 °C < soglia_gradino_c
|
|
assert tipi(t, serie, cfg) == ["riposo"]
|
|
|
|
|
|
def test_domini_toml_andata_e_ritorno(sintetico, cfg, tmp_path):
|
|
t, serie = sintetico
|
|
ds = domini.proponi(t, serie, cfg)
|
|
domini.scrivi_toml(tmp_path / "d.toml", ds, t)
|
|
assert domini.leggi_toml(tmp_path / "d.toml", t) == ds
|
|
|
|
|
|
def test_domini_toml_non_contigui_rifiutati(sintetico, tmp_path):
|
|
t, _ = sintetico
|
|
(tmp_path / "d.toml").write_text('[[dominio]]\ntipo="riposo"\nt0_s=0\nt1_s=10\n'
|
|
'[[dominio]]\ntipo="raffreddamento"\nt0_s=20\nt1_s=30\n')
|
|
with pytest.raises(ValueError, match="contigui"):
|
|
domini.leggi_toml(tmp_path / "d.toml", t)
|
|
|
|
|
|
def test_domini_toml_tipo_non_valido(sintetico, tmp_path):
|
|
t, _ = sintetico
|
|
(tmp_path / "d.toml").write_text('[[dominio]]\ntipo="boh"\nt0_s=0\nt1_s=10\n')
|
|
with pytest.raises(ValueError, match="non valido"):
|
|
domini.leggi_toml(tmp_path / "d.toml", t)
|
|
|
|
|
|
def test_gradino_distribuito_su_due_campioni_sotto_soglia(cfg):
|
|
# salita di 38 °C divisa in 19 + 19: nessun salto singolo supera `soglia_gradino_c` (20), la salita complessiva sì
|
|
t, serie = segnale(gradini=[])
|
|
T = serie["T_C"].copy()
|
|
i = 100
|
|
T[i + 1] += 19.0
|
|
T[i + 2:] += 38.0
|
|
ds = domini.proponi(t, {"T_C": T, "dT_C": T - 23.0}, cfg)
|
|
assert [d["tipo"] for d in ds] == ["riposo", "riscaldamento", "raffreddamento"]
|
|
assert ds[1]["i0"] == i + 1 and ds[1]["i1"] == i + 3
|
|
|
|
|
|
def test_salita_complessiva_sotto_soglia_non_e_un_gradino(cfg):
|
|
t, serie = segnale(gradini=[])
|
|
T = serie["T_C"].copy()
|
|
T[101] += 8.0
|
|
T[102:] += 16.0 # 16 °C in due campioni: sotto la soglia di 20
|
|
assert tipi(t, {"T_C": T, "dT_C": T - 23.0}, cfg) == ["riposo"]
|
|
|
|
|
|
def test_domini_toml_vuoto_rifiutato(sintetico, tmp_path):
|
|
t, _ = sintetico
|
|
(tmp_path / "d.toml").write_text("# nessun dominio\n")
|
|
with pytest.raises(ValueError, match="senza"):
|
|
domini.leggi_toml(tmp_path / "d.toml", t)
|
|
|
|
|
|
def test_domini_toml_intervallo_vuoto_rifiutato(sintetico, tmp_path):
|
|
t, _ = sintetico
|
|
(tmp_path / "d.toml").write_text('[[dominio]]\ntipo="riposo"\nt0_s=0\nt1_s=0\n'
|
|
'[[dominio]]\ntipo="raffreddamento"\nt0_s=0\nt1_s=30\n')
|
|
with pytest.raises(ValueError, match="vuoto"):
|
|
domini.leggi_toml(tmp_path / "d.toml", t)
|