Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
781 commits
Select commit Hold shift + click to select a range
3237e3b
Remove outdated Cantera files from testing directory.
rwest May 3, 2026
1f40ed9
Add Cantera files from main test, to testing folder.
rwest May 3, 2026
72a2bda
mainTest creates Cantera yaml files for testing.
rwest May 4, 2026
bb4b2ab
Add WriterConfig: per-writer output configuration data class
rwest May 6, 2026
a1ee9fb
Replaced cantera1 yaml test file with the verbose annotated one
rwest May 4, 2026
fb0d161
Parse per-writer configs from input files; store on RMG object
rwest May 6, 2026
bc3f967
fixup! Add Cantera files from main test, to testing folder.
rwest May 4, 2026
037cad1
Wire WriterConfig into register_listeners() and all output writers
rwest May 6, 2026
ab4d0a4
Fix yaml_cantera1Test test (generator name)
rwest May 4, 2026
06cafcb
Docs, example input, and unit tests for per-writer output configuration
rwest May 6, 2026
9f357cc
Fix yaml_cantera2Test mock RMG object missing verbose_comments attrib…
rwest May 4, 2026
b796eb9
Guard end-of-run Cantera translation and comparison behind writer con…
rwest May 6, 2026
20fc705
Demonstrate per-writer config in example inputs
rwest May 6, 2026
39593f9
Fix --walltime CLI precedence over input.py settings
rwest May 6, 2026
4e0f5b0
Merge pull request #2945 to enhance output options
rwest May 6, 2026
5c364dc
Adding documentation for new output writers.
rwest May 7, 2026
442213b
Fix end-of-run Cantera translation: correct folder name and guard mis…
rwest May 7, 2026
8ac28f6
mainTest now turns on the Cantera YAML writers for testing.
rwest May 7, 2026
458bb3f
Tweak iteration counting and seed saving.
rwest May 7, 2026
4a8245a
Merge pull request #2800 to add native Cantera YAML writing
rwest May 8, 2026
6694323
Don't compute RTP if constant volume reactor
sevyharris May 1, 2026
a032eb3
correct surface solver docstring to reflect surface, not simple solver
sevyharris May 1, 2026
b1c38af
Add Jacobian function for SurfaceReactor
sevyharris May 1, 2026
7c0c307
Cache inv omega for faster jacobian execution
sevyharris May 1, 2026
759d155
add SurfaceReactor jacobian test with finite differences
sevyharris May 1, 2026
9ec98be
specify units for V, A, and total sites in SurfaceReactor comments
sevyharris May 4, 2026
d70ccba
Merge pull request #2935 from sevyharris/surface_sensitivity
sevyharris May 8, 2026
df0d37a
Undo separate handling of autogen trees in uncertainty
sevyharris May 7, 2026
c28b1df
add local analysis test for uncertainty
sevyharris May 7, 2026
9c92f1c
uncertainty: add Rate Rule prefix before each rule entry
sevyharris May 8, 2026
2bcd747
uncertainty: separate family and non-exact error
sevyharris May 8, 2026
dbf3cd2
New formulation of dependent parameters in uncertainty tool
sevyharris May 7, 2026
cf95429
add tests for uncertainty covariance matrices
sevyharris May 8, 2026
b192132
Merge pull request #2932 from sevyharris/uncertainty_covariance
sevyharris May 9, 2026
6454ef8
passing extension_iter_item_cap to make_tree_nodes even if cascade al…
Nora-Khalil May 5, 2026
731b402
Merge pull request #2941 to tweak SIDT tree generation
rwest May 9, 2026
14b014e
Add surface sensitivity to uncertainty tool
sevyharris Apr 16, 2026
b18deff
Merge pull request #2928 from sevyharris/surface_uncertainty_sens
sevyharris May 11, 2026
e6e9282
Add pysidt-rmg to environment
mjohnson541 Mar 27, 2026
87ee607
add pysidt imports in data/thermo.py
mjohnson541 Mar 27, 2026
523f28d
add pysidt to conda build dependencies
mjohnson541 Mar 28, 2026
cb7612e
handle use of adsorption corrections for training reactions
mjohnson541 Apr 30, 2026
f13002a
handle setup and loading of thermo SIDTs
mjohnson541 Apr 30, 2026
a87e4cb
load adsorption correction SIDTs
mjohnson541 Apr 30, 2026
6ac04ec
enable use of SIDT adsorption correction predictors
mjohnson541 Apr 30, 2026
dc5561b
load only files that are present
mjohnson541 May 1, 2026
afe6f74
add database tests that the SIDTs load properly and work
mjohnson541 May 5, 2026
ddeeeea
properly parse metal out from SIDT adsorption tree specification
mjohnson541 May 6, 2026
fdadd34
handle missing tridentate substructures
mjohnson541 May 6, 2026
2ffa731
add ability to load BEEF correlations for UQ
sevyharris May 10, 2026
1e4c425
zero out negative contributions to local uncertainty
sevyharris May 11, 2026
929772a
Merge pull request #2939 from ReactionMechanismGenerator/sidt_adsorpt…
mjohnson541 May 12, 2026
a7c87c4
Merge branch 'main' into uncertainty_export_beef
JacksonBurns May 12, 2026
ce3bb55
Merge pull request #2934 from sevyharris/uncertainty_export_beef
sevyharris May 12, 2026
6eb34fa
Version 4.0.0.rc1
JacksonBurns Apr 22, 2026
2dd57dd
Merge pull request #2931 from ReactionMechanismGenerator/preview/4.0.…
JacksonBurns May 12, 2026
b90c866
update notation in test_parse_thermo_comments
bjkreitz May 13, 2026
130282d
additional fixes for parse_thermo
bjkreitz May 13, 2026
91c2dc6
fix test_adsorbate_thermo_raises_error
bjkreitz May 13, 2026
b35055d
Merge pull request #2949 from ReactionMechanismGenerator/fix_thermo_t…
JacksonBurns May 13, 2026
c8fd589
Upgrade CI actions: setup-miniconda v3→v4, install-juliaup v2→v3
Copilot May 14, 2026
3ae660b
Upgrade remaining CI actions to latest major versions
Copilot May 14, 2026
1de6281
Merge pull request #2951 to upgrade github workflow CI actions
rwest May 15, 2026
81e4602
Use eigh for moment-of-inertia diagonalization
rwest May 15, 2026
4ab53c3
Merge pull request #2954 to clear sporadic CI failures in arkane
rwest May 15, 2026
05ae810
Pin python=3.11 in environment.yml; update CI to rewrite pin per matrix
rwest May 14, 2026
41eae19
Update source install docs with build-tool prerequisites and python p…
rwest May 14, 2026
86080bc
Edit the installation instructions (from source in Anaconda environment)
rwest May 14, 2026
753f4c5
Avoid telling people to sudo rm -rf anything.
rwest May 14, 2026
fa5b23d
Add pip to the conda environment.yml.
rwest May 15, 2026
27c4fe0
Merge pull request #2953 to fix Mac install instructions
rwest May 15, 2026
dbdd006
conda_build: add 180min timeout, runner-info step, light solver verbo…
rwest May 15, 2026
2522ed9
Reduce conda-build solver search space in .conda recipe
rwest May 15, 2026
1a61036
Tighten further open floors in conda recipe based on candidate count
rwest May 15, 2026
8fd3e18
Set conda channel_priority to strict in conda_build workflow
rwest May 15, 2026
f4b39fa
Remove unused conda test-only dependencies from recipe
Copilot May 15, 2026
67b990c
Sync environment.yml dependency floors with conda recipe
Copilot May 15, 2026
f407370
When testing pull requests, only Conda Build on Python 3.11 (not 3.9)
rwest May 16, 2026
89cf11e
Clean up conda build script and environment.
rwest May 16, 2026
272ce6c
Raised the floor on the version number of pyopenssl
rwest May 16, 2026
168da76
Merge pull request #2956 to accelerate (fix) conda building
rwest May 19, 2026
bd9cb7e
Initial plan
Copilot May 19, 2026
7e5c01c
Fix conda build workflow broken pipe in diagnostics
Copilot May 19, 2026
4655082
Merge pull request #2957 from ReactionMechanismGenerator/copilot/fix-…
JacksonBurns May 19, 2026
89594c8
If checking the links in the documentation times out, don't fail the …
rwest May 20, 2026
6c48021
Cython optimizations in molecule.py/.pxd
rwest May 19, 2026
839be85
Cython optimizations in group.py. atoms->vertices, bonds->edges
rwest May 19, 2026
dec95d4
Fix none_dealloc bug introduced in previous Cython declaration.
rwest May 19, 2026
b547b09
More Cython optimizations in molecule.py.
rwest May 19, 2026
6441197
Modest cleanup of ensure_independent_atom_ids.
rwest May 19, 2026
310d1aa
Optimize filtration.py hot paths.
rwest May 19, 2026
3b6dd79
Merge pull request #2958 from ReactionMechanismGenerator/cythonopt
JacksonBurns May 21, 2026
f987aa2
Fix cython declarations and some optimizations in molecule.py
rwest May 21, 2026
7881267
More cython declaration fixes in molecule.py
rwest May 21, 2026
7d729a8
Merge pull request #2960 for optimization and cython tweaks
rwest May 22, 2026
bfdb12b
Fix off-by-one in CHEMKIN THERM default-range line I/O
rwest May 15, 2026
d1473f8
Realign THERM default-range header in committed CHEMKIN fixtures
rwest May 15, 2026
5fa7bf7
Chemkin was not writing isotopes correctly.
rwest May 21, 2026
9fce451
Optimization in chemkin write_thermo_entry
rwest May 22, 2026
fc1c6bb
Add unit test for warning about badly formatted THERM line
rwest May 22, 2026
8a0b7fe
Merge pull request #2955 to fix Chemkin I/O
rwest May 22, 2026
128a6ab
Add unload_libraries helper function
sevyharris May 28, 2026
b3065c5
Merge pull request #2964 from sevyharris/unload_libraries
sevyharris May 28, 2026
7b00786
Fix to_cantera() to use equation string, avoiding Cantera third-body …
rwest May 11, 2026
6aef024
[yaml_cantera2] Use full elements list, like in antera1 method
djlucey May 11, 2026
18f1772
counts surface sites and assigns the corresponding field
djlucey May 12, 2026
ea2f2be
use mol.number_of_surface_sites() instead of inline X-atom count
rwest May 12, 2026
f5c702d
adds transport note to each species, not just in annotated yaml to ma…
djlucey May 12, 2026
7a1074f
Restore verbose gate on transport notes; strip them from ck2yaml non-…
rwest May 12, 2026
6c7f2d8
separates gas reactions and surface reactions to match ck2yaml
djlucey May 12, 2026
b631993
adds 'state' to gas and surface phases to match ck2yaml
djlucey May 12, 2026
95034c3
tests for entries and fields that are expected from ck2yaml and compa…
djlucey May 12, 2026
8d0ea1d
fix tests to match actual verbose-gated transport note and sites>1 be…
rwest May 13, 2026
3216fa7
yaml_fix generated recent files for comparison mainTest
djlucey May 12, 2026
ed8efc9
remove committed golden YAML files; gitignore from_main_test.yaml
rwest May 13, 2026
a2bad71
Create yaml_writer_data subdirs before copying test artifacts
rwest May 14, 2026
416512c
Trim Cantera YAML and Chemkin elements blocks to elements in use
rwest May 14, 2026
be06c2d
Wipe stale Cantera/Chemkin output dirs at job startup
rwest May 15, 2026
4bf3cb4
Fix Arkane call to write_elements_section after signature change
rwest May 15, 2026
9a1d76e
Skip empty Cantera YAML 'elements' blocks to match ck2yaml output
rwest May 15, 2026
168e030
Use => for irreversible reactions in Cantera YAML writer
rwest May 16, 2026
5dd2d11
Distinguish three-body vs falloff equation notation in Cantera YAML 2
rwest May 16, 2026
419c61b
Strip spurious efficiencies in yaml_cantera1 writer
rwest May 16, 2026
dd118cd
Emit 'type: three-body' for ThirdBody reactions in cantera1 writer
rwest May 18, 2026
ad5f72d
Preserve reactant ordering in cantera1 YAML equation strings
rwest May 18, 2026
829791d
Render multi-line Cantera YAML 'note' fields as '|' block scalars
rwest May 18, 2026
a39f30f
Add missing 'Flux pairs' / 'Specific third body collider' to Cantera …
rwest May 18, 2026
0db55c0
Number reactions in Cantera YAML notes the same way Chemkin does
rwest May 18, 2026
a70b99a
Tweaking comments in cantera yaml writers
rwest May 18, 2026
1666074
Fix verboseComments handling in Cantera YAML writers
rwest May 19, 2026
9880bb7
Remove efficiencies dict from yaml if it's empty
rwest May 19, 2026
b6890ed
Harden wrapped-flow note stripping in YAML cleanup
rwest May 19, 2026
928b413
Revert "Harden wrapped-flow note stripping in YAML cleanup"
rwest May 19, 2026
3468e40
Suppress CodeQL ReDoS alert on wrapped-flow note regex
rwest May 19, 2026
cffbbcb
Small things from code review, in yaml_cantera writers
rwest May 20, 2026
9cf87ac
New tests for Chemkin writing with dynamic ELEMENTS block.
rwest May 20, 2026
faf59d9
[yaml_cantera2] handle negative A values in kinetics.
rwest May 20, 2026
d5be55e
[yaml_cantera1] handle negative A factors (also fixes to_cantera)
rwest May 20, 2026
db0862f
chemkin: print all used elements.
rwest May 20, 2026
598a0d4
Move YAML note stripping helper to util
rwest May 21, 2026
f873f83
Added new utilTest.py file, to test the yaml note extractor.
rwest May 21, 2026
afe5a73
Rename rmgUtilTest so it doesn't clash with rmgpy/molecule/utilTest.py
rwest May 21, 2026
afc1db9
Fixes to tools/compare_cantera_yaml
rwest May 21, 2026
c806c6c
Tweaking the yaml note stripper
rwest May 21, 2026
4db817b
Another weird case in the yaml note-stripper.
rwest May 21, 2026
424096d
Ensure the test yaml snippets are valid.
rwest May 21, 2026
a7d12cc
Fixes to element handling for electrons, in Chemkin and Cantera.
rwest May 21, 2026
b49f12f
Move yaml_writer_data .gitignore rule into root .gitignore, and fixup
rwest May 22, 2026
82186bb
Rename strip_yaml_notes helper function in rmgUtilTest
rwest May 22, 2026
2cf7e9c
Add details to a comment in a unit test.
rwest May 22, 2026
a8911e8
Defenses in chemkin writing for electrons, and cythonization.
rwest May 22, 2026
a500581
Unit test for the new/safer to_cantera method for reactions with spec…
rwest May 22, 2026
bbbd1b2
Log warnings in Species.to_cantera when charge and # electrons disagree
rwest May 22, 2026
f566577
The CanteraWriter2 now also warns if # electrons differs from -charge.
rwest May 22, 2026
585bafb
Deduplicate CanteraYamlFileComparer into a shared test helper.
rwest May 22, 2026
d6bd5e2
Harden the TestRecentlyGeneratedCanteraYaml*GasOnly tests.
rwest May 22, 2026
a140ce2
Remove some defunct outdated tests.
rwest May 22, 2026
e14b7c7
Fix testKeysMatch: pop header metadata from both yamls, not just yaml1.
rwest May 22, 2026
56c2740
Merge pull request #2947 to overhaul Cantera YAML writing
rwest May 29, 2026
039d237
Reset solvent database in liquidTest teardown
sevyharris May 29, 2026
7cbb785
modify max_heavy_atoms constraint
bjkreitz Jun 1, 2026
b386b66
Merge pull request #2972 from ReactionMechanismGenerator/constraints
JacksonBurns Jun 1, 2026
74edcab
Add get_num_heavy_atoms method to Molecule and Fragment
rwest Jun 1, 2026
be1b04c
Use get_num_heavy_atoms in fails_species_constraints
rwest Jun 1, 2026
53a6052
Avoid calling fails_species_constraints twice on rejection
rwest Jun 1, 2026
bfd288a
Merge pull request #2974 for constraints handling
rwest Jun 1, 2026
f5f348a
add generate_reverse_reaction function
bjkreitz Jun 2, 2026
9fe250d
add function to flip reactions in model.py
bjkreitz Jun 2, 2026
3950756
fix isomorphism issue by using make_new_species on reactants and prod…
bjkreitz Jun 2, 2026
8137a2d
increase efficiency in get_reverse_reaction
bjkreitz Jun 2, 2026
bcf4a8c
create function compute_thermo_coverage_corrections
bjkreitz Jun 2, 2026
bdfc180
use coverage dependent kr in jacobian
bjkreitz Jun 2, 2026
410dd4b
remove deepcopy of Keq
bjkreitz Jun 2, 2026
4330d50
adjust matrix multiplication for free_energy_coverage_corrections
bjkreitz Jun 2, 2026
2d068d0
remove copy of Keq
bjkreitz Jun 2, 2026
c9b0b7c
Add finite-difference Jacobian test for thermo coverage dependence
rwest Jun 2, 2026
d105ded
Cythonize compute_thermo_coverage_corrections
rwest Jun 2, 2026
ab1247b
Harden get_reverse_reaction and the coverage-dependence reaction flip
rwest Jun 2, 2026
957281c
Apply kinetic coverage_dependence correction in the SurfaceReactor Ja…
rwest Jun 2, 2026
a39ee46
get_reverse_reaction can handle missing kinetics.
rwest Jun 2, 2026
51f0ccc
Cython declare Reaction.copy
rwest Jun 2, 2026
ec248d3
adjust flipping routine
bjkreitz Jun 2, 2026
45112f9
remove get_reverse_reaction
bjkreitz Jun 2, 2026
dcfc5e2
remove TODO comment in generate_rate_coefficient
bjkreitz Jun 2, 2026
4348df2
remove import copy
bjkreitz Jun 2, 2026
c895bc1
add info for flipped reaction
bjkreitz Jun 3, 2026
9a42685
change logging.debug to logging.info
bjkreitz Jun 3, 2026
757525f
Restructure coverage-dependence reaction flip logic
rwest Jun 4, 2026
f416492
Merge pull request #2975 to fix coverage-dependent thermo
rwest Jun 4, 2026
be31714
add extra check in case ADS source is empty to avoid crashing
sevyharris May 21, 2026
00549c6
add surface uncertainty demo notebook
sevyharris May 21, 2026
d916abc
bugfix: surface UQ make sure X has 0 uncertainty
sevyharris Jun 1, 2026
5d9f602
UQ: read covariance from .csv instead of .npy
sevyharris Jun 3, 2026
8753522
Add example using covariance matrices to sample in Cantera
sevyharris Jun 3, 2026
f892b7c
Merge pull request #2959 from sevyharris/surface_uncertainty_demo_not…
rwest Jun 4, 2026
77cac02
Fix Cantera 3.2 ReactorSurface syncState warning
rwest Jun 4, 2026
eb8c864
Use non-deprecated Cantera phase model names
rwest Jun 4, 2026
cb067a1
Merge pull request #2976 from rwest/ctdep
JacksonBurns Jun 5, 2026
6ab5296
Reduce "error" logging in regression testing (only WARN and above)
rwest Jun 4, 2026
138c164
In regression.py restore INFO logging to stdout
rwest Jun 4, 2026
ee8eae3
Read core species from external dictionary
sevyharris Mar 3, 2026
1572d08
Add core species list usage to documentation
sevyharris Mar 3, 2026
9114bae
Apply suggestion from @JacksonBurns
JacksonBurns Jun 5, 2026
5791411
Tweak output in regression testing.
rwest Jun 5, 2026
6d9d856
In CI context, do NOT log to stdout in regression.py
rwest Jun 5, 2026
0950047
Merge pull request #2891 from sevyharris/core_species_list
JacksonBurns Jun 5, 2026
ec0d1bb
Merge pull request #2978 from rwest/lesslog
JacksonBurns Jun 5, 2026
75620d5
Add tests for UQ assign_intermediate_uncertainties
sevyharris May 29, 2026
8940dde
Add uncertainty tests for correlated library match
sevyharris May 27, 2026
0e7ce93
Merge pull request #2968 from sevyharris/add_uq_assign_intermediate_t…
JacksonBurns Jun 8, 2026
8c0d258
draw vdW bond, the same way we do H bonds
bjkreitz Jul 12, 2024
e1556f5
Adjust remove vdW bond, using new has_covalent_surface_bond function
bjkreitz Jul 15, 2024
9bf28a5
Make has_covalent_surface_bond more efficient.
rwest May 19, 2026
3c73698
Add test_has_covalent_surface_bond to test has_covalent_surface_bond.
rwest May 19, 2026
37b2b28
Simplify remove_van_der_waals_bonds
rwest May 19, 2026
da4c7d3
Accelerate is_multidentate.
rwest May 19, 2026
5528ac4
change is_molecule_forbidden
bjkreitz Jul 17, 2024
3d29d61
adding find_formate_delocalization_paths to pathfinder
bjkreitz May 13, 2026
df826a6
Fix some Cython declarations in pathfinder.py
rwest May 19, 2026
d0a0cce
add resonance structure generation for formate to resonance.py
bjkreitz May 13, 2026
666a140
add label for vdW bond in get_desorbed_molecules
bjkreitz May 13, 2026
707a2e4
add more constraints to formate path in resonance.py
bjkreitz May 18, 2026
9a41f93
clean up pathfinder and add constraints
bjkreitz May 18, 2026
0183e97
add features for N species
bjkreitz May 18, 2026
31c9f95
Consider generate_formate_resonance_structures when no features speci…
rwest May 19, 2026
bf70032
Rename generate_formate_resonance_structures to generate_adsorbate_fo…
rwest May 19, 2026
d0c5940
Test the new remove_van_der_waals_bonds behaviour.
rwest May 19, 2026
1a8cc77
Add comments describing current implementation of is_molecule_forbidden
rwest May 19, 2026
eb78197
Refactor is_molecule_forbidden checks in reaction family.
rwest May 19, 2026
4ab11a9
Add has_vdw_surface_bond method on Molecule.
rwest May 19, 2026
1d34efa
Fix bug and add tests: unbonded X gives True for has_vdw_surface_bond
rwest May 20, 2026
fccfdc7
Avoid calling fails_species_constraints() twice in a row.
rwest May 20, 2026
b596c03
restructure is_molecule_forbbiden
bjkreitz May 21, 2026
109a9d0
restructure is_molecule_forbidden to check for vdWBidentate in family…
bjkreitz Jun 3, 2026
bdf7053
TEMPORARY: set RMG_DATABASE_BRANCH: formate_families
rwest Jun 4, 2026
e1573da
Improve diagnostics for "Family had N reactants?" kinetics test failure
rwest Jun 4, 2026
056291b
Revert "TEMPORARY: set RMG_DATABASE_BRANCH: formate_families"
JacksonBurns Jun 8, 2026
9901968
Merge pull request #2706 from ReactionMechanismGenerator/vdW_bonds
JacksonBurns Jun 8, 2026
8c95330
increment version
JacksonBurns May 29, 2026
f8ce330
add release notes
JacksonBurns May 29, 2026
bb22b95
Update documentation/source/users/rmg/installation/anacondaUser.rst
JacksonBurns Jun 8, 2026
0966416
review comment from @sevyharris
JacksonBurns Jun 8, 2026
37b5f95
split 'and' bullet into two
JacksonBurns Jun 8, 2026
18c837f
limit juliacall version
JacksonBurns Jun 8, 2026
dfd8284
reorder by importance
JacksonBurns Jun 9, 2026
12c0551
Minor edits to release notes
rwest Jun 9, 2026
c849728
update utility shebang to python3 and license year to 2026
sevyharris Jun 9, 2026
ed76cc6
update headers from 2023 to 2026
sevyharris Jun 9, 2026
58b084b
Merge pull request #2980 from sevyharris/update_headers_2026
JacksonBurns Jun 9, 2026
643259b
Merge pull request #2967 from ReactionMechanismGenerator/release/v4.0.0
JacksonBurns Jun 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
14 changes: 14 additions & 0 deletions .conda/conda_build_config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Restrict conda-build's variant matrix so the solver does not enumerate
# python/numpy combinations from internal_defaults. The CI workflow's
# CONDA_PY env var narrows to one of these python versions per matrix cell.
#
# Without this file, conda-build considers every (python, numpy) pair from
# its internal defaults during the "Getting pinned dependencies" phase,
# which substantially enlarges the search space the libmamba solver has
# to traverse.
python:
- 3.9
- 3.10
- 3.11
numpy:
- 1.26
151 changes: 27 additions & 124 deletions .conda/meta.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,173 +4,76 @@
# RMG-Py into binaries which can then be uploaded for access via the conda package manager
# to use this file, you can follow the procedure shown in .github/workflows/conda_build.yml
#
# Variant axes (python, numpy) are pinned in .conda/conda_build_config.yaml so that
# conda-build does not enumerate every combination from its internal defaults.
#
package:
name: rmg
version: 3.3.0
version: 4.0.0

