Skip to content

Releases: uwplasma/vmex

VMEX 0.2.0

Choose a tag to compare

@rogeriojorge rogeriojorge released this 18 Jul 13:03
9b933f1

First release under the VMEX name (formerly vmec-jax).

Install: pip install vmex · Docs: https://vmex.readthedocs.io

Highlights

  • Renamed vmec_jax → vmeximport vmex, vmex CLI (with vmec alias), and a vmec_jax import shim (DeprecationWarning) for one release. VMEC file conventions (wout_*.nc, boozmn_*.nc, Vmec* classes) unchanged.
  • vmex.mirror — open and closed magnetic-mirror equilibria (differentiable, spline-native): fixed-boundary open mirrors (divergence 6.6e-15), free-boundary β scan 0–10% (implicit gradient 1.1e-10 vs reconverged FD), one-call solve_fixed_boundary_from_radius.
  • vmex.parallel — concurrent ensembles of independent solves (bit-identical to serial, ~3.3× at 8 workers).
  • Optimization — traceable l_grad_b objective and a five-campaign objectives showcase; cold-start single-stage plasma+coil benchmark (vacuum + finite β).
  • Speed — NESTOR free-boundary loop fused into jitted lanes; warm solves now beat VMEC2000 on every benchmark row.
  • Robustness — typed VmecErrors propagate through the jax.pure_callback boundary; ruff+mypy lint gate in CI.

See CHANGELOG.md for the full list.

v0.1.0

Choose a tag to compare

@rogeriojorge rogeriojorge released this 13 Jul 05:28

vmec-jax v0.1.0

First 0.1 milestone: a research-grade, differentiable JAX implementation of VMEC,
with VMEC2000 scalar parity and an end-to-end differentiable free boundary.

Highlights

  • Differentiable equilibria. Fixed-boundary gradients via the implicit-function-theorem
    adjoint (finite-difference validated to ~1e-6 relative); free-boundary gradients via
    virtual casing.
  • True single-stage optimization (new). The free-boundary B·n residual is now
    differentiable in the plasma boundary as well as the coils, so a single
    jax.value_and_grad co-optimizes boundary shape and coils simultaneously — the
    gradient threads through the implicit adjoint (boundary) and virtual casing (coils) at
    once. See examples/single_stage_simultaneous_opt.py.
  • Multigrid solver with VMEC2000 scalar parity (energies, aspect ratio, beta, iota,
    pressure, boundary shape), checked in-repo via lightweight golden digests.
  • Optimization. QA / QH / QP / QI targets; ESS spectral scaling (single-call, no
    max-mode continuation loop); block-tridiagonal implicit Jacobian; perturbation warm-start
    (3.7× fewer solver iterations).
  • Physics. Redl bootstrap current with a self-consistency loop; ballooning stability
    (COBRA); omnigenity / QI residual; gyrokinetic turbulence proxies; a built-in Boozer
    transform.
  • Performance. CPU and GPU; persistent XLA compilation cache (on by default);
    memory controls (remat / chunking / donation). Warm fixed-boundary solves are sub-0.1 s.
  • Engineering. < 10 MB repo, ~95 % test coverage, SOLVAX-backed structured linear
    algebra, sharded CI, VMEC2000 parity without stored large wout files.

Install

pip install vmec-jax          # PyPI (recommended)
conda install -c conda-forge vmec-jax

Notes

  • Free-boundary / virtual-casing features need the optional virtual_casing_jax dependency.
  • Python 3.10–3.12.

Golden VMEC2000 parity fixtures v1

Choose a tag to compare

@rogeriojorge rogeriojorge released this 09 Jul 14:20

VMEC2000 (STELLOPT 9.0, xvmec2000) reference outputs — stdout, threed1, wout_*.nc, timings — for 9 benchmark decks (incl. lasym fixed-boundary and lasym free-boundary). Used by the parity test suite via the fetch helper. sha256: 85b1de372066d1dd0c57b1a9ffb569ccc1276bb67dec81e7bf15a5a943ca05d7

