- docs/SPEC.md sostituito da un file per argomento (indice in docs/README.md) - assunzioni A1-A24 con dove nel codice e cosa succede se false - formule in LaTeX corrette (nessuno spazio prima del dollaro di chiusura), simboli e chiavi in tabella - diagrammi Mermaid per il flusso degli algoritmi e le dipendenze dei moduli - figura dei domini sul seed 1 (docs/img/domini_esempio.png) - README ridotto a indice con avvio rapido; CLAUDE.md e docstring allineati Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
5.1 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
fitseg legge un CSV t_ms,T_C,dT_C (temperatura di un sensore IR), lo divide in domini (riposo / riscaldamento = la salita rapida di un gradino, 2–3 campioni / raffreddamento = il decadimento dopo ogni gradino) e trova per ogni (dominio, serie) l'equazione che meglio lo approssima. Documentazione, commenti e messaggi sono in italiano: mantieni la lingua.
Fonti di verità (non duplicarne il contenuto): la documentazione in docs/ — assunzioni (A1–A24, richiamate nel codice), algoritmi, moduli, configurazione, output, test, limiti — e config.toml, unica fonte dei valori: nessun default nel codice, ogni chiave nuova va in CHIAVI di src/fitseg/config.py e in docs/configurazione.md. Il README è solo un indice con l'avvio rapido. Quando cambi comportamento aggiorna il file di docs corrispondente (e le assunzioni se ne cambia una).
Comandi
uv venv .venv && uv pip install -e ".[dev]"
.venv/bin/fitseg domini input/gen_1.csv # passo 1: output/gen_1/01_domini/ (domini.png, domini.toml), nessun fit
.venv/bin/fitseg analizza input/gen_1.csv [--domini output/gen_1/01_domini/domini.toml] # tutti i passi → output/gen_1/{01_domini,02_sovrapposizione,03_report}
.venv/bin/pytest # tutti; singolo: -k raffreddamento o tests/test_fit.py
.venv/bin/ruff check src tests
--config/--output vanno prima del sottocomando. input/ contiene i CSV da analizzare; output/ e input/*.csv sono ignorati da git. Ogni analisi scrive in output/<nome csv>/ (01_domini, 02_sovrapposizione, 03_report, vedi uscita.PASSI).
Architettura (src/fitseg/, un modulo per responsabilità)
cli.py (due sottocomandi, unico punto d'ingresso) → config.py, dati.py (lettura) → domini.py (gradini ⇒ domini, I/O di domini.toml) → analisi.py (ordina i domini, sceglie il modello) → fit.py (adatta) con modelli.py (registro MODELLI) → uscita.py (cartelle dei passi, grafici, report; il report incorpora le immagini con percorsi relativi ../01_domini/…, quindi i nomi dei file/cartelle vanno cambiati in modo coerente). Nel report ogni grandezza matematica è in LaTeX ($…$, $$…$$; l'equazione in MODELLI è LaTeX, i valori si formattano con uscita._num): usa \\ solo in stringhe raw e mantieni i $ bilanciati per riga (c'è un test).
- I domini derivano solo dai gradini positivi di
serie_riferimento(diff > soglia_gradino_c): la salita (estesa ai campioni adiacenti ancora in salita) è unriscaldamento, il tratto dopo è unraffreddamento; con N gradini i domini sono 1 + 2N.domini.tomlè modificabile e deve essere contiguo. analisi.analizza_domini: il raffreddamento finale (ultimo) si fitta per primo, libero; i raffreddamenti intermedi fissanoc/tauai suoi valori (raffreddamento_intermedio_fissa_da_finale,adatta(..., fissi=)). Ilriscaldamentonon si fitta:_gradinone riporta il salto (vs["gradino"],sigmaNone). Modelli per tipo in[fit.modelli_per_tipo](riposo, raffreddamento).fit.adatta:least_squarescon perdita robusta; l'esponenziale parte da una griglia su τ. "Non identificabile" = condizione > soglia o IC 95 % > |valore| per un parametro diverso daa/c. σ del rumore per dominio daMAD(d²y); tempo traslato at' = t − t0.- Nuovo modello = voce in
modelli.py+ riga in docs/algoritmi.md §5.1 e in docs/moduli.md + nome in[fit.modelli_per_tipo]. Non ci sono partenze casuali: il programma è deterministico.
Test
Unitari su un segnale sintetico generato in tests/conftest.py (τ = 16 s, 3 gradini, nessun disturbo a salto): non servono i CSV. Integrazione su input/gen_{1,2,3}.csv (prodotti da ../gen_data: .venv/bin/python genera.py config.toml --seed N -o ...) e sulla CLI: saltati se i CSV mancano. Verità di gen_data: τ = 1/k = 15.9 s (k perturbato del 2 % per seed), 3 gradini a ≈15.7/17.8/21.7 s, ambiente ≈ 23 °C, scarti casuali ≤ 4 °C che rendono i residui autocorrelati (limite noto, non un bug).
Gotcha
- La salita del gradino (campioni di transizione del sensore, τ_sensore 0.07 s, dt 0.15 s) appartiene al
riscaldamento, non al raffreddamento: sesoglia_bordo_sigmaè troppo alta un campione parziale può finire nel raffreddamento (scarta_dopo_salto_nlo esclude dal fit). - Raffreddamenti intermedi di 12–25 campioni: con gli scarti casuali τ non è identificabile da solo (su dati puliti sì), quindi è fisso al valore del finale; gli IC di
Asono condizionati. Senza un finale valido tornano liberi e possono risultare indeterminati. - Cambiando la config di
gen_data(gradini, rumore) ricontrollasoglia_gradino_ce i test di integrazione. - Exit code: 0 ok · 2 uso · 3 config · 4 CSV · 6 domini non validi.