source:
path: ../

build:
number: 0
script: |
python utilities.py check-pydas # write the rmgpy/solver/settings.pxi file
python setup.py install --single-version-externally-managed --record=record.txt
{{ PYTHON }} utilities.py check-pydas # write the rmgpy/solver/settings.pxi file
{{ PYTHON }} setup.py install --single-version-externally-managed --record=record.txt

requirements:
build:
- {{ compiler('c') }}
host:
- conda-forge::cairo
- conda-forge::cairocffi
- conda-forge::ffmpeg >=7
- conda-forge::xlrd
- conda-forge::xlwt
- conda-forge::h5py
- conda-forge::graphviz >=12
- conda-forge::markupsafe
- conda-forge::psutil
- conda-forge::ncurses
- conda-forge::suitesparse
- conda-forge::graphviz
- conda-forge::pyopenssl >20
- conda-forge::coolprop
- conda-forge::cantera =2.6
- conda-forge::mopac
- conda-forge::cclib >=1.6.3,<1.9
- conda-forge::openbabel >=3
- conda-forge::rdkit >=2022.09.1
- conda-forge::python >=3.9
- conda-forge::setuptools <80
- conda-forge::coverage
- conda-forge::cython >=0.25.2,<3.1
- conda-forge::scikit-learn
- conda-forge::scipy >=1.9
- conda-forge::numpy >=1.10.0,<2
- conda-forge::pydot
- conda-forge::jinja2
- conda-forge::jupyter
- conda-forge::pymongo
- conda-forge::pyparsing
- conda-forge::pyyaml
- conda-forge::networkx
- conda-forge::pytest
- conda-forge::pytest-cov
- conda-forge::pytest-check
- conda-forge::pyutilib
- conda-forge::matplotlib >=1.5
- conda-forge::mpmath
- conda-forge::pandas
- conda-forge::gprof2dot
- conda-forge::numdifftools
- conda-forge::quantities !=0.16.0,!=0.16.1
- conda-forge::ringdecomposerlib-python
- rmg::pydas >=1.0.3
- rmg::pydqed >=1.0.3
- rmg::symmetry
- rmg::rmgdatabase =3.3.0
- blas=*=openblas
run:
host: &runtime_requirements
- conda-forge::cairo
- conda-forge::cairocffi
- conda-forge::ffmpeg >=7
- conda-forge::xlrd
- conda-forge::xlwt
- conda-forge::h5py
- conda-forge::h5py >=3.10
- conda-forge::graphviz >=12
- conda-forge::markupsafe
- conda-forge::psutil
- conda-forge::ncurses
- conda-forge::suitesparse
- conda-forge::graphviz
- conda-forge::pyopenssl >20
- conda-forge::pyopenssl >24
- conda-forge::coolprop
- conda-forge::cantera =2.6
- conda-forge::cantera >=3.0
- conda-forge::mopac
- conda-forge::cclib >=1.6.3,<1.9
- conda-forge::openbabel >=3
- conda-forge::rdkit >=2022.09.1
- conda-forge::python >=3.9
- conda-forge::setuptools <80
- conda-forge::coverage
- conda-forge::cython >=0.25.2,<3.1
- conda-forge::scikit-learn
- conda-forge::scipy >=1.9
- conda-forge::numpy >=1.10.0,<2
- conda-forge::rdkit >=2024
# python intentionally left loose so the CI matrix (via CONDA_PY)
# can pin it without a contradictory-deps error. The real variant pin
# lives in .conda/conda_build_config.yaml.
- conda-forge::python >=3.9,<3.12
- conda-forge::setuptools >=70,<80
- conda-forge::cython >=3.0,<3.1
- conda-forge::scikit-learn >=1.3
- conda-forge::scipy >=1.13
- conda-forge::numpy >=1.24,<2
- conda-forge::pydot
- conda-forge::jinja2
- conda-forge::jupyter
- conda-forge::pymongo
- conda-forge::pyparsing
- conda-forge::pyyaml
- conda-forge::networkx
- conda-forge::pytest
- conda-forge::pytest-cov
- conda-forge::pytest-check
- conda-forge::pyutilib
- conda-forge::matplotlib >=1.5
- conda-forge::matplotlib >=3.5
- conda-forge::mpmath
- conda-forge::pandas
- conda-forge::pandas >=2
- conda-forge::gprof2dot
- conda-forge::numdifftools
- conda-forge::quantities !=0.16.0,!=0.16.1
- conda-forge::ringdecomposerlib-python
- rmg::pysidt-rmg >=1.2
- rmg::pydas >=1.0.3
- rmg::pydqed >=1.0.3
- rmg::symmetry
- rmg::rmgdatabase =3.3.0
- rmg::rmgdatabase =4.0.0
- blas=*=openblas
run: *runtime_requirements
test:
requires:
- conda-forge::cairo
- conda-forge::cairocffi
- conda-forge::ffmpeg >=7
- conda-forge::xlrd
- conda-forge::xlwt
- conda-forge::h5py
- conda-forge::graphviz >=12
- conda-forge::markupsafe
- conda-forge::psutil
- conda-forge::ncurses
- conda-forge::suitesparse
- conda-forge::graphviz
- conda-forge::pyopenssl >20
- conda-forge::coolprop
- conda-forge::cantera =2.6
- conda-forge::mopac
- conda-forge::cclib >=1.6.3,<1.9
- conda-forge::openbabel >=3
- conda-forge::rdkit >=2022.09.1
- conda-forge::python >=3.9
- conda-forge::setuptools <80
- conda-forge::coverage
- conda-forge::cython >=0.25.2,<3.1
- conda-forge::scikit-learn
- conda-forge::scipy >=1.9
- conda-forge::numpy >=1.10.0,<2
- conda-forge::pydot
- conda-forge::jinja2
- conda-forge::jupyter
- conda-forge::pymongo
- conda-forge::pyparsing
- conda-forge::pyyaml
- conda-forge::networkx
- conda-forge::pytest
- conda-forge::pytest-cov
- conda-forge::pytest-check
- conda-forge::pyutilib
- conda-forge::matplotlib >=1.5
- conda-forge::mpmath
- conda-forge::pandas
- conda-forge::gprof2dot
- conda-forge::numdifftools
- conda-forge::quantities !=0.16.0,!=0.16.1
- conda-forge::ringdecomposerlib-python
- rmg::pydas >=1.0.3
- rmg::pydqed >=1.0.3
- rmg::symmetry
- rmg::rmgdatabase =3.3.0
- blas=*=openblas
# Keep this minimal: test commands below run import checks plus two example
# command-line runs, and do not invoke the pytest suite.
source_files:
- 'examples/rmg/superminimal'
- 'examples/arkane/networks/n-butanol_msc'
Expand Down
180 changes: 180 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
# RMG-Py Copilot Instructions

