.cache/known_methods_snapshot.json CHANGED
@@ -276,6 +276,41 @@
276
  "ies-tmcmc",
277
  "boed-tmcmc"
278
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
279
  }
280
  },
281
  "observed_methods": [
 
276
  "ies-tmcmc",
277
  "boed-tmcmc"
278
  ]
279
+ },
280
+ "eks": {
281
+ "abbreviation": "EKS",
282
+ "Method": "Ensemble Kalman Sampler",
283
+ "parallelism": "parallel-interacting",
284
+ "update_type": "gradient (Kalman)",
285
+ "method_goal": "uq",
286
+ "emulator_use": "none",
287
+ "aliases": [
288
+ "eks",
289
+ "sampler"
290
+ ]
291
+ },
292
+ "ces-eks": {
293
+ "abbreviation": "CES-EKS",
294
+ "Method": "Calibrate Emulate Sample (Ensemble Kalman Sampler)",
295
+ "parallelism": "parallel-interacting",
296
+ "update_type": "gradient (Kalman)",
297
+ "method_goal": "uq",
298
+ "emulator_use": "after-optimize",
299
+ "aliases": [
300
+ "ces-eks"
301
+ ]
302
+ },
303
+ "ies-eks": {
304
+ "abbreviation": "IES-EKS",
305
+ "Method": "Iterated Emulate-Sample (EKS)",
306
+ "parallelism": "parallel-interacting",
307
+ "update_type": "general",
308
+ "method_goal": "uq",
309
+ "emulator_use": "within-optimize",
310
+ "aliases": [
311
+ "ies-eks",
312
+ "boed-eks"
313
+ ]
314
  }
315
  },
316
  "observed_methods": [
CLAUDE.md CHANGED
@@ -83,7 +83,9 @@ calibration_benchmark/
83
  │ ├── rl-td3/ RL-TD3-SHORT / RL-TD3 (TD3 variant of the RL experiments; RL-TD3 files are `rl-td3-long` in the NetCDF) results (per-benchmark files)
84
  │ ├── rl-ddpg/ RL-DDPG-SHORT / RL-DDPG (DDPG actor-critic; short RL step / standard-window RL step; RL-DDPG files are `rl-ddpg-long` in the NetCDF) results (per-benchmark files)
85
  │ ├── ces-eki-dmc_results/ CES-EKI-DMC ensemble-results files (UQ source)
86
- │ ├── gboed-uq_results/ GBOED ensemble-results files (UQ source; 2026-10-16 GBOED-TMCMC/IES-TMCMC and 2026-10-19 IEKF-based variants, all four benchmarks; files are named `boed-*`: `tmcmc-eig` = GBOED-TMCMC, `iekf-eig` = GBOED-IEKF, `iekf` = IES-IEKF, `tmcmc` = IES-TMCMC; IES = Iterated Emulate-Sample)
 
 
87
  │ ├── gnki-uq_results/ IEKF (a.k.a GNKI) ensemble-results files (UQ source)
88
  │ └── abc/ ABC ensemble-results files (UQ source; per-benchmark files)
89
  ├── offline-plots/ leaderboard_plot.py — matplotlib replica of the leaderboard charts
@@ -220,6 +222,10 @@ A quick taxonomy tree is rendered on the home page (`src/streamlit_app.py`).
220
  | `ies-iekf` | IES-IEKF | parallel-interacting | general | uq | within-optimize | boed-iekf |
221
  | `gboed-iekf` | GBOED-IEKF | parallel-interacting | general | uq | within-optimize | gboed-iekf-eig, boed-iekf-eig |
222
  | `ies-tmcmc` | IES-TMCMC | parallel-interacting | general | uq | within-optimize | boed-tmcmc |
 
 
 
 
223
  | `lm-kgmm` | LM-KGMM | serial | gradient (score) | optimization | none | — |
224
  | `lm-dsm` | LM-DSM | serial | gradient (score) | optimization | none | — |
225
  | `adam-kgmm` | ADAM-KGMM | serial | gradient (score) | optimization | none | — |
 
83
  │ ├── rl-td3/ RL-TD3-SHORT / RL-TD3 (TD3 variant of the RL experiments; RL-TD3 files are `rl-td3-long` in the NetCDF) results (per-benchmark files)
84
  │ ├── rl-ddpg/ RL-DDPG-SHORT / RL-DDPG (DDPG actor-critic; short RL step / standard-window RL step; RL-DDPG files are `rl-ddpg-long` in the NetCDF) results (per-benchmark files)
85
  │ ├── ces-eki-dmc_results/ CES-EKI-DMC ensemble-results files (UQ source)
86
+ │ ├── gboed-uq_results/ GBOED ensemble-results files (UQ source; 2026-10-16 GBOED-TMCMC/IES-TMCMC and 2026-10-19 IEKF-based variants, all four benchmarks; files are named `boed-*`: `tmcmc-eig` = GBOED-TMCMC, `iekf-eig` = GBOED-IEKF, `iekf` = IES-IEKF, `tmcmc` = IES-TMCMC, `eks` = IES-EKS (2026-10-30), `eks-eig` = GBOED-EKS (2026-11-01); IES = Iterated Emulate-Sample)
87
+ │ ├── ces-eks_results/ CES-EKS ensemble-results files (UQ source; 2026-10-29, all four benchmarks)
88
+ │ ├── eks_results/ EKS (Ensemble Kalman Sampler) ensemble-results files (UQ source; 2026-10-28, all four benchmarks; files are named `leaderboard_sampler_*`)
89
  │ ├── gnki-uq_results/ IEKF (a.k.a GNKI) ensemble-results files (UQ source)
90
  │ └── abc/ ABC ensemble-results files (UQ source; per-benchmark files)
91
  ├── offline-plots/ leaderboard_plot.py — matplotlib replica of the leaderboard charts
 
222
  | `ies-iekf` | IES-IEKF | parallel-interacting | general | uq | within-optimize | boed-iekf |
223
  | `gboed-iekf` | GBOED-IEKF | parallel-interacting | general | uq | within-optimize | gboed-iekf-eig, boed-iekf-eig |
224
  | `ies-tmcmc` | IES-TMCMC | parallel-interacting | general | uq | within-optimize | boed-tmcmc |
225
+ | `eks` | EKS | parallel-interacting | gradient (Kalman) | uq | none | sampler |
226
+ | `ces-eks` | CES-EKS | parallel-interacting | gradient (Kalman) | uq | after-optimize | — |
227
+ | `ies-eks` | IES-EKS | parallel-interacting | general | uq | within-optimize | boed-eks |
228
+ | `gboed-eks` | GBOED-EKS | parallel-interacting | general | uq | within-optimize | gboed-eks-eig, boed-eks-eig |
229
  | `lm-kgmm` | LM-KGMM | serial | gradient (score) | optimization | none | — |
230
  | `lm-dsm` | LM-DSM | serial | gradient (score) | optimization | none | — |
231
  | `adam-kgmm` | ADAM-KGMM | serial | gradient (score) | optimization | none | — |
data/ces-eks_results/ces-eks-pca_l63_ensemble_results_2026-10-30_minimal.nc ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:fb6d32018c883b3652104527746a798bef2355ec5cc2347e63aec70641b0c115
3
+ size 672937
data/ces-eks_results/ces-eks-pca_l96_ensemble_results_2026-10-30_minimal.nc ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e96cf92aa9d933c2e6d3e1abb0329087263c90e3c0ce67b887a9985714930d37
3
+ size 809737
data/ces-eks_results/ces-eks-pca_l96_nn_forcing_ensemble_results_2026-11-01_minimal.nc ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:608018d111d4c00bdcf133d6d45ad86cd83bc74a44c71cbf187874e45a7f7f85
3
+ size 809737
data/ces-eks_results/ces-eks-pca_l96_spatial_forcing_ensemble_results_2026-10-30_minimal.nc ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:68424661fd8612e9178599e350f2abc7782539358c4d0a30c9afeee538b326d1
3
+ size 809737
data/eks_results/leaderboard_sampler_l63_2026-10-28_minimal.nc ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a8b96f84b51998c56a380eaceb304bbb27b8d1005f95f8ef3286282a0170945f
3
+ size 673072
data/eks_results/leaderboard_sampler_l96_const-force_2026-10-28_minimal.nc ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d00156b43f62ee59e61af56e4c87efc67bafe2e3471517686dd70ac79c099a8a
3
+ size 809872
data/eks_results/leaderboard_sampler_l96_flux-force_2026-10-28_minimal.nc ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1269d153307b862a3e7011c626e97a2a8cb6305517c224a27de19846816ada9d
3
+ size 809872
data/eks_results/leaderboard_sampler_l96_vec-force_2026-10-28_minimal.nc ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d55149224ecc0a0181501b4568814ac59a3b61bf3ae00db1800160caffefb5bf
3
+ size 809872
data/gboed-uq_results/boed-eks-eig_l63_ensemble_results_2026-11-01_minimal.nc ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:27bb192846d29dfaee2e8379ab88608f5075a4b2c795174def83e2131bd2f0fb
3
+ size 728527
data/gboed-uq_results/boed-eks-eig_l96_const-force_2026-11-01_minimal.nc ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8354299ffb06e72e4fe2b3f12289d5676cba0df42e3c90483a00e8e2da4677cc
3
+ size 728527
data/gboed-uq_results/boed-eks-eig_l96_flux-force_2026-11-01_minimal.nc ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ab1a4d0a6d69d8c24dd725c252bddbbb4066dcb954561106e4526930825752d3
3
+ size 728527
data/gboed-uq_results/boed-eks-eig_l96_vec-force_2026-11-01_minimal.nc ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f73d7f32d1f2a6ea7536b302ea946a0a238dc62949f74653a98cb391b476904c
3
+ size 728527
data/gboed-uq_results/boed-eks_l63_ensemble_results_2026-10-30_minimal.nc ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6af49c52fedd18cda9910f9d93d5e66fb8e556f9c999245c8a0906fd76701704
3
+ size 728523
data/gboed-uq_results/boed-eks_l96_const-force_2026-10-30_minimal.nc ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:462bd26fabfcea29f555ccc6be209cb496f4a9ddf8af87c081b095d1b40dcb5c
3
+ size 728523
data/gboed-uq_results/boed-eks_l96_flux-force_2026-10-30_minimal.nc ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6b5cfb7ca902844e4404203f2ad3a37fbca49ce9959377f839bf6f39ccc76742
3
+ size 728523
data/gboed-uq_results/boed-eks_l96_vec-force_2026-10-30_minimal.nc ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b443a24e75a968905ee0a97f83171ce9a32779d392859c697854185ee6cedfd1
3
+ size 728523
src/common/method_registry.py CHANGED
@@ -264,6 +264,42 @@ KNOWN_METHODS = {
264
  "emulator_use": "within-optimize",
265
  "aliases": ["ies-tmcmc", "boed-tmcmc"],
266
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
267
  }
268
 
269
 
@@ -326,13 +362,13 @@ METHOD_COLORS: dict[str, str] = {
326
  # family. A family only appears on a board if one of its methods has data there.
327
  # Every method that can appear in a suitability table must be listed here.
328
  SUITABILITY_FAMILIES: dict[str, list[str]] = {
329
- "CES": ["CES-EKI-CONST", "CES-EKI-DMC", "CES-IEKF-CONST"],
330
- "Kalman": ["ETKI", "IEKF", "TEKI", "UKI"],
331
  "Gradient": ["LM", "ADAM"],
332
  "GFDT": ["LM-DSM", "ADAM-DSM", "LM-KGMM", "ADAM-KGMM"],
333
  "RL": ["RL-DDPG", "RL-TD3", "RL-DDPG-SHORT", "RL-TD3-SHORT"],
334
- "IES": ["IES-IEKF", "IES-TMCMC"],
335
- "GBOED": ["GBOED-IEKF", "GBOED-TMCMC"],
336
  "General": ["ABC", "HM"],
337
  }
338
 
 
264
  "emulator_use": "within-optimize",
265
  "aliases": ["ies-tmcmc", "boed-tmcmc"],
266
  },
267
+ "eks": {
268
+ "abbreviation": "EKS",
269
+ "Method": "Ensemble Kalman Sampler (EKS a.k.a ALDI)",
270
+ "parallelism": "parallel-interacting",
271
+ "update_type": "gradient (Kalman)",
272
+ "method_goal": "uq",
273
+ "emulator_use": "none",
274
+ "aliases": ["eks", "sampler"],
275
+ },
276
+ "ces-eks": {
277
+ "abbreviation": "CES-EKS",
278
+ "Method": "Calibrate Emulate Sample (EKS)",
279
+ "parallelism": "parallel-interacting",
280
+ "update_type": "gradient (Kalman)",
281
+ "method_goal": "uq",
282
+ "emulator_use": "after-optimize",
283
+ "aliases": ["ces-eks"],
284
+ },
285
+ "ies-eks": {
286
+ "abbreviation": "IES-EKS",
287
+ "Method": "Iterated Emulate-Sample (EKS)",
288
+ "parallelism": "parallel-interacting",
289
+ "update_type": "general",
290
+ "method_goal": "uq",
291
+ "emulator_use": "within-optimize",
292
+ "aliases": ["ies-eks", "boed-eks"],
293
+ },
294
+ "gboed-eks": {
295
+ "abbreviation": "GBOED-EKS",
296
+ "Method": "Goal-oriented Bayesian Optimal Experimental Design (EKS)",
297
+ "parallelism": "parallel-interacting",
298
+ "update_type": "general",
299
+ "method_goal": "uq",
300
+ "emulator_use": "within-optimize",
301
+ "aliases": ["gboed-eks", "gboed-eks-eig", "boed-eks-eig"],
302
+ },
303
  }
304
 
305
 
 
362
  # family. A family only appears on a board if one of its methods has data there.
363
  # Every method that can appear in a suitability table must be listed here.
364
  SUITABILITY_FAMILIES: dict[str, list[str]] = {
365
+ "CES": ["CES-EKI-CONST", "CES-EKI-DMC", "CES-EKS", "CES-IEKF-CONST"],
366
+ "Kalman": ["EKS", "ETKI", "IEKF", "TEKI", "UKI"],
367
  "Gradient": ["LM", "ADAM"],
368
  "GFDT": ["LM-DSM", "ADAM-DSM", "LM-KGMM", "ADAM-KGMM"],
369
  "RL": ["RL-DDPG", "RL-TD3", "RL-DDPG-SHORT", "RL-TD3-SHORT"],
370
+ "IES": ["IES-EKS", "IES-IEKF", "IES-TMCMC"],
371
+ "GBOED": ["GBOED-EKS", "GBOED-IEKF", "GBOED-TMCMC"],
372
  "General": ["ABC", "HM"],
373
  }
374
 
src/data_store.py CHANGED
@@ -135,7 +135,11 @@ UQ_BUDGET_FILES: dict[str, list[tuple[str, str]]] = {
135
  ("ies-iekf", "gboed-uq_results/boed-iekf_l63_ensemble_results_2026-10-19_minimal.nc"),
136
  ("gboed-iekf", "gboed-uq_results/boed-iekf-eig_l63_ensemble_results_2026-10-19_minimal.nc"),
137
  ("ies-tmcmc", "gboed-uq_results/boed-tmcmc_l63_ensemble_results_2026-10-16_minimal.nc"),
 
 
138
  ("abc", "abc/leaderboard_abc_l63_2026-09-10_minimal.nc"),
 
 
139
  ],
140
  "L96": [
141
  ("ces-eki-dmc", "ces-eki-dmc_results/ces-eki-dmc_l96_ensemble_results_2026-06-15_minimal.nc"),
@@ -147,7 +151,11 @@ UQ_BUDGET_FILES: dict[str, list[tuple[str, str]]] = {
147
  ("ies-iekf", "gboed-uq_results/boed-iekf_l96_const-force_2026-10-19_minimal.nc"),
148
  ("gboed-iekf", "gboed-uq_results/boed-iekf-eig_l96_const-force_2026-10-19_minimal.nc"),
149
  ("ies-tmcmc", "gboed-uq_results/boed-tmcmc_l96_const-force_2026-10-16_minimal.nc"),
 
 
150
  ("abc", "abc/leaderboard_abc_l96_const-force_2026-09-10_minimal.nc"),
 
 
151
  ],
152
  "L96_NN_FORCING": [
153
  ("ces-eki-dmc", "ces-eki-dmc_results/ces-eki-dmc_l96_nn_forcing_ensemble_results_2026-06-15_minimal.nc"),
@@ -159,7 +167,11 @@ UQ_BUDGET_FILES: dict[str, list[tuple[str, str]]] = {
159
  ("ies-iekf", "gboed-uq_results/boed-iekf_l96_flux-force_2026-10-19_minimal.nc"),
160
  ("gboed-iekf", "gboed-uq_results/boed-iekf-eig_l96_flux-force_2026-10-19_minimal.nc"),
161
  ("ies-tmcmc", "gboed-uq_results/boed-tmcmc_l96_flux-force_2026-10-16_minimal.nc"),
 
 
162
  ("abc", "abc/leaderboard_abc_l96_flux-force_2026-09-10_minimal.nc"),
 
 
163
  ],
164
  "L96_SPATIAL_FORCING": [
165
  ("ces-eki-dmc", "ces-eki-dmc_results/ces-eki-dmc_l96_spatial_forcing_ensemble_results_2026-06-15_minimal.nc"),
@@ -171,7 +183,11 @@ UQ_BUDGET_FILES: dict[str, list[tuple[str, str]]] = {
171
  ("ies-iekf", "gboed-uq_results/boed-iekf_l96_vec-force_2026-10-19_minimal.nc"),
172
  ("gboed-iekf", "gboed-uq_results/boed-iekf-eig_l96_vec-force_2026-10-19_minimal.nc"),
173
  ("ies-tmcmc", "gboed-uq_results/boed-tmcmc_l96_vec-force_2026-10-16_minimal.nc"),
 
 
174
  ("abc", "abc/leaderboard_abc_l96_vec-force_2026-09-10_minimal.nc"),
 
 
175
  ],
176
  }
177
 
 
135
  ("ies-iekf", "gboed-uq_results/boed-iekf_l63_ensemble_results_2026-10-19_minimal.nc"),
136
  ("gboed-iekf", "gboed-uq_results/boed-iekf-eig_l63_ensemble_results_2026-10-19_minimal.nc"),
137
  ("ies-tmcmc", "gboed-uq_results/boed-tmcmc_l63_ensemble_results_2026-10-16_minimal.nc"),
138
+ ("ies-eks", "gboed-uq_results/boed-eks_l63_ensemble_results_2026-10-30_minimal.nc"),
139
+ ("gboed-eks", "gboed-uq_results/boed-eks-eig_l63_ensemble_results_2026-11-01_minimal.nc"),
140
  ("abc", "abc/leaderboard_abc_l63_2026-09-10_minimal.nc"),
141
+ ("eks", "eks_results/leaderboard_sampler_l63_2026-10-28_minimal.nc"),
142
+ ("ces-eks", "ces-eks_results/ces-eks-pca_l63_ensemble_results_2026-10-30_minimal.nc"),
143
  ],
144
  "L96": [
145
  ("ces-eki-dmc", "ces-eki-dmc_results/ces-eki-dmc_l96_ensemble_results_2026-06-15_minimal.nc"),
 
151
  ("ies-iekf", "gboed-uq_results/boed-iekf_l96_const-force_2026-10-19_minimal.nc"),
152
  ("gboed-iekf", "gboed-uq_results/boed-iekf-eig_l96_const-force_2026-10-19_minimal.nc"),
153
  ("ies-tmcmc", "gboed-uq_results/boed-tmcmc_l96_const-force_2026-10-16_minimal.nc"),
154
+ ("ies-eks", "gboed-uq_results/boed-eks_l96_const-force_2026-10-30_minimal.nc"),
155
+ ("gboed-eks", "gboed-uq_results/boed-eks-eig_l96_const-force_2026-11-01_minimal.nc"),
156
  ("abc", "abc/leaderboard_abc_l96_const-force_2026-09-10_minimal.nc"),
157
+ ("eks", "eks_results/leaderboard_sampler_l96_const-force_2026-10-28_minimal.nc"),
158
+ ("ces-eks", "ces-eks_results/ces-eks-pca_l96_ensemble_results_2026-10-30_minimal.nc"),
159
  ],
160
  "L96_NN_FORCING": [
161
  ("ces-eki-dmc", "ces-eki-dmc_results/ces-eki-dmc_l96_nn_forcing_ensemble_results_2026-06-15_minimal.nc"),
 
167
  ("ies-iekf", "gboed-uq_results/boed-iekf_l96_flux-force_2026-10-19_minimal.nc"),
168
  ("gboed-iekf", "gboed-uq_results/boed-iekf-eig_l96_flux-force_2026-10-19_minimal.nc"),
169
  ("ies-tmcmc", "gboed-uq_results/boed-tmcmc_l96_flux-force_2026-10-16_minimal.nc"),
170
+ ("ies-eks", "gboed-uq_results/boed-eks_l96_flux-force_2026-10-30_minimal.nc"),
171
+ ("gboed-eks", "gboed-uq_results/boed-eks-eig_l96_flux-force_2026-11-01_minimal.nc"),
172
  ("abc", "abc/leaderboard_abc_l96_flux-force_2026-09-10_minimal.nc"),
173
+ ("eks", "eks_results/leaderboard_sampler_l96_flux-force_2026-10-28_minimal.nc"),
174
+ ("ces-eks", "ces-eks_results/ces-eks-pca_l96_nn_forcing_ensemble_results_2026-11-01_minimal.nc"),
175
  ],
176
  "L96_SPATIAL_FORCING": [
177
  ("ces-eki-dmc", "ces-eki-dmc_results/ces-eki-dmc_l96_spatial_forcing_ensemble_results_2026-06-15_minimal.nc"),
 
183
  ("ies-iekf", "gboed-uq_results/boed-iekf_l96_vec-force_2026-10-19_minimal.nc"),
184
  ("gboed-iekf", "gboed-uq_results/boed-iekf-eig_l96_vec-force_2026-10-19_minimal.nc"),
185
  ("ies-tmcmc", "gboed-uq_results/boed-tmcmc_l96_vec-force_2026-10-16_minimal.nc"),
186
+ ("ies-eks", "gboed-uq_results/boed-eks_l96_vec-force_2026-10-30_minimal.nc"),
187
+ ("gboed-eks", "gboed-uq_results/boed-eks-eig_l96_vec-force_2026-11-01_minimal.nc"),
188
  ("abc", "abc/leaderboard_abc_l96_vec-force_2026-09-10_minimal.nc"),
189
+ ("eks", "eks_results/leaderboard_sampler_l96_vec-force_2026-10-28_minimal.nc"),
190
+ ("ces-eks", "ces-eks_results/ces-eks-pca_l96_spatial_forcing_ensemble_results_2026-10-30_minimal.nc"),
191
  ],
192
  }
