Skip to content

Add enhanced-sampling submodule: metadynamics, boxed dynamics, and loxodynamics - #581

Open
amateurcat wants to merge 8 commits into
TorchSim:mainfrom
amateurcat:enhanced-sampling
Open

Add enhanced-sampling submodule: metadynamics, boxed dynamics, and loxodynamics#581
amateurcat wants to merge 8 commits into
TorchSim:mainfrom
amateurcat:enhanced-sampling

Conversation

@amateurcat

Copy link
Copy Markdown

Adds a self-contained torch_sim.enhanced_sampling submodule of enhanced-sampling methods that compose with any MLIP via SumModel

add enhanced_sampling module, reconstruct meta-dynamics functions and moved them into the new module
implemented Boxed MD
add loxodynamics
Fix format with pinned ruff 0.15.4
@CompRhys CompRhys added the feature Entirely new features, not improvements to existing ones label Jun 26, 2026
return out.index_add(dim, system_idx, src)


class LogfermiWall(ModelInterface):

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Can we append Model to the name here to name it clearer?

return {"energy": energy, "forces": forces, self.energy_label: energy}


class RMSDCV(ModelInterface):

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Can we append Model to the name here to name it clearer?

raise ValueError(f"{self.activation=} must be one of {_ACTIVATIONS}")


class ShiftedSoftplus(nn.Module):

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

is there no common library that already defines this?



@dataclass
class DescriptorNormalizer:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

again do we need to implement this here rather than import a standard mean-variance normalizer?

@CompRhys

Copy link
Copy Markdown
Member

Thanks for the feature contribution! I gave it a quick glance today but will look in more details next week. Comments thus far are just nits not looking at the algorithms/test coverage yet.

CompRhys and others added 4 commits June 26, 2026 16:42
torch-sim has FixAtoms, FixCom and FixSymmetry but no way to constrain an
interatomic distance. This adds FixBondLengths, mirroring the semantics of
ase.constraints.FixBondLengths.

Distances are held by projection rather than by a stiff restraint potential,
so they are satisfied exactly to the requested tolerance and no penalty term
is added to the energy — reported energies stay the model's own.

Three projections, all mass-weighted and all iterated:
  * adjust_positions - SHAKE, restores each target distance
  * adjust_momenta   - RATTLE, removes relative velocity along each pair axis
  * adjust_forces    - same projection on the forces, removing the constrained
                       component of the relative acceleration, and recording the
                       Lagrange-multiplier force in .constraint_forces

Iteration matters because constraints that share an atom are coupled, and a
single pass would satisfy only the last one applied.

Implementation notes:
  * Subclasses Constraint directly rather than AtomConstraint, which assumes a
    flat atom index list and rebuilds via type(self)(indices); a distance
    constraint carries index pairs plus a target per pair, so select_constraint,
    select_sub_constraint, reindex and merge are implemented for pairs.
  * Vectorized over pairs with index_add_, so it batches.
  * Minimum image is applied per pair using the cell of the owning system,
    following SimState's column vector convention.
  * Target lengths are stored at double precision and cast down only when
    applied. Reading them at the ambient default dtype would round a target
    such as 0.98 A by ~2e-8, an error no amount of iteration can remove.
  * Each constraint removes one degree of freedom from its own system, and
    spanning two systems of a batch is rejected.
  * validate_constraints now bounds-checks the pair indices, which it would
    otherwise skip since this is not an AtomConstraint.

Verified against ASE: positions, momenta and forces all agree to ~1e-14, mass
weighting reproduces the expected m_heavy/m_light displacement ratio, and a
constrained bond holds through a FIRE relaxation that otherwise relaxes it to
the Lennard-Jones minimum.

16 new tests; the existing constraint, optimizer, extras and symmetry suites
(220 tests) still pass.
Add FixBondLengths: SHAKE/RATTLE distance constraints
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature Entirely new features, not improvements to existing ones

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants