gen_data scaricato in extern/ (gitignorato) con scarica_gen_data.sh; test di validazione e documentazione collegati

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
davideandClaude Sonnet 5.5 committed 2026-10-30 08:57:20 +01:00
1 parent 5e8ed1a8a1
commit 875d480df1
9 files changed
+75 -17

No files matched your search

+1
View File
@@ -4,3 +4,4 @@ __pycache__/
*.egg-info/
.pytest_cache/
input/*.csv
extern/
+1 -1
View File
@@ -29,4 +29,4 @@ uv venv .venv && uv pip install -e ".[dev]" # installazione: docs/uso.md §1
.venv/bin/pytest # test: docs/test.md
```
`./pulisci.sh` pulisce i dati: svuota `output/` e cancella `input/*.csv`, con conferma ([docs/uso.md](docs/uso.md) §6).
I CSV da analizzare vanno in `input/` (dati di prova: `../gen_data genera.py --seed 7`, vedi [docs/uso.md](docs/uso.md) §2). Il report è `output/<csv>/03_report/report.md`.
I CSV da analizzare vanno in `input/` (dati di prova: `./scarica_gen_data.sh`, poi `extern/gen_data/genera.py --seed 7`, vedi [docs/uso.md](docs/uso.md) §2). Il report è `output/<csv>/03_report/report.md`.
+4 -4
View File
@@ -2,7 +2,7 @@
Ogni assunzione ha un identificativo (A1, A2, …) richiamato nel codice e negli altri documenti. Per ognuna: cosa si assume, perché è
ragionevole, **dove** il codice ne dipende e **cosa succede se è falsa**. Le assunzioni sul segnale valgono per i dati del generatore
`../gen_data` (sezione finale): su dati reali vanno verificate.
`extern/gen_data` (sezione finale): su dati reali vanno verificate.
## Dati
@@ -54,10 +54,10 @@ ragionevole, **dove** il codice ne dipende e **cosa succede se è falsa**. Le as
| **A23** | Il **riscaldamento non si fitta** (2–4 campioni). Il salto $\Delta$ si stima nell'ordine da: modelli dei domini adiacenti valutati all'istante del gradino; misura riportata a quell'istante con $c$ e $\tau$ del raffreddamento finale; misura sui campioni ($y_\text{fine salita} - y_\text{prima}$), che è per difetto (fino a ≈ 10–20 %: parte della salita cade sul campione precedente e l'ultimo campione è già decaduto) | `analisi._gradino`, `analisi._affina_salti` |
| **A24** | I **modelli provati** sono fissati per tipo di dominio in configurazione, non scelti dal programma | `[fit.modelli_per_tipo]` |
## Origine dei dati di prova (`../gen_data`)
## Origine dei dati di prova (`extern/gen_data`)
I CSV di prova si generano con `../gen_data`, che a ogni corsa (seed) **sorteggia** i parametri da intervalli: ogni seed è un segnale diverso
(dettaglio: `../gen_data/docs/SPEC.md` e `../gen_data/config.toml`). Gli intervalli che fondano le assunzioni sopra:
I CSV di prova si generano con `extern/gen_data`, che a ogni corsa (seed) **sorteggia** i parametri da intervalli: ogni seed è un segnale diverso
(dettaglio: `extern/gen_data/docs/SPEC.md` e `extern/gen_data/config.toml`). Gli intervalli che fondano le assunzioni sopra:
| Aspetto | Valore nel generatore | Assunzioni |
|---|---|---|
+1 -1
View File
@@ -24,7 +24,7 @@ di secondo (pochi campioni, **riscaldamento**) e subito dopo decade verso l'ambi
centro lo zoom sui tre gradini, in basso la tabella che associa a ogni numero tipo, intervallo ed equazione. Il riscaldamento è rosso, il riposo grigio e
ogni raffreddamento ha un colore diverso. Con 3 gradini i domini sono $1 + 2\cdot 3 = 7$.*
Il generatore dei dati di prova è il repository fratello `../gen_data` (modello e parametri: `../gen_data/docs/SPEC.md`): a ogni seed sorteggia numero
Il generatore dei dati di prova è il repository `gen_data` (clonato in `extern/gen_data` con `./scarica_gen_data.sh`) (modello e parametri: `extern/gen_data/docs/SPEC.md`): a ogni seed sorteggia numero
dei gradini (1–3), costante di tempo, rumore e disturbi, quindi ogni file ha una struttura diversa. Le sue caratteristiche che contano per `fitseg` sono
elencate in [assunzioni.md](assunzioni.md), sezione «Origine dei dati di prova».
+2 -2
View File
@@ -16,7 +16,7 @@
|---|---|---|---|
| **Unitari** | `test_domini`, `test_fit`, `test_selezione`, `test_config_dati` | segnale sintetico generato nei test (`conftest.py`) | niente |
| **Report e CLI** | `test_report`, `test_cli` | CSV sintetici scritti in una cartella temporanea | niente |
| **Validazione** | `test_validazione` | 20 seed generati al volo da `../gen_data`, confrontati con i suoi **parametri veri** | il repository fratello `../gen_data` (altrimenti i test sono saltati) |
| **Validazione** | `test_validazione` | 20 seed generati al volo da `extern/gen_data`, confrontati con i suoi **parametri veri** | `extern/gen_data`, da scaricare con `./scarica_gen_data.sh` (altrimenti i test sono saltati) |
Nessun test usa i file in `input/`: i test girano su un clone nuovo e non dipendono dal contenuto di quella cartella.
@@ -30,7 +30,7 @@ costruire casi particolari; `scrivi_csv(...)` scrive un CSV nel formato di `gen_
## Validazione contro i parametri veri (`test_validazione.py`)
`../gen_data` sorteggia a ogni seed i parametri di una corsa (numero e istanti dei gradini, ampiezze, $k$, rumore, scarti: [assunzioni.md](assunzioni.md), «Origine dei dati di
`extern/gen_data` sorteggia a ogni seed i parametri di una corsa (numero e istanti dei gradini, ampiezze, $k$, rumore, scarti: [assunzioni.md](assunzioni.md), «Origine dei dati di
prova»). Poiché il sorteggio è riproducibile (`genera.sorteggia(cfg, default_rng(seed))`), per ogni seed si conoscono i valori veri. Il test, per i seed 1–20,
genera il CSV, lancia l'analisi e controlla:
+5 -3
View File
@@ -22,12 +22,14 @@ t_ms,T_C,dT_C
301,22.63,0.03
```
I CSV di prova si generano con il repository fratello `../gen_data` (modello: `../gen_data/docs/SPEC.md`). A ogni seed il generatore sorteggia numero dei gradini
I CSV di prova si generano con il repository `gen_data` (modello: `extern/gen_data/docs/SPEC.md`), che non fa parte di questo repository: lo scarica
`./scarica_gen_data.sh` in `extern/gen_data` (cartella ignorata da git; `-u` lo aggiorna, `GEN_DATA_URL` cambia l'indirizzo, ad es. per SSH). Serve anche ai test di validazione ([test.md](test.md)). A ogni seed il generatore sorteggia numero dei gradini
(1–3), costante di tempo, rumore e disturbi: ogni file ha una struttura diversa.
```bash
./scarica_gen_data.sh
mkdir -p input
(cd ../gen_data && .venv/bin/python genera.py config.toml --seed 7 -o ../EquationMiner/input/gen_7.csv)
(cd extern/gen_data && ../../.venv/bin/python genera.py config.toml --seed 7 -o ../../input/gen_7.csv)
```
I test **non** richiedono questi file: generano i dati da soli ([test.md](test.md)).
@@ -80,7 +82,7 @@ Gli errori sono stampati su stderr in italiano come `Errore: …`.
./pulisci.sh -y # tutto, senza chiedere conferma
```
Cancella: il contenuto di `output/` (cartella di `[output] cartella_output`: risultati che si rifanno rilanciando `fitseg analizza`) e i file `*.csv` in `input/`
(i dati grezzi: **non** si rigenerano da soli, si rifanno con `../gen_data`, §2, per questo chiede conferma salvo `-y`). Le cartelle e i loro `.gitkeep`
(i dati grezzi: **non** si rigenerano da soli, si rifanno con `./scarica_gen_data.sh` e `genera.py`, §2, per questo chiede conferma salvo `-y`). Le cartelle e i loro `.gitkeep`
restano; i file di `input/` che non sono `.csv` non si toccano. Rifiuta percorsi di output assoluti o con `..`. Codici di uscita: 0 ok (o niente da pulire), 1 annullato o
percorso non sicuro, 2 opzione sconosciuta.
+2 -2
View File
@@ -11,8 +11,8 @@ uso: ./pulisci.sh [-n] [-y] [--solo-output]
Cancella i dati:
- il contenuto della cartella di output ([output] cartella_output in config.toml, default "output"):
risultati generati da `fitseg`, si rifanno rilanciando l'analisi. La cartella resta;
- i file *.csv in input/: i dati grezzi, NON si rifanno da soli (vanno rigenerati con ../gen_data,
vedi docs/uso.md §2). La cartella e il suo .gitkeep restano.
- i file *.csv in input/: i dati grezzi, NON si rifanno da soli (vanno rigenerati con extern/gen_data
(./scarica_gen_data.sh), vedi docs/uso.md §2). La cartella e il suo .gitkeep restano.
Chiede conferma prima di cancellare, salvo -y.
+55
View File
@@ -0,0 +1,55 @@
#!/usr/bin/env bash
# Clona (o aggiorna) il generatore di dati di prova gen_data in extern/gen_data, cartella ignorata da git.
set -euo pipefail
cd "$(dirname "$0")"
URL_DEFAULT="https://santantonio.sytes.net/cevolani/gen_data.git"
DEST="extern/gen_data"
uso() {
cat <<E2
uso: ./scarica_gen_data.sh [-u] [-h]
Clona $URL_DEFAULT in $DEST (cartella ignorata da git: non fa parte di questo repository).
Servono i file genera.py e config.toml: tests/test_validazione.py li cerca lì e, se mancano, salta i test.
Per usare un altro indirizzo (es. SSH) imposta GEN_DATA_URL.
opzioni:
-u, --aggiorna se la cartella esiste già, la porta all'ultima versione (git pull --ff-only)
-h, --help mostra questo aiuto
esempi:
./scarica_gen_data.sh
./scarica_gen_data.sh -u
GEN_DATA_URL=ssh://git@santantonio.sytes.net:2223/cevolani/gen_data.git ./scarica_gen_data.sh
E2
}
aggiorna=0
for a in "$@"; do
case "$a" in
-u|--aggiorna) aggiorna=1 ;;
-h|--help) uso; exit 0 ;;
*) echo "scarica_gen_data.sh: opzione non riconosciuta: $a" >&2; uso >&2; exit 2 ;;
esac
done
url=${GEN_DATA_URL:-$URL_DEFAULT}
if [ -d "$DEST/.git" ]; then
if [ "$aggiorna" -eq 1 ]; then
git -C "$DEST" pull --ff-only
else
echo "$DEST esiste già (usa -u per aggiornarlo)"
fi
elif [ -e "$DEST" ]; then
echo "scarica_gen_data.sh: $DEST esiste e non è un repository git" >&2
exit 1
else
mkdir -p extern
git clone "$url" "$DEST"
fi
[ -f "$DEST/genera.py" ] || { echo "scarica_gen_data.sh: $DEST/genera.py non trovato" >&2; exit 1; }
echo "pronto: $DEST ($(git -C "$DEST" rev-parse --short HEAD))"
+4 -4
View File
@@ -1,5 +1,5 @@
"""Validazione contro i parametri VERI di gen_data: ../gen_data sorteggia i parametri di ogni corsa dal seed, quindi per ogni seed si
conoscono gradini, ampiezze e costante di tempo. Richiede il repository fratello ../gen_data (altrimenti i test sono saltati)."""
"""Validazione contro i parametri VERI di gen_data: extern/gen_data sorteggia i parametri di ogni corsa dal seed, quindi per ogni seed si
conoscono gradini, ampiezze e costante di tempo. Richiede extern/gen_data, che si scarica con ./scarica_gen_data.sh (altrimenti i test sono saltati)."""
import sys
@@ -10,8 +10,8 @@ from conftest import RADICE
from fitseg import dati, domini
from fitseg.analisi import analizza_domini, fit_scelto
GEN = RADICE.parent / "gen_data"
pytestmark = pytest.mark.skipif(not (GEN / "genera.py").exists(), reason="repository ../gen_data non trovato")
GEN = RADICE / "extern" / "gen_data"
pytestmark = pytest.mark.skipif(not (GEN / "genera.py").exists(), reason="extern/gen_data non trovato: lancia ./scarica_gen_data.sh")
@pytest.fixture(scope="module")