## Project Overview
RMG-Py is the Reaction Mechanism Generator - an automatic chemical kinetics mechanism generator. It consists of two main components:
- **RMG** (`rmgpy/`): Core mechanism generation engine
- **Arkane** (`arkane/`): Statistical mechanics and transition state theory calculations

## Architecture

### Core Packages
- `rmgpy/molecule/` - Molecular graph representation (`Molecule`, `Atom`, `Bond`, `Group`)
- `rmgpy/thermo/` - Thermodynamic models (NASA, Wilhoit, ThermoData)
- `rmgpy/kinetics/` - Rate coefficient models (Arrhenius, Chebyshev, pressure-dependent)
- `rmgpy/solver/` - ODE solvers for reactor simulations
- `rmgpy/rmg/` - Main RMG algorithm (`main.py`, `model.py`, `react.py`)
- `rmgpy/data/` - Database interfaces for thermo, kinetics, transport

### Key Base Classes
- `RMGObject` (in `rmgpy/rmgobject.pyx`) - Base class providing `as_dict()`/`make_object()` for YAML serialization
- `Graph`/`Vertex`/`Edge` (in `rmgpy/molecule/graph.pyx`) - Graph isomorphism via VF2 algorithm
- `Species` and `Reaction` are central objects connecting molecules to thermodynamics and kinetics

