27 Commits

Author SHA1 Message Date
davide 51bb8e5fc8 docs: aggiunge README approfondito con descrizione fisica, architettura e utilizzo
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 08:35:08 +02:00
davide b6598fb7d8 fix: corregge segno Robin BC a x=0 (era + doveva essere -)
A x=0 la normale uscente è -x, quindi la condizione Robin corretta è
dT/dx - (h/k)(T-T_amb) = 0, speculare a x=L dove vale dT/dx + (h/k)(T-T_amb) = 0.
Il segno errato causava T(0,t) sotto T_amb (~12°C) con sorgente attiva.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 16:12:38 +02:00
davide 5a8cd3ef46 fix: normalizza x in forward() dividendo per L
Rende la normalizzazione degli input simmetrica: x/L e t/T_END
entrambi in [0,1], indipendentemente dal valore di L in config.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 16:08:18 +02:00
davide f94fd51942 fix: corregge normalizzazione BC loss con _bc_scale analitico
Il termine convettivo H_CONV/K*(T-T_AMB) domina il residuo Robin di un
fattore H*L/K=10 rispetto al gradiente, rendendo L_bc ~100x sovrastimata
rispetto a L_pde. Sostituisce grad_char=(Q/K)² con _bc_scale=max(Q/K,
H*T_char/K)² (~2.25e6) per bilanciare correttamente i termini della loss.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 16:07:49 +02:00
davide b8301a4329 test: aggiunge suite completa — unit, integration ed e2e (42 test)
- pytest.ini: configura testpaths, marker slow, output verboso
- tests/conftest.py: fixture condivise (device, small_data, pinn_model)
- tests/test_config.py: sanità parametri fisici e numerici, CFL, _pde_scale
- tests/test_model.py: HeatPINN.forward e heat_pinn_loss (shape, finiti,
  zero-weight analytici per IC e BC, scaling dei pesi)
- tests/test_engine_data.py: set_seed, _get_device, prepare_data
  (shape, bounds, device consistency, determinismo)
- tests/test_integration_pinn.py: pipeline dati→modello→loss→backward
- tests/test_e2e.py: FDM completo, visualizer FDM/PINN con tmp_path,
  training breve (2 test @slow)
- requirements.txt: aggiunge pytest>=7.0.0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 15:50:54 +02:00
davide 1237a57290 clear.sh: aggiunge menu per ripulire risultati PINN oltre a FDM
Estrae la logica interattiva in cleanup_dir() e aggiunge un menu di primo
livello con le opzioni: FDM, PINN, Entrambi, Annulla.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 15:50:42 +02:00
davide e868c47190 PINN: normalizza t in forward(), corregge _pde_scale e aumenta patience
- forward(): divide t per T_END prima di passarlo alla rete, evita saturazione
  di Tanh per t∈[0,10] e migliora la sensibilità temporale del modello
- _pde_scale: include il picco gaussiano della sorgente come denominatore;
  con GAUSS_SIGMA=0.01 il picco (~60 °C/s) supera T_char/T_END (15), rendendo
  la loss PDE non normalizzata senza questa correzione
- PATIENCE 100→500, SCHED_PATIENCE 30→150: il training ha ora spazio per
  convergere prima che l'early stopping o lo scheduler blocchino l'ottimizzatore

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 15:50:36 +02:00
davide 649d26cfd4 config: W_BC 1→5, N_F 4000→6000, GAUSS_SIGMA 0.02→0.01
W_BC=1 causava temperatura sub-ambiente (11.93°C < T_AMB=20°C) perché
i bordi erano poco vincolati; 5 è bilanciamento tra evitare trivial solution
(W_BC=10) e rispettare le BC di Robin (W_BC=1).
N_F aumentato per coprire meglio il dominio temporale tardo dove l'errore
cresceva (max 12.87°C a t=10s).
GAUSS_SIGMA ridotto per avvicinarsi alla sorgente puntuale del FDM e
ridurre il mismatch fisico che causava L2=11.6%.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 15:21:48 +02:00
davide 256945ada3 PINN: ripristina forward() originale, aumenta LBFGS_STEPS e corregge pesi loss
Il training collassava alla soluzione banale T=T_AMB perché W_BC=10 spingeva
Adam a soddisfare le Robin BC (trivialmente, con gradiente zero) sacrificando
la PDE. Fix: W_PDE=10, W_BC=1 così la PDE domina il gradiente fin dal primo
epoch. LBFGS_STEPS: 20→200 perché L-BFGS era l'unico ottimizzatore a fare
progressi reali. forward(): rimossa moltiplicazione t_norm che causava
vanishing gradient su dT/dx e d²T/dx².

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 14:50:18 +02:00
davide f02c5f2bbe PINN: vincolo IC hard — moltiplica output per t_norm per evitare trivial solution
La normalizzazione introdotta (x,t in [0,1]²) rendeva il minimo banale
net=0 (T=T_AMB ovunque) troppo accessibile, causando il collasso del training.
Soluzione: T = T_AMB + T_char * (t/T_END) * net(x_norm, t_norm).
Così T(x,0) = T_AMB per costruzione (vincolo hard) e la rete deve trovare
soluzioni non banali per t>0. La loss IC resta ma è sempre 0.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 14:28:00 +02:00
davide 9e77deffd5 PINN: risolve problemi minori — sigma in config, scale precompilate, closure fuori loop
- config.py: aggiunge GAUSS_SIGMA = 0.02 nella sezione parametri fisici
- model.py: T_char, grad_char, pde_scale diventano costanti di modulo (_T_char,
  _grad_char, _pde_scale) calcolate una sola volta all'import
