Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #695 +/- ##
==========================================
+ Coverage 60.68% 63.00% +2.31%
==========================================
Files 103 113 +10
Lines 31186 37958 +6772
Branches 8128 9956 +1828
==========================================
+ Hits 18926 23914 +4988
- Misses 9910 11163 +1253
- Partials 2350 2881 +531
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
8825e9f to
cbec920
Compare
908773e to
0acc5d4
Compare
added the linear adapter families
So that parallel execution of tests on CI won't run w/o job.execute()
When an ARCSpecies is constructed with both an adjlist (or SMILES) and xyz, mol_from_xyz re-perceives the molecule from the 3D geometry. Previously, perceive_molecule_from_xyz was called with n_radicals=None (the default) even when the existing mol carried radical information. For singlet biradicals this caused the perception to produce a closed-shell molecule with lone pairs instead of radical centers, which then replaced the original mol and broke downstream family detection (e.g., Intra_Disproportionation was not identified). Now, when self.mol already has radical electrons and the user did not explicitly set number_of_radicals, the radical count is derived from self.mol and forwarded to perceive_molecule_from_xyz and is_mol_valid.
Also added an RMG installation note
To read additional types of RMG-database families
UK -> US English spelling, remove excessive hyphenation
so scissors / atom mapping / tests can use fewer confs
To allow another SMILES string. Actually, the test isn't great, the multiplicity cannot be 1, it should probably be 2. However, multiplicity 2 gives an even worse result with many radicals: 'OCCC(C(COO)(O[CH2])C)(C[C]1[CH][CH][C]([CH][CH]1)NO)SC' (all carbon atoms on the benzene ring are marked as having a radical). This is out of scope for the current linear TS adapter PR. The fix should be easy (detect a possibly aromatic ring with all radicals, at least for the C-only case, then make it aromatic). Leaving it as is for now since this is indeed a crazy molecule.
In arc/family/family.py: 1. Caches ReactionFamily instances per process. Adds a _cache: Dict[(label, consider_arc_families), ReactionFamily] class dict, plus a __new__ that returns the cached instance for a repeat key. __init__ early-returns on cache hits via a _initialized flag, so the parsing work runs at most once per family per process. 2. Caches groups.py file reads. Extracts the file-loading logic out of ReactionFamily.get_groups_file_as_lines into a module-level _read_groups_file_lines(label, consider_arc_families) decorated with @functools.lru_cache(maxsize=None). Returns a tuple (immutable) so callers can't poison the cache. The method now just delegates. 3. Caches recommended family sets. Decorates get_rmg_recommended_family_sets with @functools.lru_cache(maxsize=1) since its result is also process-stable. 4. Moves the label is None guard from __init__ to __new__ (it has to run before cache lookup). Net effect: repeated ReactionFamily(label) calls — common in mapping/heuristics — stop re-reading and re-parsing the same groups.py.
Add an optional family arg so per-product_dict paths can use their own family's recipe, and stop deep-copying species just to count them in is_unimolecular/is_isomerization.
Document the non-consolidated-only contract of update_zmat_by_xyz and add negative anchors tests for xyz_to_zmat.
Reuse _connected_components/bfs_path/two_sphere_intersection/ bond_order_map instead of inline copies, keep a single PAULING_DELTA source, drop the ignored reactive_indices arg, remove the unused has_close_h_pair_on_same_parent, and mark has_inward_migrating_group_h as a test-support detector.
- reorder the product into the reactant frame when rxn.atom_map exists, and skip product bond-set filtering when the mol reorder fails - snapshot/restore rxn atom_map/family/product_dicts around execute_incore so approximations don't leak into the restart YAML - stoichiometric counts so symmetric dissociations (A <=> B + B) are classified as dissociation - per-reaction crash isolation and a missing-coordinates guard - memoize map_rxn across the weight sweep; cache empty wider-family scans; pass each path's own family to get_expected_changing_bonds - fix NameError in an except handler and the always-zero success counter - dedup repeated contraction/ring/BFS blocks into helpers - tests: fresh fixtures and per-test temp dirs (xdist-safe)
Add 'linear' to default_incore_adapters and to the default ts_adapters.
- scheduler unknown-family TSG admission predicate - ReactionFamily per-process instance cache - map_rxn None-fragment-map guard - economic conformer generation wiring - radical perception hint multiplicity-mismatch negative case
tearDownClass is skipped when setUpClass raises, leaking arc/testing project dirs; register cleanups before adapter construction instead.
LeenFahoum
approved these changes
Jun 10, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds a new Linear TS search adapter that builds TS guesses from atom-mapped reactants and products via Z-matrix chimera construction with Hammond-biased weighting. The adapter is incore-only, plugs into ARC's scheduler like heuristics/autotst_ts, and delegates heavy geometry work to a new linear_utils/ subpackage (5 modules). Currently implemented for isomerization/unimolecular reactions.
The PR also carries supporting additions to arc/species/zmat.py (anchors, smart-anchor detection, zmat re-indexing helpers), arc/species/converter.py (atom-map reordering), arc/reaction/reaction.py (is_unimolecular, refined is_isomerization), and a biradical-preservation fix in arc/species/species.py. CI was hardened: pinned action,
-n 4 --dist workstealfor stability, and obabel test made self-contained.