193
 
src/pages/MethodDetails.py CHANGED
@@ -258,6 +258,41 @@ method_meta = {
258
  ],
259
  "notes": "Same after-optimize emulator caveat as CES-EKI-DMC, with the Gauss-Newton calibrate step's usual small-ensemble sensitivity (see IEKF).",
260
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
261
  "ADAM": {
262
  "citation": "Kingma & Ba, ICLR, 2015",
263
  "url": "https://doi.org/10.48550/arXiv.1412.6980",
@@ -667,6 +702,124 @@ method_meta = {
667
  "(vec-force and NN flux-force) it fails on at least 35% and 40% of seeds, respectively, at every ensemble size."
668
  ),
669
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
670
  "GBOED-IEKF": {
671
  "citation": "Holthuijzen et al. 2026 (EIG acquisition); IEKF posterior sampler replaces ST-MCMC",
672
  "url": "https://arxiv.org/abs/2508.13071",
 
258
  ],
259
  "notes": "Same after-optimize emulator caveat as CES-EKI-DMC, with the Gauss-Newton calibrate step's usual small-ensemble sensitivity (see IEKF).",
260
  },
261
+ "CES-EKS": {
262
+ "citation": "Cleary et al., J. Comput. Phys., 2021; Garbuno-Inigo, Nüsken and Reich, SIAM J. Appl. Dyn. Syst., 2020",
263
+ "url": "https://doi.org/10.1016/j.jcp.2020.109716",
264
+ "source": "`uq_experiments/calibrate_emulate_sample` — `CALIBRATE_METHOD=eks` (calibrate stage `Sampler(prior)` + `EKSStableScheduler()`), `DIM_REDUCTION=PCA` (leaderboard key `ces-eks-pca`).",
265
+ "math": (
266
+ "Calibrate-Emulate-Sample whose calibrate stage runs the Ensemble Kalman Sampler (see the EKS entry) instead of "
267
+ "plain EKI. Calibrate: run the sampler to generate `(θ, G(θ))` training pairs; iteration `k` trains on "
268
+ "the pairs from the first `k` steps. Emulate: fit a scalar random-feature surrogate `Ĝ(θ)` on those "
269
+ "pairs. Sample: draw from `π(θ|y) ∝ exp(-½‖y-Ĝ(θ)‖²_Γ)·π(θ)` against the cheap surrogate using "
270
+ "preconditioned Crank-Nicolson Metropolis-Hastings (pCN-MH), rather than the true forward model."
271
+ ),
272
+ "guardrails": (
273
+ "Calibrate stage: `Sampler(prior)` with the data-dependent `EKSStableScheduler()`. The random-feature "
274
+ "kernel has a `1e-6` diagonal nugget. The nullspace-noise injector is switched off for this variant, so directions dropped by the "
275
+ "input PCA are decoded at the prior mean rather than filled with prior noise (the experiment config "
276
+ "notes that injecting noise inflated the posterior on L96 flux-force, with output spread about 2x too "
277
+ "wide and no contraction with `k`). Sample stage auto-tunes the pCN step size (`optimize_stepsize`, "
278
+ "2,000-sample dry run) before the full chain."
279
+ ),
280
+ "params": [
281
+ {"Parameter": "calibrate sampler / scheduler", "Value": "Sampler(prior) / EKSStableScheduler()"},
282
+ {"Parameter": "n_features / n_features_opt", "Value": "100/60 (L63), 200/160 (L96 variants)"},
283
+ {"Parameter": "kernel nugget", "Value": "1e-6"},
284
+ {"Parameter": "MCMC samples / burn-in", "Value": "100,000 / 2,000 (pCN-MH)"},
285
+ {"Parameter": "init_stepsize", "Value": "0.2 (L63) / 0.01 (L96), auto-tuned before the full chain"},
286
+ {"Parameter": "nullspace noise injector", "Value": "off (threshold Inf)"},
287
+ ],
288
+ "notes": (
289
+ "The emulator is fit once per iteration `k` on the sampler's first `k` steps, so quality depends on "
290
+ "how well the calibrate-stage ensemble covers the posterior region. In the current UQ data "
291
+ "(c = 1.5, best reliable ensemble size) the mean budget is 5.3 on L63, 6.0 on L96 const-force, 87.5 "
292
+ "on vec-force (0% failures) and 207 on NN flux-force, which fails on at least 5% of seeds at every "
293
+ "size (15% at the best one)."
294
+ ),
295
+ },
296
  "ADAM": {
297
  "citation": "Kingma & Ba, ICLR, 2015",
298
  "url": "https://doi.org/10.48550/arXiv.1412.6980",
 
702
  "(vec-force and NN flux-force) it fails on at least 35% and 40% of seeds, respectively, at every ensemble size."
703
  ),
704
  },
705
+ "EKS": {
706
+ "citation": "Garbuno-Inigo, Nüsken and Reich, SIAM J. Appl. Dyn. Syst., 2020 (ALDI); Garbuno-Inigo, Hoffmann, Li and Stuart, SIAM J. Appl. Dyn. Syst., 2020 (original EKS)",
707
+ "url": "https://doi.org/10.1137/19M1304891",
708
+ "source": "`uq_experiments/KalmanSampler` — `calibrate_l63.jl`/`calibrate_l96.jl`, `experiment_config.jl` (`METHOD=sampler`, leaderboard key `sampler`); `EKP.Sampler(prior)` with EnsembleKalmanProcesses' default `sampler_type = \"aldi\"`.",
709
+ "math": (
710
+ "EKS (a.k.a ALDI): the Ensemble Kalman Sampler in its affine-invariant Langevin form (ALDI). It is a "
711
+ "derivative-free interacting-particle system that approximately samples the posterior. Each iteration "
712
+ "moves every member with an ensemble-Kalman drift (parameter/output ensemble covariances stand in for "
713
+ "a simulator Jacobian), a prior term applied implicitly, a finite-sample correction `(d+1)/J` times "
714
+ "the member's deviation from the ensemble mean, and noise built from the ensemble square root. Unlike "
715
+ "EKI the noise keeps the ensemble from collapsing, so the ensemble approximates the posterior rather "
716
+ "than a point estimate. There is no emulator: the ensemble at each iteration is itself the posterior "
717
+ "estimate."
718
+ ),
719
+ "math_eq": r"\theta^{(j)}_{n+1} = \left(I + \Delta t_n C_n \Gamma_\theta^{-1}\right)^{-1}\left[\theta^{(j)}_n - \frac{\Delta t_n}{J}\sum_{k=1}^J \langle \mathcal{G}(\theta^{(k)}_n) - \bar{\mathcal{G}}_n,\, \Gamma_y^{-1}(\mathcal{G}(\theta^{(j)}_n) - y)\rangle (\theta^{(k)}_n - \bar\theta_n) + \Delta t_n C_n \Gamma_\theta^{-1} m_\theta + \Delta t_n \frac{d+1}{J}(\theta^{(j)}_n - \bar\theta_n)\right] + \sqrt{\frac{2\Delta t_n}{J}}\sum_{k=1}^J \xi_{jk}\,(\theta^{(k)}_n - \bar\theta_n)",
720
+ "guardrails": (
721
+ "The step size comes from `EKSStableScheduler()` (numerator 1, nugget `eps()`), so it is adaptive and "
722
+ "data-dependent, `Δt = 1/(‖D‖ + eps)` with `D` the ensemble-weighted data-misfit matrix, and needs "
723
+ "no hand-tuned schedule."
724
+ ),
725
+ "params": [
726
+ {"Parameter": "sampler_type", "Value": "\"aldi\" (EKP default)"},
727
+ {"Parameter": "scheduler", "Value": "EKSStableScheduler() (numerator 1, nugget eps())"},
728
+ ],
729
+ "notes": (
730
+ "**No emulator and no MCMC; each iteration costs `N_ens` forward runs.** In the current UQ data "
731
+ "(c = 1.5, best reliable ensemble size) it needs a mean budget of 4.2 on L63 (15% failures) and 4.2 "
732
+ "on L96 const-force, taking only about one iteration. On the two high-dimensional cases it needs "
733
+ "7 to 8 iterations, so the budget grows with ensemble size: 353 at size 50 on NN flux-force and "
734
+ "460 at size 55 on vec-force (5% failures each); the largest sizes fail on up to 25-30% of seeds."
735
+ ),
736
+ },
737
+ "IES-EKS": {
738
+ "citation": "Elsaesser et al., J. Adv. Model. Earth Syst., 2025; Garbuno-Inigo, Hoffmann, Li and Stuart, SIAM J. Appl. Dyn. Syst., 2020 (EKS)",
739
+ "url": "https://doi.org/10.1029/2024MS004713",
740
+ "source": "`uq_experiments/BayesianOptimalExperimentalDesign` — `boed_core.jl` (`run_eks`, `acquire_batch`), variant `:eks` (leaderboard key `boed-eks`); `experiment_config.jl` sets `eks_sampler_type = \"eks\"`.",
741
+ "math": (
742
+ "The same iterated emulate-sample loop as IES-IEKF and IES-TMCMC (see those entries), with the "
743
+ "posterior sampler swapped for the Ensemble Kalman Sampler (EKP `Sampler`). Iteration 1 "
744
+ "forward-evaluates an `N_ens`-point Latin-hypercube design in the truncated, prior-whitened space. "
745
+ "Each later iteration: (i) refits one GP per whitened output mode on all `(θ, G(θ))` pairs so far; "
746
+ "(ii) draws an approximate posterior by running the sampler on the GP-mean forward map (no true "
747
+ "forward evaluations), from a 200-member Latin-hypercube standard-normal start with the prior "
748
+ "N(0, I) and identity noise; (iii) takes the next `N_ens` forward-model evaluation points as a random "
749
+ "subsample of that ensemble."
750
+ ),
751
+ "guardrails": (
752
+ "The sampler is `EKP.Sampler` with `sampler_type = \"eks\"` (the original EKS of Garbuno-Inigo, "
753
+ "Hoffmann, Li and Stuart, not the ALDI variant used by the EKS and CES-EKS entries), driven by "
754
+ "`EKSStableScheduler(alpha = 0.25)` for a fixed 500 steps. `alpha = 0.25` was chosen because it "
755
+ "sat closer to the ST-MCMC reference than the default 1, and `alpha >= 3` is unstable. Like the IEKF "
756
+ "variant it ignores the GP predictive variance. GP fits use the same data-relative hyperparameter "
757
+ "bounds and iteration caps as IES-IEKF. The posterior has 200 draws rather than 1000; the "
758
+ "shortfall is padded with NaN rows that the leaderboard stage drops."
759
+ ),
760
+ "params": [
761
+ {"Parameter": "sampler_type", "Value": "\"eks\" (original EKS)"},
762
+ {"Parameter": "EKS particles (eks_n_particles)", "Value": "200"},
763
+ {"Parameter": "scheduler", "Value": "EKSStableScheduler(alpha = 0.25)"},
764
+ {"Parameter": "steps (eks_max_iters / eks_T)", "Value": "500 / Inf (fixed step count)"},
765
+ {"Parameter": "batch size per iteration", "Value": "N_ens (random subsample of the EKS ensemble)"},
766
+ {"Parameter": "gp_optim_iters / gp_outer_iters", "Value": "50 / 3"},
767
+ ],
768
+ "notes": (
769
+ "**Cheap in forward runs but with a fixed 500-step sampler cost per iteration** (GP-mean evaluations "
770
+ "only). In the current UQ data (c = 1.5, best ensemble size) its mean budget is 5.4 on L63, 4.2 on "
771
+ "L96 const-force and 112 on NN flux-force (size 80), all with 0% failures. On vec-force it fails on "
772
+ "at least 20% of seeds at every ensemble size, so it is not suitable there under the 20% threshold."
773
+ ),
774
+ },
775
+ "GBOED-EKS": {
776
+ "citation": "Holthuijzen et al. 2026 (EIG acquisition); Garbuno-Inigo, Hoffmann, Li and Stuart, SIAM J. Appl. Dyn. Syst., 2020 (EKS posterior sampler)",
777
+ "url": "https://arxiv.org/abs/2508.13071",
778
+ "source": "`uq_experiments/BayesianOptimalExperimentalDesign` — `boed_core.jl` (`run_eks`, `optimize_batch`, `acquire_batch`), variant `:eks_eig` (leaderboard key `boed-eks-eig`); `experiment_config.jl` sets `eks_sampler_type = \"eks\"`.",
779
+ "math": (
780
+ "GBOED with the posterior sampler swapped for the Ensemble Kalman Sampler (see the GBOED-IEKF and "
781
+ "IES-EKS entries). Iteration 1 forward-evaluates an `N_ens`-point Latin-hypercube design in the "
782
+ "truncated prior-whitened space. Each later iteration: (i) refits one GP per whitened output mode on "
783
+ "all `(θ, G(θ))` pairs so far; (ii) draws an approximate posterior by running the sampler on the "
784
+ "GP-mean forward map (no true forward evaluations); (iii) chooses the next `N_ens` evaluation "
785
+ "points by jointly maximizing the closed-form Expected Information Gain (EIG) of the whole batch "
786
+ "against a 50-member random subsample of the EKS ensemble, starting from a random subsample of "
787
+ "the full ensemble."
788
+ ),
789
+ "math_eq": r"\mathrm{EIG}(X) = \frac{1}{k}\sum_j \frac{1}{2}\log\frac{\det K_{pp}^{(j)}}{\det \Sigma'^{(j)}}, \quad \Sigma'^{(j)} = K_{pp}^{(j)} - K_{pc}^{(j)}\left(K_{cc}^{(j)}\right)^{-1}K_{cp}^{(j)}",
790
+ "guardrails": (
791
+ "The sampler is `EKP.Sampler` with `sampler_type = \"eks\"` (original EKS, not ALDI), run for a "
792
+ "fixed 500 steps of `EKSStableScheduler(alpha = 0.25)` with 200 particles, ignoring the GP "
793
+ "predictive variance. The batch is optimized with `Optim.jl`'s `LBFGS` inside the χ² ball of the "
794
+ "prior-whitened space (radial `tanh` squash, so every candidate has radius below √χ²_k(0.999)), with "
795
+ "a hard cap on raw EIG evaluations (`eig_call_limit`) and an outer-iteration cap "
796
+ "(`eig_outer_iters`), logging a warning that the returned batch may be \"under-optimized\" if either "
797
+ "is hit; a diagonal jitter (`eig_jitter`, relative to the GP signal variance) stabilizes the "
798
+ "covariance solves and log-determinants. GP fits use the same data-relative bounds and iteration "
799
+ "caps as IES-IEKF."
800
+ ),
801
+ "params": [
802
+ {"Parameter": "sampler_type", "Value": "\"eks\" (original EKS)"},
803
+ {"Parameter": "EKS particles (eks_n_particles)", "Value": "200"},
804
+ {"Parameter": "scheduler", "Value": "EKSStableScheduler(alpha = 0.25)"},
805
+ {"Parameter": "steps (eks_max_iters / eks_T)", "Value": "500 / Inf (fixed step count)"},
806
+ {"Parameter": "n_eig_posterior_samples (EIG subsample X')", "Value": "50"},
807
+ {"Parameter": "eig_region / eig_ball_quantile", "Value": ":ball / 0.999 (χ² ball in prior-whitened space)"},
808
+ {"Parameter": "eig_optim_iters / eig_outer_iters", "Value": "500 / 20"},
809
+ {"Parameter": "eig_call_limit", "Value": "2000 EIG evaluations"},
810
+ {"Parameter": "eig_g_tol / eig_f_reltol", "Value": "1e-3 / 1e-6"},
811
+ {"Parameter": "eig_jitter", "Value": "1e-6 × GP signal variance"},
812
+ {"Parameter": "gp_optim_iters / gp_outer_iters", "Value": "50 / 3"},
813
+ {"Parameter": "batch_init_strategy", "Value": ":posterior_subsample"},
814
+ ],
815
+ "notes": (
816
+ "**Adds the EIG batch optimization to IES-EKS**, so it pays for the inner EIG-maximization loop on "
817
+ "top of the 500-step sampler; hitting its call or outer-iteration limits gives \"under-optimized\" "
818
+ "batches. In the current UQ data (c = 1.5, best ensemble size) its mean budget is 5.2 on L63, 4.2 on "
819
+ "L96 const-force and 105 on NN flux-force (size 80, 5% failures). On vec-force it fails on at least "
820
+ "25% of seeds at every ensemble size, so it is not suitable there under the 20% failure threshold."
821
+ ),
822
+ },
823
  "GBOED-IEKF": {
824
  "citation": "Holthuijzen et al. 2026 (EIG acquisition); IEKF posterior sampler replaces ST-MCMC",
825
  "url": "https://arxiv.org/abs/2508.13071",