### Cython Architecture
Performance-critical code uses Cython (`.pyx` files) with declaration files (`.pxd`):
- Some `.py` files are also cythonized — they have a `.pxd` sibling and are listed in `setup.py` `ext_modules` (e.g. `rmgpy/species.py`, `rmgpy/reaction.py`, `rmgpy/quantity.py`, `rmgpy/constants.py`, and most of `rmgpy/molecule/`). The compiled `.so` is what gets imported, so edits won't take effect until rebuilt.
- Always pair `.pyx` (or cythonized `.py`) with `.pxd` for public cdef classes/methods
- Use `cpdef` for methods callable from both Python and Cython
- Use `cimport` for Cython-level imports (e.g., `cimport rmgpy.constants as constants`)
- Register new Cython modules in `setup.py` `ext_modules` list
- Remember to re-compile (`make build`) after modifying any `.pyx`, `.pxd`, or cythonized `.py` file, or if there seem to be weird bugs in them.

## Development Commands
```bash
make install # First-time pip editable install + Cython build. Writes a .installed sentinel; subsequent `make install` is a no-op until `make clean`.
make build # Incremental in-place Cython rebuild (`setup.py build_ext --inplace`). Fast — use this after editing .pyx/.pxd/cythonized .py.
make # Default target: dep check, install if needed (via sentinel), then `make build`. Safe go-to.
make test # Run unit tests (excludes functional/database tests)
make test-functional # Run functional tests
make test-database # Run database tests
make test-all # Run all tests
make clean # Remove .so/.pyc/.c build artifacts, the build/ dir, the .installed sentinel, and pip-uninstall the package.
make decython # Remove most .so files for "pure Python" debugging (keeps _statmech.so, quantity.so, and rmgpy/solver/*.so). Pure python mode is not reliably tested and might not work.
make documentation # Build Sphinx docs
```

