Skip to content

Add symplectic integrator#43

Open
johannes-spies wants to merge 10 commits into
mainfrom
symplectic-minimal
Open

Add symplectic integrator#43
johannes-spies wants to merge 10 commits into
mainfrom
symplectic-minimal

Conversation

@johannes-spies

Copy link
Copy Markdown

Summary

Adds a fixed-point midpoint-rule symplectic integrator with minimal changes to the existing API.

  • New src/flashmd/fpi.py: Anderson-accelerated fixed-point solver (ported from Add Symplectic Integrator #32).
  • New src/flashmd/symplectic_stepper.py: SymplecticStepper — wraps a FlashMDStepper for the initial guess and refines it using a separate symplectic correction model.
  • ipi.py and ase/velocity_verlet.py: tuple model detection. The plain single-model API is completely unchanged.

Usage

Pass a tuple instead of a plain model wherever a model is expected:

model = (flashmd_model, (symplectic_model, {"tol": 1e-5, "max_iter": 50}))

# i-PI
stepper = get_nve_stepper(sim, model, device)

# ASE (Bussi and Langevin inherit this for free)
md = VelocityVerlet(atoms, timestep, model)

The config dict keys are all optional and passed straight to anderson_solver: tol, max_iter, m, beta, lambda_reg.

This supersedes #32, which is being closed in favour of this smaller focused change. The example will follow in a separate PR on top of this one.

Pass model=(flashmd_model, (symplectic_model, config_dict)) to use the
fixed-point midpoint-rule integrator instead of plain FlashMD. The plain
single-model API is completely unchanged. Works in both i-PI and ASE
(VelocityVerlet, Bussi, Langevin).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
johannes-spies and others added 2 commits May 20, 2026 11:51
The `._nl.algorithm = "cell_list"` workaround guards against a vesin
CUDA bug with triclinic cells (vesin#157), but accesses a private
attribute. It was not present in the original PR#32 design, and
verified to be unnecessary on CPU (the only target for now).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@frostedoyster frostedoyster left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good. Can we also support (direct_model, symplectic_model) without the symplectic config? It should be trivial. We also need tests. For that, we will need to upload the symplectic models to the HF repository. We also need some documentation

johannes-spies and others added 7 commits May 22, 2026 16:22
Allow passing the symplectic model directly as the second tuple element,
without wrapping it in a (model, config) pair. Defaults to empty config.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
VelocityVerlet assumed the symplectic model was always passed as
(model, config); passing just a plain model crashed with TypeError.

Also adds pytest filterwarnings for torch.jit and metatomic 0.1.12+
deprecations (renamed output names/quantities) that now surface with
newer dependency versions.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Extend get_pretrained() with symplectic=True to download and export
the symplectic FlashMD checkpoint from HuggingFace. Add tests covering
both the plain-model and (model, config) tuple API.

Metatrain is pinned to the git HEAD for now since
experimental.flashmd_symplectic is not yet in a released version.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Pin metatrain to 2026.2.1 in pyproject.toml. In get_pretrained, check
the mtt export return code and give a helpful error if the
experimental.flashmd_symplectic architecture is missing. Override
metatrain with a pinned metatensor/metatrain commit in CI so the
symplectic tests can actually run the export.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
warp-lang>=1.14.0 deprecated warp.config.quiet, which is used by
nvalchemi-toolkit-ops==0.3.0. Suppress it so pytest's filterwarnings
error mode doesn't turn it into a failure.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The existing filter only matched APICLaunchParamRecord; warp-lang 1.14.0
triggers the same warning for other ctypes structures (e.g.
APICLaunchPtrLocation) on Python 3.14. Use .* to suppress all of them.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants