From 875d480df11c246efa9400068790484643d89546 Mon Sep 17 00:00:00 2001 From: Davide Grilli Date: Fri, 30 Oct 2026 08:57:20 +0100 Subject: [PATCH] gen_data scaricato in extern/ (gitignorato) con scarica_gen_data.sh; test di validazione e documentazione collegati Co-Authored-By: Claude Sonnet 5.5 --- .gitignore | 1 + README.md | 2 +- docs/assunzioni.md | 8 +++--- docs/panoramica.md | 2 +- docs/test.md | 4 +-- docs/uso.md | 8 +++--- pulisci.sh | 4 +-- scarica_gen_data.sh | 55 +++++++++++++++++++++++++++++++++++++++ tests/test_validazione.py | 8 +++--- 9 files changed, 75 insertions(+), 17 deletions(-) create mode 100755 scarica_gen_data.sh diff --git a/.gitignore b/.gitignore index 037f285..d575c3b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ __pycache__/ *.egg-info/ .pytest_cache/ input/*.csv +extern/ diff --git a/README.md b/README.md index dd07ed0..fdd5f59 100644 --- a/README.md +++ b/README.md @@ -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//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//03_report/report.md`. diff --git a/docs/assunzioni.md b/docs/assunzioni.md index be21872..d56f704 100644 --- a/docs/assunzioni.md +++ b/docs/assunzioni.md @@ -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 | |---|---|---| diff --git a/docs/panoramica.md b/docs/panoramica.md index a6265f4..4ebaea5 100644 --- a/docs/panoramica.md +++ b/docs/panoramica.md @@ -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». diff --git a/docs/test.md b/docs/test.md index 09e3af9..af3b466 100644 --- a/docs/test.md +++ b/docs/test.md @@ -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: diff --git a/docs/uso.md b/docs/uso.md index cadbf06..e03d8ac 100644 --- a/docs/uso.md +++ b/docs/uso.md @@ -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. diff --git a/pulisci.sh b/pulisci.sh index d3717cd..4857578 100755 --- a/pulisci.sh +++ b/pulisci.sh @@ -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. diff --git a/scarica_gen_data.sh b/scarica_gen_data.sh new file mode 100755 index 0000000..b6de8b9 --- /dev/null +++ b/scarica_gen_data.sh @@ -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 <&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))" diff --git a/tests/test_validazione.py b/tests/test_validazione.py index 047e48a..aa0465f 100644 --- a/tests/test_validazione.py +++ b/tests/test_validazione.py @@ -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")