Files
EquationMiner/tests/test_domini.py
T
davideandClaude Sonnet 5.5 b49af5c112 Domini corretti: riscaldamento = salita rapida, raffreddamento = decadimento dopo ogni gradino
- 1 + 2N domini: riposo, poi (riscaldamento, raffreddamento) per ogni gradino
- riscaldamento non fittato: descritto come salto (delta, da -> a, durata)
- raffreddamenti intermedi fissano c e tau a quelli del raffreddamento finale
- un colore per ogni raffreddamento nei grafici, zoom sui gradini
- sigma None (non NaN) nei domini non fittati: JSON valido

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-29 10:28:00 +01:00

77 lines
2.6 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)