## Testing Conventions
- Tests live in `test/` mirroring `rmgpy/` and `arkane/` structure
- Test files: `*Test.py` (e.g., `speciesTest.py`, `reactionTest.py`)
- Test classes: `class TestClassName:` or `class ClassNameTest:`
- Use `pytest` with fixtures (`@pytest.fixture(autouse=True)` for setup)
- Markers: `@pytest.mark.functional`, `@pytest.mark.database`
- Run specific tests: `pytest -k "test_name_pattern"`

## Code Patterns

### Molecular Representations
```python
from rmgpy.molecule import Molecule
mol = Molecule().from_smiles("CC") # From SMILES
mol = Molecule().from_adjacency_list("""...""") # From adjacency list
mol.is_isomorphic(other_mol) # Graph isomorphism check
```

### Species and Reactions
```python
from rmgpy.species import Species
species = Species(label='ethane', molecule=[Molecule().from_smiles("CC")])
species.generate_resonance_structures()
```

```python
from rmgpy.reaction import Reaction
from rmgpy.kinetics import Arrhenius

# Reaction with Arrhenius kinetics
rxn = Reaction(
reactants=[Species(label='CH3', molecule=[Molecule(smiles='[CH3]')]),
Species(label='O2', molecule=[Molecule(smiles='[O][O]')])],
products=[Species(label='CH3OO', molecule=[Molecule(smiles='CO[O]')])],
kinetics=Arrhenius(A=(2.65e12, 'cm^3/(mol*s)'), n=0.0, Ea=(0.0, 'kJ/mol'), T0=(1, 'K')),
)

# Reaction without kinetics (e.g. for isomorphism checks)
rxn2 = Reaction(
reactants=[Species().from_smiles('[O]'), Species().from_smiles('O=S=O')],
products=[Species().from_smiles('O=S(=O)=O')],
)
```


