2026-07-16
Navigate: ← → or the corner buttons.
| Item | Setting |
|---|---|
| Basins / scale | 673 CAMELS basins, lumped (basin-mean forcing), daily |
| Forcing | Maurer (primary, Newman convention) + Daymet (sensitivity); Oudin PET |
| Split | train 1999-10→2008-09 · test 1989-10→1999-09 (untouched decade) |
| CREST config | Snow-17(9) + water balance(5) + reservoirs(5) + triangular UH(1) = 20 params/basin, direct sigmoid-bounded, Adam on (1−NSE), best-TRAIN-iterate selection |
| Comparison models | HBV(14p) & EXP-HYDRO(6p) re-implemented differentiably, trained in the identical harness; SAC-SMA = Newman's published per-basin SCE runs (their own best; we only compute metrics) |
| Single metric code | every row evaluated by one script (plain NSE/KGE, same window, ≥1000 valid days) |
| Audit | independent leakage audit; obs-parity gate vs Newman r=1.0000; two header-area bugs + a window off-by-one found and fixed before publishing numbers |
| Model | Calib | med NSE | med KGE | β |
|---|---|---|---|---|
| SAC-SMA + Snow-17 (published) | per-basin | 0.662 | 0.717 | 0.94 |
| HBV (ours, same harness) | per-basin | 0.639 | 0.671 | 1.00 |
| CREST+UH · β-loss · Daymet | per-basin | 0.608 | 0.664 | 0.946 |
| CREST+UH · Maurer | per-basin | 0.600 | 0.636 | 0.891 |
| CREST no-UH · Maurer | per-basin | 0.519 | 0.565 | 0.87 |
| EXP-HYDRO (ours, same harness) | per-basin | 0.523 | 0.621 | 1.03 |
| CREST-dPL (regional) | one net | 0.462 | 0.436 | 0.82 |
| CREST-dPL (PUB, ungauged) | zero-shot | 0.44–0.46 | 0.43 | 0.81 |
| context (Kratzert 2019): LSTM ens. 0.74 · mHM 0.66 · HBV-ub 0.68 · VIC 0.55 · FUSE 0.65–0.72 | ||||
Forcing note: SAC-SMA, HBV and EXP-HYDRO rows use Maurer (Newman convention). Matched-forcing comparison: CREST+UH·Maurer 0.600 vs SAC-SMA 0.662. The Daymet row's edge over Maurer is only +0.002 once UH is present — its gain comes from the β-loss, not the forcing.
Component-by-component, the SAC-SMA and CREST rows differ in one place:
| Component | SAC-SMA (Newman setup) | CREST+UH (ours) | Equivalent? |
|---|---|---|---|
| Snow | Snow-17 | Snow-17 | ✅ identical |
| Routing | calibrated Gamma UH (2 params: shape, scale) — SAC-SMA itself contains no routing; the UH is bolted on (CAMELS readme-verified) | calibrated triangular UH (1 param: maxbas) | ✅ same class (theirs slightly more flexible) |
| PET demand | Priestley–Taylor, calibrated coefficient | Oudin × calibrated ke multiplier | ✅ same class |
| Water balance | dual-zone, four stores: tension/free-water separation in both zones, two nonlinear baseflow reservoirs, demand-driven percolation | single VIC bucket + one linear groundwater store | ❌ the entire gap |
CAMELS basins are small–medium (median ≈ 336 km²; concentration time mostly < 1 day). Daily aggregation hides wave dynamics — a calibrated UH captures all the timing freedom that is visible at this scale (our Stage-3 test: daily KW ≈ UH). So the benchmark is effectively a controlled experiment on the water-balance structure alone.
Snow identical, routing & PET equivalent, optimizer verified (Adam = SCE-UA), seeds agree ⇒ the 0.662 vs 0.608 gap has a single attributable source: SAC-SMA's five-decades-engineered vertical soil architecture (tension/free water, dual baseflow). That is exactly the structure the 3-layer CREST kernel targets — pending layered soil priors to make the extra storages identifiable.
| Experiment | Design | Result | Reading |
|---|---|---|---|
| UH routing | identical config ± differentiable triangular UH (maxbas) | 0.519 → 0.600 (+0.08) | hydrograph-shape freedom; water balance still sets the volume |
| Forcing | Maurer vs Daymet, same everything | +0.06 without UH; ≈0 with UH | UH absorbs timing differences between products |
| Convergence control | warm-start + cosine LR, plain NSE loss (isolates optimization) | 0.600 → 0.602 (+0.008 trainer-metric) | baseline was ~converged; small honest gain |
| β (bias) loss | NSE + 2(β−1)² penalty, selection metric matched | β 0.87→0.946, KGE +0.03, mean NSE +0.04, median ≈ flat | volumetric under-bias was a loss artifact (loss-tolerated leak), fixed for free |
| Multi-seed + merge | 3 seeds; per-basin best-TRAIN merge across runs | seeds land 0.595–0.598; merge loses | optimization surface effectively flat across seeds; train-argmax picks noise — rejected honestly |
| 3-layer soil (A/B) | new differentiable 3-layer kernel vs single-layer, same harness/loss | 0.610 vs 0.608 (tie); KGE 0.671 = HBV parity; train +0.04 didn't transfer | vertical storage split not identifiable from streamflow alone — kept for the gridded stage where layered soil priors constrain it |
| Optimizer | Budget | Wall-clock | train NSE | test NSE | test KGE | β |
|---|---|---|---|---|---|---|
| Adam (backprop) | 400 iterations | 8–13 h | ~0.67 | 0.600–0.602 | 0.636–0.648 | 0.89–0.92 |
| SCE-UA v1 (same wall-clock) | 2,542 evals | 11.8 h | 0.617 | 0.564 | 0.597 | 0.874 |
| SCE-UA v2 (limit) | 10,000 evals | 72 h | 0.666 | 0.597 | 0.640 | 0.908 |
| Mode | med NSE |
|---|---|
| per-basin (upper ref) | 0.600 |
| dPL time-split (seen basins) | 0.462–0.478 |
| dPL PUB (ungauged, 3 folds) | 0.44–0.46 |
Key reading: seen→unseen drop is tiny (0.475 → 0.44) — the attribute→parameter mapping generalizes spatially. Regional LSTM PUB (~0.53–0.56) stays above, as expected for 20-parameter physics.
Two signatures of under-constraint → motivates multi-source constraints (soil moisture / ET / storage) in the next phase.