vmec-jax v0.0.18

Choose a tag to compare

@rogeriojorge rogeriojorge released this 05 Jul 02:12

Highlights

  • Retuned the public QA/QH/QP optimization accepted/trial VMEC budgets to reduce default optimization wall time while keeping stricter audit settings documented.
  • Preserved compact inactive asymmetric scan velocity state when resuming old fixed-boundary scan payloads, avoiding unnecessary graph and memory expansion.
  • Added bounded QI budget-smoke provenance to the research-grade performance/differentiability plan.

Validation

  • Ruff and diff checks passed locally for the release bump.
  • Focused optimization/scan tests and Sphinx docs passed on the preceding code commits.
  • GitHub CI is expected to publish to PyPI from this release.

vmec-jax v0.0.17

Choose a tag to compare

@rogeriojorge rogeriojorge released this 05 Jul 01:55

Highlights

  • Refresh QS optimization budget probe controls for optimizer method, trial-scan policy, SciPy trust-region settings, and target-helicity seed testing.
  • Make the QA standalone optimization visibly apply the reviewed target-helicity mode-1 seed so short budget probes escape the zero-transform branch.
  • Update optimization documentation and tests to describe the visible seed-conditioning policy and budget-probe knobs.

Validation

  • python -m ruff check tools/diagnostics/qs_budget_probe.py examples/optimization/QA_optimization.py tests/test_optimization_examples.py
  • JAX_ENABLE_X64=1 python -m pytest -q tests/test_optimization_examples.py -q
  • LANG=C.UTF-8 LC_ALL=C.UTF-8 python -m sphinx -W -j auto -b html docs docs/_build/html_release_v0017

vmec-jax v0.0.16

Choose a tag to compare

@rogeriojorge rogeriojorge released this 04 Jul 22:21

Highlights

  • Added compact VMEC2000-style scan runtime controls so fixed-boundary scan runners carry the iteration sequence compactly while FTOL and residual target remain scalar runtime operands.
  • Added profile-guided fixed-boundary scan policy documentation and provenance for current-vs-main benchmark threshold classifications.
  • Included the recent branch-local free-boundary derivative and coil-optimization validation work from post-v0.0.15 development.
  • Kept repository size gates, docs gates, source-health gates, and CI coverage shards aligned for release.

Validation

  • Local scan-focused tests: 60 passed.
  • Local broader affected slice: 304 passed, 2 warnings.
  • Local docs build with warnings as errors: passed.
  • Local wheel/sdist build for 0.0.16: passed.
  • Local repository size gate: 27.64 MiB tracked, largest tracked file <2 MiB.
  • GitHub Actions CI for commit da0c1a31 was running with completed docs/build/smoke/core shards green when this release was created.

Notes

This release is intended as the current public checkpoint for the fixed-boundary performance tranche, branch-local free-boundary derivative work, and release-hygiene updates. Full arbitrary adaptive-branch free-boundary differentiation remains explicitly conservative in the documentation and plan.

vmec-jax v0.0.15

Choose a tag to compare

@rogeriojorge rogeriojorge released this 14 Jun 02:07

User-visible changes:

  • Adds and documents the direct-coil/free-boundary ESSOS lane for single-stage coil-aware workflows.
  • Promotes branch-local direct-coil free-boundary derivative validation, including fixed accepted/rejected controller-slot gates and coil-only QS proposal examples with complete solves as acceptance authority.
  • Adds the QI minimal-seed NFP1/2/3/4 README panel and lightweight provenance artifacts.
  • Improves beginner installation diagnostics, release hygiene, repository-size hygiene, and required CI coverage/runtime splitting.
  • Includes Glasser resistive stability diagnostics and Mercier/Glasser derivative validation gates added since v0.0.14.