## Input Files
- RMG inputs: Python scripts defining `database()`, `species()`, `simpleReactor()`, etc.
- See `examples/rmg/minimal/input.py` for structure and `examples/rmg/commented/input.py` for a file with detailed comments
- Arkane inputs: Python scripts with `species()`, `transitionState()`, `reaction()` blocks
- See `examples/arkane/` for examples

## RMG-database Integration
The **RMG-database** is a separate repository containing all thermodynamic, kinetics, and transport data. It's typically cloned alongside RMG-Py in a sibling folder named `RMG-database`.

### Database Structure (in RMG-database `input/` directory, eg. `RMG-database/input/thermo/`)
- `thermo/` - Thermodynamic libraries and group additivity data
- `kinetics/families/` - Reaction family templates with rate rules (e.g., `H_Abstraction`, `R_Addition_MultipleBond`)
- `kinetics/libraries/` - Curated rate coefficient libraries
- `solvation/` - Solvent and solute parameters
- `transport/` - Transport properties

### How RMG-Py Loads the Database
The `RMGDatabase` class (`rmgpy/data/rmg.py`) is the central interface:
```python
from rmgpy.data.rmg import RMGDatabase
database = RMGDatabase()
database.load(
path='/path/to/RMG-database/input',
thermo_libraries=['primaryThermoLibrary'],
kinetics_families='default',
reaction_libraries=[],
)
```

