Every Li-free sodium run in otto_data — each one whose active feeders are sodium salts (Na2SO4 / NaBr / NaClO4 / NaNO3) and nothing else, mixtures and single-salt surveys alike. This table is sample/Na_electrolyte.csv, written by test/load_data.py from the same records the GP is fitted to. Volumes in mL (total 7 mL); molalities as sourced; stability window = Tafel cathode V − Tafel anode V.
What you are looking at. Every electrolyte that has been made and measured, lined up left to right from the narrowest predicted stability window to the widest. Hover any point to see its recipe in mL.
How the model works. It assumes recipes with similar volumes behave similarly, so it predicts a new recipe from how close it is to ones already measured — and tells you how confident it is. Two choices matter: NaBr is measured on a log scale, because the first 0.1 mL costs about a volt while 1 → 3 mL barely changes anything; and the assumed measurement error is fixed by hand rather than fitted, because fitting it makes the band unrealistically narrow.
How the 10 suggestions were chosen. Every recipe the robot can physically dispense was scored — about 1.15 million of them, in 0.1 mL steps totalling 7 mL. The score is predicted window plus twice the uncertainty, so a recipe earns a test if it looks good or if the model has no idea about it. The 10 best were kept, at least 0.5 mL apart so they are ten different experiments rather than ten versions of one. This is the same trade-off the paper's optimiser makes.
test/na_cp.png. Gaussian process:
dragonfly EuclideanGPFitter (test/model.py),
anisotropic Matérn ν = 2.5 kernel, one
maximum-likelihood-tuned bandwidth per axis over the five feeder volumes,
NaBr axis warped to log₁₀(NaBr + 0.05 mL),
constant mean function. Noise: homoscedastic additive Gaussian, variance
pinned at 0.006 V² (σn ≈ 0.077 V)
rather than ML-tuned — ML collapses it to ~0.001 V² and the
±2σ band then covers only 76% of measurements. Band drawn at
±2σ. Suggestions from test/search.py: UCB
acquisition μ + 2σ over 1,150,626 candidates, greedy
top-10 with a 0.5 mL minimum separation; hover also reports
P(window > best measured). Composition vector is
x = [water, NaNO3, NaClO4, Na2SO4, NaBr] in mL.
Interactive version of multiobjective_optimization/pareto_discovery.png: measured sodium electrolytes, the current Pareto front (conductivity and stability window both maximized), and the 10 dragonfly-suggested bromide-free candidates with GP prediction ± std error bars. Hover for compositions and objective values.
Requires the API server:
env/electrolyte_env/bin/python ui/server.py (serves this page on
localhost:8765 and the RAG endpoints).