ReactionMechanismGenerator / ReactionMechanismGenerator/ARC

Brute-force directed scans optimize freely at every point (Scheduler.run_job passes constraints=None) — flat V(φ)

Open
#986 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
51
Forks
25
Avg merge
4d 5h
Merged PRs (30d)
15

Description

Summary

A brute-force directed scan (directed_rotors: {brute_force_opt: [...]}) optimizes freely at every dihedral point instead of holding the scanned dihedral, so every point relaxes to the same minimum and the resulting V(φ) is flat (≈ zero barrier). This is silent — no error, just a wrong potential — and it is not software-specific: it reproduces on the Gaussian adapter as well as on the ASE adapter.

Root cause

Scheduler.run_job() always passes constraints=None, and no adapter derives a constraint from the torsions + dihedrals it is handed instead. So the per-point optimization that a directed scan spawns has nothing pinning the scanned dihedral, and each point optimizes to the nearest minimum.

Signature of the bug: for a directed scan, the relaxed energies across all points span ≈ 0 (a flat V(φ)), because every point collapsed to the same geometry.

Evidence

Found while running UMA (fairchem) hindered-rotor scans through the generic ASEAdapter on a cluster. With the ASE adapter made to translate torsions+dihedrals into a FixInternals constraint, the same DMH N–N torsion that had given a flat V(φ) instead held each point's dihedral to 0.000° and produced an 8.5 kJ/mol barrier. Tracing it showed the missing constraint originates upstream of any adapter, in run_job() — hence it affects Gaussian brute-force directed scans too.

Scope / workaround

PR #985 (queue-executed ASE/UMA jobs) works around this inside the ASE adapter only — it derives the constraint locally so UMA rotor scans are correct. The general fix — deriving the constraint in Scheduler.run_job() (or having each adapter honor torsions+dihedrals) so all brute-force directed scans are constrained — is out of scope for that PR and is what this issue tracks.

Suggested fix

In Scheduler.run_job() / the directed-scan spawn path, translate the job's torsions + dihedrals into the constraints argument (1-indexed atom tuples + target value) before dispatch, so every adapter receives a real constraint. Add a regression check that a brute-force directed scan on a floppy rotor produces a non-flat V(φ).

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start at Scheduler.run_job() and its directed-scan spawn path, tracing torsions and dihedrals into constraints before adapter dispatch. Compare how the Gaussian and ASE adapters receive these values. Done means a floppy-rotor brute-force directed scan has a regression check showing a non-flat V(φ), rather than energies collapsing to one minimum.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
backend, testing
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.