### Key Database Classes
- `ThermoDatabase` (`rmgpy/data/thermo.py`) - Estimates thermo via group additivity or libraries
- `KineticsDatabase` (`rmgpy/data/kinetics/database.py`) - Manages reaction families and libraries
- `KineticsFamily` (`rmgpy/data/kinetics/family.py`) - Template-based reaction generation using `Group` pattern matching
- `Entry` (`rmgpy/data/base.py`) - Base class for database entries with metadata

### Data Flow for Species Thermodynamics
1. `Species.get_thermo_data()` → `rmgpy.thermo.thermoengine.submit(species)`
2. `thermoengine.submit()` generates resonance structures, then dispatches to `ThermoDatabase.get_thermo_data(species)`
3. `ThermoDatabase` first checks thermo libraries for an exact match (via graph isomorphism)
4. If no library match is found, `ThermoDatabase` falls back to group additivity estimation using functional group contributions
5. The resolved result is returned as a `ThermoData`, `NASA`, or `Wilhoit` object


### Data Flow for Reaction Kinetics
1. `KineticsFamily.generate_reactions(reactants)` - Matches reactant molecules to family templates
2. Creates `TemplateReaction` objects with labeled atoms from template matching
3. `KineticsFamily.get_kinetics()` - Estimates rate using rate rules or training reactions
4. Returns `Arrhenius` or pressure-dependent kinetics model