Validation:

  • Local release gate passed with 2793 passed, 23 skipped, 116 deselected, 2 xfailed, and 95.25% coverage at the enforced 95% gate.
  • GitHub Actions CI for release-candidate commit 55dde90 passed: console smoke, physics smoke, Python 3.10/3.12 fast tests, py3.11 core/exact/slow-physics coverage shards, docs, wheel/sdist build, parity manifest smoke, and combined coverage gate.
  • Bounded VMEC2000 executable gates passed locally for the fast stage trace and LASYM free-boundary smoke rows.

Known limitations:

  • Direct-coil free-boundary fields, mgrid interpolation, accepted-boundary replay, and same-branch/fingerprint-gated physical-scalar/vector gates are validated.
  • The production adaptive host-controller branch selection is not claimed as fully differentiable through arbitrary branch changes in this release.
  • Coil-only QS examples use branch-local derivative proposals and retain complete VMEC solves as the acceptance authority.
  • Long DIII-D/VMEC2000 parity refreshes remain optional/manual diagnostics rather than required release gates.

vmec-jax v0.0.14

Choose a tag to compare

@rogeriojorge rogeriojorge released this 28 May 12:30

Release v0.0.14.

Highlights:

  • vmec_jax --test now copies the bundled quick-start input with FTOL_ARRAY = 1e-12 for a faster first run, then writes WOUT and plots automatically.
  • Package metadata includes matplotlib and booz_xform_jax by default, so quick-start plotting and Boozer workflows work after a normal install.
  • Exact replay JVP instrumentation documents GPU accepted-point replay path selection and profile evidence.
  • Required local release gate passed with fetched WOUT fixtures: 2354 passed, 20 skipped, 110 deselected, 1 xfailed, 95.09% coverage.
  • Current WOUT fixture regression constants are aligned with the assets-20260526-wout-fixtures bundle.

vmec_jax optional WOUT fixtures 2026-05-26

Choose a tag to compare

Optional generated/reference WOUT fixtures moved out of git. Restore them with: python tools/fetch_assets.py --bundle wout-fixtures

vmec-jax v0.0.13

Choose a tag to compare

@rogeriojorge rogeriojorge released this 23 May 19:12

vmec-jax v0.0.13

This release closes the v0.0.13 performance, parity, packaging, and docs lanes.

User-facing changes

  • Plain pip install vmec-jax now includes the plotting and Boozer-coordinate dependencies needed by the documented examples.
  • The public API exports plot_wout, matching the README and API docs.
  • Quickstart WOUT plotting examples now point at the tracked pressure fixture.
  • GPU high-mode non-LASYM cases keep the precomputed tridiagonal preconditioner policy used by the primal solve through exact accepted-point replay.

Performance and correctness

  • Exact accepted-point replay now records and reuses the preconditioner tridiagonal policy, including replay cache-key separation for different tridiagonal paths.
  • Added coverage for high-mode non-LASYM precomputed-tridi propagation and equivalence.
  • Verified that the experimental jax.lax.linalg.tridiagonal_solve path is not ready to promote as a default: it was slower on the QH warm-start GPU test.

Validation

  • Local full fast coverage gate: 2196 passed, 20 skipped, 109 deselected, 1 xfailed, coverage 95.09%.
  • Local full docs build passed with warnings as errors.
  • Local package build and twine check passed.
  • Local slow exact replay checks passed: 2 passed.
  • Local VMEC2000 executable fast validation passed: 5 passed.
  • Main CI for the release commit passed before tagging.

Known limitations

  • Seed-robust QI for NFP=4 remains a research/optimization lane rather than a guaranteed arbitrary-seed workflow.
  • Some external VMEC2000 parity rows remain optional, skipped, or xfailed where documented because they require external assets, mgrids, or unresolved near-zero LASYM-channel differences.
  • Remaining performance work is concentrated in cold exact tape/forward-force cost, accepted-point tangent construction, scan-trial timing instrumentation, and GPU kernel/launch overhead for preconditioner application.