- engine.py: closure L-BFGS definita una volta sola fuori dal loop

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 14:23:33 +02:00
davide bca829bd7e PINN: sposta model.train() fuori dal loop e aggiunge weights_only a torch.load
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 14:21:17 +02:00
davide 98bfc78651 PINN: normalizza input in [0,1]² e ottimizza autograd
- forward(): divide (x,t) per (L, T_END) prima di passare alla rete,
  così le due dimensioni hanno la stessa scala indipendentemente da T_END
- heat_pinn_loss: calcola dT_dt e dT_dx in un singolo backward pass
  usando autograd.grad con lista [t_f, x_f]

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 14:20:20 +02:00
davide fbb0458f69 PINN: allinea output a results/pinn/ e centralizza parametri in config
- visualizer.py: sostituisce animations/ con results/pinn/TIMESTAMP/,
  nomi fissi (heatmap.html, animation.html, comparison.html) come FDM
- config.py: aggiunge sezioni architettura, sampling, Adam, L-BFGS, loss weights
- model.py: costruisce HeatPINN dinamicamente da HIDDEN_SIZE/N_HIDDEN_LAYERS;
  heat_pinn_loss legge pesi W_PDE/W_IC/W_BC da config
- engine.py: tutti i parametri di training letti da config

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 14:14:11 +02:00
davide 4f050e80df Estende scope di lavoro a tutto il repository
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 13:59:34 +02:00
davide b5553691e8 Merge branch 'fdm': output timestampato, heatmap animata, menu semplificato
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 13:19:50 +02:00
davide a655e53551 FDM: heatmap.html con due grafici indipendenti, statico e striscia animata
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 12:29:27 +02:00
davide fa5ce5d19c Aggiunge clear.sh per pulizia interattiva di results/fdm/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 12:17:44 +02:00
davide 1a530e86ba FDM: semplifica menu da 4 voci a Risolvi/Visualizza/Esci
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 12:16:17 +02:00
davide 54a7e9aed9 FDM: salva risultati in results/fdm/<timestamp>/ invece di animations/fdm/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 12:16:13 +02:00
davide 19207cabe4 Aggiunge vincolo scope FDM-only in CLAUDE.md
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 12:16:09 +02:00
davide b663a89abd Allinea PINN alla fisica FDM: sorgente interna e BC Robin bilaterali
- model.py: aggiunge termine sorgente Gaussiana (σ=0.02) nella PDE loss
  per approssimare δ(x − X_SRC); sostituisce BC Neumann a x=0 con Robin
- engine.py: clustering collocation vicino X_SRC anziché x=0;
  downsample FDM su entrambi gli assi spaziale e temporale in evaluate_model()
- visualizer.py: downsample FDM su entrambi gli assi prima del plot
- app.py: aggiorna header con fisica corrente
- CLAUDE.md: aggiorna PDE, BC e note architetturali

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 12:07:14 +02:00
davide 687ff45512 Aggiorna parametri FDM config.py 2026-05-13 23:25:22 +02:00
davide 15510a06d1 generalizzazione sorgente FDM a posizione arbitraria x_src
Sostituisce la BC Neumann ghost-cell a x=0 con BC Robin su entrambi
i bordi. Q(t) viene iniettato come termine sorgente puntuale al nodo
più vicino a X_SRC, dopo le BCs per non essere sovrascritto.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 22:02:22 +02:00
davide 378a3b1676 aggiunta suite di test fisici per fdm/solver.py
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 22:01:48 +02:00
davide 99a42e53c7 aggiunta istruzione commit in italiano e parametro X_SRC in config
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 22:00:27 +02:00
davide a9f423fcd9 Commit iniziale 2026-05-13 21:24:26 +02:00