## External Dependencies
- **RMG-database**: In CI, `RMG_DATABASE_BRANCH` controls which RMG-database branch is cloned. Locally, the database location is set via `settings['database.directory']` (default `../RMG-database/input`) or `database.directory` in an `rmgrc` file; you may also pass an explicit path to `database.load()`.
- **Julia/RMS**: Optional (recommended) reactor simulation backend (install via `./install_rms.sh`)
- Environment managed via `environment.yml` (conda/mamba)

## Documentation
Documentation lives in `documentation/source/` and is built with Sphinx (`make documentation`).

### User Documentation (`documentation/source/users/`)
- `users/rmg/` - RMG user guide (how to run, configure, interpret output)
- `users/arkane/` - Arkane user guide
- **Critical file**: `users/rmg/input.rst` - Documents all input file options. **Must be updated when changing input file syntax or adding new features.**

### API Reference (`documentation/source/reference/`)
- Auto-generated from docstrings using `sphinx.ext.autodoc`
- Each module has a corresponding `.rst` file (e.g., `documentation/source/reference/species/index.rst` → `rmgpy/species.py`)
- **Maintenance**: Add new modules to the appropriate `index.rst` toctree. Docstrings in code are automatically extracted.
- Uses reStructuredText format with `.. automodule::` directives

### When to Update Documentation
- **New input file options**: Update `documentation/source/users/rmg/input.rst`
- **New public API**: Ensure docstrings exist; add module to `documentation/source/reference/` if new
- **Changed behavior**: Update relevant user guide section
- **New features**: Add to `documentation/source/users/rmg/features.rst` or create and link to new `.rst` file

## Pull Request Review Guidance
### Review Priorities
- Verify changed behavior is covered by tests, or request targeted tests for uncovered paths.
- Check that user-facing changes include required documentation updates (especially input syntax in `documentation/source/users/rmg/input.rst`).
- Confirm Cython changes are complete (`.pyx`/`.pxd` parity, required setup wiring, and likely rebuild impact).
- Watch for performance regressions in hot paths (`rmgpy/molecule/`, `rmgpy/solver/`, kinetics generation loops).

### Other checks
- If `environment.yml` or `.conda/meta.yaml` change, verify they are consistent.
- For changes that affect data loading or estimators, verify assumptions against RMG-database integration points in `rmgpy/data/rmg.py` and related loaders.

## Style Guidelines
- Follow PEP 8 for new or modified code, but don't modify code just to fix style
- Docstrings describe purpose, not implementation
- Use `logging` module (not print statements)
- MIT license header required on all source files
Loading
Loading