Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Avoid Unnecessary Julia Operations + Optional RMS Installation #2631

Open
wants to merge 4 commits into
base: main
Choose a base branch
from

Conversation

JacksonBurns
Copy link
Contributor

Replaces part of #2539 which 1. fixed the conda recipe 2. added a subpackage 3. avoided unnecesary RMS operations and 4. grew totally un-reviewable. This PR contains only 3. - later PRs will implement 1. and 2.

Description of Changes

Two new internal-only boolean variables are added, NO_JULIA and requires_rms:

  • NO_JULIA is set based on whether or not the Julia dependencies (which are now optional) are installed. This resolves Arkane takes a long time to run due to loading Julia dependencies #2547 by allowing for a standalone installation of RMG or Arkane.
  • requires_rms is set if the user calling RMG actually has a reactor system that requires an RMS-based reactor. This avoids a lot of work (see which lines can now be skipped in this PR) when running RMG from the CLI inside the Docker container (or a source install with RMS).

I have also renamed the reactors file for clarity, to differentiate it from reactors.py which has the RMG-based pure-python reactors.

Impact of Changes

As of right now, the CI and Docker image still install Julia and RMS as they do now, so the version of RMG that we send out has all the features RMS offers.
This change is intended for:

  • generally speeding up RMG
  • allowing people to extend RMG more easily
  • allow fixing the conda recipe (see the referenced PR at the top that necessitated this change, or wait for the follow up PR)

TODO Before Merging

Update user-facing docs to provide details on how to do a julia-less installation and indicate which features require Julia.

I am opening and requesting review now so that we can hash out the finer points of the implementation, and then I can write up the docs for the users once that is settled.

@JacksonBurns JacksonBurns self-assigned this Mar 11, 2024
@JacksonBurns JacksonBurns force-pushed the fix/avoid_unnecessary_julia branch 3 times, most recently from 52ada46 to ab9468e Compare March 11, 2024 17:16
@JacksonBurns
Copy link
Contributor Author

JacksonBurns commented Mar 11, 2024

Also TODO: use pytest.mark to label tests with those that require Julia to allow for running pytest without the Julia stuff.

Also also TODO: after updating the documentation, add a link to the Julia-related installation steps in the exception that is thrown when attempting to call RMS without it installed. See #2631 (comment)

@mjohnson541
Copy link
Contributor

I'm all in favor of avoiding the julia start up cost for runs that don't need it. Which should solve issue #2547. Although, as I noted in that issue Arkane is dependent on pyjulia entirely independently of RMS.

However, RMS is not an optional install or anything you can treat as an optional backend. We have published RMG features that are not available without RMS, RMS is the only sensible way right now to add a new reactor to RMG, RMG electrochemistry is entirely dependent on RMS because none of the RMG reactors can run it.

Doing so does not save anyone time maintaining the installation because the installation with RMS has to work regardless. The initial install time for RMS is not particularly burdensome. It will even make debugging PRs more complicated because there will be more differences between users' local copies and the tests.

Copy link

Regression Testing Results

⚠️ One or more regression tests failed.
Please download the failed results and run the tests locally or check the log to see why.

Detailed regression test results.

Regression test aromatics:

Reference: Execution time (DD:HH:MM:SS): 00:00:01:07
Current: Execution time (DD:HH:MM:SS): 00:00:01:04
Reference: Memory used: 3046.07 MB
Current: Memory used: 3027.16 MB

aromatics Passed Core Comparison ✅

Original model has 15 species.
Test model has 15 species. ✅
Original model has 11 reactions.
Test model has 11 reactions. ✅

aromatics Passed Edge Comparison ✅

Original model has 106 species.
Test model has 106 species. ✅
Original model has 358 reactions.
Test model has 358 reactions. ✅

Observables Test Case: Aromatics Comparison

✅ All Observables varied by less than 0.500 on average between old model and new model in all conditions!

aromatics Passed Observable Testing ✅

Regression test liquid_oxidation:

Reference: Execution time (DD:HH:MM:SS): 00:00:02:19
Current: Execution time (DD:HH:MM:SS): 00:00:02:04
Reference: Memory used: 3158.95 MB
Current: Memory used: 3118.50 MB

liquid_oxidation Failed Core Comparison ❌

Original model has 37 species.
Test model has 37 species. ✅
Original model has 215 reactions.
Test model has 216 reactions. ❌
The tested model has 1 reactions that the original model does not have. ❌
rxn: CCO[O](31) <=> [OH](22) + CC=O(69) origin: intra_H_migration

liquid_oxidation Failed Edge Comparison ❌

Original model has 202 species.
Test model has 202 species. ✅
Original model has 1610 reactions.
Test model has 1610 reactions. ✅
The original model has 1 reactions that the tested model does not have. ❌
rxn: CCO[O](31) <=> C[CH]OO(70) origin: intra_H_migration
The tested model has 1 reactions that the original model does not have. ❌
rxn: CCO[O](31) <=> [OH](22) + CC=O(69) origin: intra_H_migration

Non-identical kinetics! ❌
original:
rxn: CCCCCO[O](103) + CC(CC(C)OO)O[O](104) <=> oxygen(1) + CCCCC[O](127) + CC([O])CC(C)OO(129) origin: Peroxyl_Disproportionation
tested:
rxn: CCCCCO[O](104) + CC(CC(C)OO)O[O](103) <=> oxygen(1) + CCCCC[O](128) + CC([O])CC(C)OO(127) origin: Peroxyl_Disproportionation

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): 7.79 7.46 7.21 7.00 6.67 6.41 5.94 5.60
k(T): 3.52 4.27 4.71 5.01 5.39 5.61 5.91 6.06

kinetics: Arrhenius(A=(3.18266e+20,'cm^3/(mol*s)'), n=-2.694, Ea=(0.053,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-5R-R_7R!H->C_N-7C-inRing Ea raised from 0.0 to 0.2 kJ/mol to match endothermicity of reaction.""")
kinetics: Arrhenius(A=(3.2e+12,'cm^3/(mol*s)'), n=0, Ea=(4.096,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-5R-R_7R!H->C_N-7C-inRing_Ext-5R-R""")
kinetics: Estimated from node Root_Ext-5R-R_7R!H->C_N-7C-inRing
Ea raised from 0.0 to 0.2 kJ/mol to match endothermicity of reaction.
kinetics: Estimated from node Root_Ext-5R-R_7R!H->C_N-7C-inRing_Ext-5R-R

Observables Test Case: liquid_oxidation Comparison

✅ All Observables varied by less than 0.100 on average between old model and new model in all conditions!

liquid_oxidation Passed Observable Testing ✅

Regression test nitrogen:

Reference: Execution time (DD:HH:MM:SS): 00:00:01:25
Current: Execution time (DD:HH:MM:SS): 00:00:01:13
Reference: Memory used: 3159.87 MB
Current: Memory used: 3116.13 MB

nitrogen Passed Core Comparison ✅

Original model has 41 species.
Test model has 41 species. ✅
Original model has 360 reactions.
Test model has 360 reactions. ✅

nitrogen Passed Edge Comparison ✅

Original model has 132 species.
Test model has 132 species. ✅
Original model has 997 reactions.
Test model has 997 reactions. ✅

Observables Test Case: NC Comparison

✅ All Observables varied by less than 0.200 on average between old model and new model in all conditions!

nitrogen Passed Observable Testing ✅

Regression test oxidation:

Reference: Execution time (DD:HH:MM:SS): 00:00:02:33
Current: Execution time (DD:HH:MM:SS): 00:00:01:49
Reference: Memory used: 3024.88 MB
Current: Memory used: 2983.54 MB

oxidation Passed Core Comparison ✅

Original model has 59 species.
Test model has 59 species. ✅
Original model has 694 reactions.
Test model has 694 reactions. ✅

oxidation Passed Edge Comparison ✅

Original model has 230 species.
Test model has 230 species. ✅
Original model has 1526 reactions.
Test model has 1526 reactions. ✅

Observables Test Case: Oxidation Comparison

✅ All Observables varied by less than 0.500 on average between old model and new model in all conditions!

oxidation Passed Observable Testing ✅

Regression test sulfur:

Reference: Execution time (DD:HH:MM:SS): 00:00:00:57
Current: Execution time (DD:HH:MM:SS): 00:00:00:50
Reference: Memory used: 3120.30 MB
Current: Memory used: 3120.82 MB

sulfur Passed Core Comparison ✅

Original model has 27 species.
Test model has 27 species. ✅
Original model has 74 reactions.
Test model has 74 reactions. ✅

sulfur Failed Edge Comparison ❌

Original model has 89 species.
Test model has 89 species. ✅
Original model has 227 reactions.
Test model has 227 reactions. ✅
The original model has 1 reactions that the tested model does not have. ❌
rxn: O(4) + SO2(15) (+N2) <=> SO3(16) (+N2) origin: primarySulfurLibrary
The tested model has 1 reactions that the original model does not have. ❌
rxn: O(4) + SO2(15) (+N2) <=> SO3(16) (+N2) origin: primarySulfurLibrary

Observables Test Case: SO2 Comparison

✅ All Observables varied by less than 0.100 on average between old model and new model in all conditions!

sulfur Passed Observable Testing ✅

Regression test superminimal:

Reference: Execution time (DD:HH:MM:SS): 00:00:00:36
Current: Execution time (DD:HH:MM:SS): 00:00:00:32
Reference: Memory used: 3230.77 MB
Current: Memory used: 3233.35 MB

superminimal Passed Core Comparison ✅

Original model has 13 species.
Test model has 13 species. ✅
Original model has 21 reactions.
Test model has 21 reactions. ✅

superminimal Passed Edge Comparison ✅

Original model has 18 species.
Test model has 18 species. ✅
Original model has 28 reactions.
Test model has 28 reactions. ✅

Regression test RMS_constantVIdealGasReactor_superminimal:

Reference: Execution time (DD:HH:MM:SS): 00:00:02:31
Current: Execution time (DD:HH:MM:SS): 00:00:02:27
Reference: Memory used: 3704.26 MB
Current: Memory used: 3710.76 MB

RMS_constantVIdealGasReactor_superminimal Passed Core Comparison ✅

Original model has 13 species.
Test model has 13 species. ✅
Original model has 19 reactions.
Test model has 19 reactions. ✅

RMS_constantVIdealGasReactor_superminimal Passed Edge Comparison ✅

Original model has 13 species.
Test model has 13 species. ✅
Original model has 19 reactions.
Test model has 19 reactions. ✅

Observables Test Case: RMS_constantVIdealGasReactor_superminimal Comparison

✅ All Observables varied by less than 0.100 on average between old model and new model in all conditions!

RMS_constantVIdealGasReactor_superminimal Passed Observable Testing ✅

Regression test RMS_CSTR_liquid_oxidation:

Reference: Execution time (DD:HH:MM:SS): 00:00:05:52
Current: Execution time (DD:HH:MM:SS): 00:00:06:08
Reference: Memory used: 3641.41 MB
Current: Memory used: 3659.30 MB

RMS_CSTR_liquid_oxidation Failed Core Comparison ❌

Original model has 35 species.
Test model has 37 species. ❌
Original model has 211 reactions.
Test model has 232 reactions. ❌
The tested model has 2 species that the original model does not have. ❌
spc: CCC(37)
spc: C[CH]OCCC(128)
The tested model has 21 reactions that the original model does not have. ❌
rxn: [CH2]CC(5) + pentane(2) <=> CCC(37) + CC[CH]CC(7) origin: H_Abstraction
rxn: [CH2]CC(5) + pentane(2) <=> CCC(37) + C[CH]CCC(11) origin: H_Abstraction
rxn: CCC(37) + [CH2]CCCC(12) <=> [CH2]CC(5) + pentane(2) origin: H_Abstraction
rxn: [CH2]CC(5) + CCCC(C)OO(59) <=> CCC(37) + CCCC(C)O[O](33) origin: H_Abstraction
rxn: [CH2]CC(5) + CCCC(C)OO(59) <=> CCC(37) + C[CH]CC(C)OO(48) origin: H_Abstraction
rxn: [CH2]CC(5) + C[CH]CCC(11) <=> CCC(37) + C=CCCC(25) origin: Disproportionation
rxn: [CH2]CC(5) + CCC(CC)OO(21) <=> CCC(37) + CCC(CC)O[O](18) origin: H_Abstraction
rxn: [CH2]CC(5) + CCCCCOO(90) <=> CCC(37) + CCCCCO[O](70) origin: H_Abstraction
rxn: [CH2]CC(5) + CCCOO(60) <=> CCCO[O](35) + CCC(37) origin: H_Abstraction
rxn: OO(20) + [CH2]CC(5) <=> [O]O(13) + CCC(37) origin: H_Abstraction
rxn: [OH](22) + CCC(37) <=> O(40) + [CH2]CC(5) origin: H_Abstraction
rxn: CC=O(100) + [CH2]CC(5) <=> C[CH]OCCC(128) origin: R_Addition_MultipleBond
rxn: [O]O(13) + [CH2]CC(5) <=> oxygen(1) + CCC(37) origin: H_Abstraction
rxn: [CH2]CC(5) + [CH2]CCCC(12) <=> CCC(37) + C=CCCC(25) origin: Disproportionation
rxn: [CH2]CC(5) + CCCC(C)OO(59) <=> CCC(37) + CC[CH]C(C)OO(46) origin: H_Abstraction
rxn: [CH2]CC(5) + CCC(CC)OO(21) <=> CCC(37) + C[CH]C(CC)OO(29) origin: H_Abstraction
rxn: [CH2]CC(5) + CC(CC(C)OO)OO(171) <=> CCC(37) + CC(CC(C)OO)O[O](148) origin: H_Abstraction
rxn: [CH2]CC(5) + CC[CH]CC(7) <=> CCC(37) + CC=CCC(16) origin: Disproportionation
rxn: [CH2]CC(5) + C[CH]CCC(11) <=> CCC(37) + CC=CCC(16) origin: Disproportionation
rxn: CCO[O](36) + C[CH]CCC(11) <=> CCOO(72) + CC=CCC(16) origin: Disproportionation
rxn: CCO[O](36) + CC[CH]CC(7) <=> CCOO(72) + CC=CCC(16) origin: Disproportionation

RMS_CSTR_liquid_oxidation Failed Edge Comparison ❌

Original model has 197 species.
Test model has 206 species. ❌
Original model has 1421 reactions.
Test model has 1508 reactions. ❌
The tested model has 9 species that the original model does not have. ❌
spc: C[CH]OCC(142)
spc: C=COCCC(143)
spc: [CH2]COCCC(144)
spc: CC[CH]OCC(145)
spc: C[CH]COCC(146)
spc: [CH2]CCOCC(147)
spc: CCCOCC(149)
spc: CC([O])O(150)
spc: C[CH]C(O)CC(202)
The original model has 11 reactions that the tested model does not have. ❌
rxn: CCCO[O](35) <=> CC[CH]OO(45) origin: intra_H_migration
rxn: CCCC(C)[O](61) + C[CH]C(CC)OO(31) <=> CC=C(CC)OO(109) + CCCC(C)O(128) origin: Disproportionation
rxn: CCCC(C)[O](61) + C[CH]C(CC)OO(31) <=> C=CC(CC)OO(110) + CCCC(C)O(128) origin: Disproportionation
rxn: CCCC(C)[O](61) + C[CH]C(CC)OO(31) <=> CCCC(C)=O(49) + CCC(CC)OO(21) origin: Disproportionation
rxn: CCCC(C)[O](61) + CC[CH]C(C)OO(50) <=> CCC=C(C)OO(115) + CCCC(C)O(128) origin: Disproportionation
rxn: CCCC(C)[O](61) + CC[CH]C(C)OO(50) <=> CC=CC(C)OO(116) + CCCC(C)O(128) origin: Disproportionation
rxn: CCCC(C)[O](61) + CC[CH]C(C)OO(50) <=> CCCC(C)=O(49) + CCCC(C)OO(58) origin: Disproportionation
rxn: CCCC(C)[O](61) + C[CH]CC(C)OO(52) <=> CC=CC(C)OO(116) + CCCC(C)O(128) origin: Disproportionation
rxn: CCCC(C)[O](61) + C[CH]CC(C)OO(52) <=> C=CCC(C)OO(122) + CCCC(C)O(128) origin: Disproportionation
rxn: CCCC(C)[O](61) + C[CH]CC(C)OO(52) <=> CCCC(C)=O(49) + CCCC(C)OO(58) origin: Disproportionation
rxn: [CH2]CC(5) + CC(CC(C)OO)O[O](127) <=> C=CC(26) + CC(CC(C)OO)OO(131) origin: Disproportionation
The tested model has 98 reactions that the original model does not have. ❌
rxn: [CH2]CC(5) + [CH2]CCCC(12) <=> CCC(37) + C=CCCC(25) origin: Disproportionation
rxn: CCO[O](36) + C[CH]CCC(11) <=> CCOO(72) + CC=CCC(16) origin: Disproportionation
rxn: CCO[O](36) + CC[CH]CC(7) <=> CCOO(72) + CC=CCC(16) origin: Disproportionation
rxn: CCCO[O](35) <=> [OH](22) + CCC=O(50) origin: intra_H_migration
rxn: [CH2](3) + CC(38) <=> CCC(37) origin: 1,2_Insertion_carbene
rxn: [CH2](3) + CC(38) <=> CCC(37) origin: 1,2_Insertion_carbene
rxn: [CH3](10) + C[CH2](6) <=> CCC(37) origin: R_Recombination
rxn: [H](8) + C[CH]C(32) <=> CCC(37) origin: R_Recombination
rxn: [H](8) + [CH2]CC(5) <=> CCC(37) origin: R_Recombination
rxn: [CH2](3) + C[CH]OCC(142) <=> C[CH]OCCC(128) origin: 1,2_Insertion_carbene
rxn: [CH2](3) + C[CH]OCC(142) <=> C[CH]OCCC(128) origin: 1,2_Insertion_carbene
rxn: [H](8) + C=COCCC(143) <=> C[CH]OCCC(128) origin: R_Addition_MultipleBond
rxn: [CH2]COCCC(144) <=> C[CH]OCCC(128) origin: intra_H_migration
rxn: CC[CH]OCC(145) <=> C[CH]OCCC(128) origin: intra_H_migration
rxn: C[CH]COCC(146) <=> C[CH]OCCC(128) origin: intra_H_migration
rxn: [CH2]CCOCC(147) <=> C[CH]OCCC(128) origin: intra_H_migration
rxn: oxygen(1) + CCC(37) <=> [O]O(13) + C[CH]C(32) origin: H_Abstraction
rxn: CC[CH]CC(7) + CCCOCC(149) <=> C[CH]OCCC(128) + pentane(2) origin: H_Abstraction
rxn: C[CH]CCC(11) + CCCOCC(149) <=> C[CH]OCCC(128) + pentane(2) origin: H_Abstraction
rxn: [CH2]CCCC(12) + CCCOCC(149) <=> C[CH]OCCC(128) + pentane(2) origin: H_Abstraction
rxn: C[CH]C(32) + pentane(2) <=> CCC(37) + CC[CH]CC(7) origin: H_Abstraction
rxn: C[CH]C(32) + pentane(2) <=> CCC(37) + C[CH]CCC(11) origin: H_Abstraction
rxn: [O]O(13) + CCC(37) <=> OO(20) + C[CH]C(32) origin: H_Abstraction
rxn: C[CH]C(32) + CCC(CC)OO(21) <=> CCC(37) + CCC(CC)O[O](18) origin: H_Abstraction
rxn: [CH2]CC(5) + CCC(37) <=> C[CH]C(32) + CCC(37) origin: H_Abstraction
rxn: C[CH]C(32) + CCCC(C)OO(59) <=> CCC(37) + CCCC(C)O[O](33) origin: H_Abstraction
rxn: C[CH]C(32) + CCCOO(60) <=> CCCO[O](35) + CCC(37) origin: H_Abstraction
rxn: CCC(37) + [CH2]CCCC(12) <=> C[CH]C(32) + pentane(2) origin: H_Abstraction
rxn: C[CH]C(32) + CCCCCOO(90) <=> CCC(37) + CCCCCO[O](70) origin: H_Abstraction
rxn: [OH](22) + CC=O(100) <=> O(40) + C=C[O](121) origin: H_Abstraction
rxn: [OH](22) + CC=O(100) <=> O(40) + C[C]=O(122) origin: H_Abstraction
rxn: [OH](22) + CC=O(100) <=> C[CH]OO(63) origin: R_Addition_MultipleBond
rxn: [OH](22) + CC=O(100) <=> CC([O])O(150) origin: R_Addition_MultipleBond
rxn: [OH](22) + CCC(37) <=> O(40) + C[CH]C(32) origin: H_Abstraction
rxn: C[CH]C(32) + [CH2]CCCC(12) <=> CCC(37) + C=CCCC(25) origin: Disproportionation
rxn: C[CH]C(32) + C[CH]CCC(11) <=> CCC(37) + C=CCCC(25) origin: Disproportionation
rxn: C[CH]O(123) + CCO[O](36) <=> CC=O(100) + CCOO(72) origin: Disproportionation
rxn: CC[O](92) + CCO[O](36) <=> CC=O(100) + CCOO(72) origin: Disproportionation
rxn: C[CH]O(123) + C[CH]OO(63) <=> CC=O(100) + CCOO(72) origin: Disproportionation
rxn: CC[O](92) + C[CH]OO(63) <=> CC=O(100) + CCOO(72) origin: Disproportionation
rxn: C[CH]O(123) + [CH2]COO(69) <=> CC=O(100) + CCOO(72) origin: Disproportionation
rxn: CC[O](92) + [CH2]COO(69) <=> CC=O(100) + CCOO(72) origin: Disproportionation
rxn: CC=O(100) + CCCC(C)[O](62) <=> C=C[O](121) + CCCC(C)O(108) origin: H_Abstraction
rxn: CC=O(100) + CCCC(C)[O](62) <=> C[C]=O(122) + CCCC(C)O(108) origin: H_Abstraction
rxn: C[CH]C(32) + CCCC(C)O(108) <=> CCC(37) + CCCC(C)[O](62) origin: H_Abstraction
rxn: CCC(37) + CCCC(C)[O](62) <=> [CH2]CC(5) + CCCC(C)O(108) origin: H_Abstraction
rxn: C[CH]O(123) + C[CH]C(32) <=> CC=O(100) + CCC(37) origin: Disproportionation
rxn: C[CH]O(123) + [CH2]CC(5) <=> CC=O(100) + CCC(37) origin: Disproportionation
rxn: CC[O](92) + C[CH]C(32) <=> CC=O(100) + CCC(37) origin: Disproportionation
rxn: CC[O](92) + [CH2]CC(5) <=> CC=O(100) + CCC(37) origin: Disproportionation
rxn: C[CH]C(32) + CCCC(C)OO(59) <=> CCC(37) + C[CH]CC(C)OO(48) origin: H_Abstraction
rxn: C[CH]CC(C)OO(48) + CC(CC(C)OO)O[O](148) <=> CC=CC(C)OO(139) + CC(CC(C)OO)OO(171) origin: Disproportionation
rxn: C[CH]CC(C)OO(48) + CC(CC(C)OO)O[O](148) <=> C=CCC(C)OO(140) + CC(CC(C)OO)OO(171) origin: Disproportionation
rxn: CCC(37) + CC[CH]C(C)OO(46) <=> C[CH]C(32) + CCCC(C)OO(59) origin: H_Abstraction
rxn: C[CH]C(32) + CC(CC(C)OO)OO(171) <=> CCC(37) + CC(CC(C)OO)O[O](148) origin: H_Abstraction
rxn: CCC(37) + C[CH]C(CC)OO(29) <=> C[CH]C(32) + CCC(CC)OO(21) origin: H_Abstraction
rxn: CCC(CC)OOO(115) + CC(CC(C)OO)OO(171) <=> O(40) + CCC(CC)O[O](18) + CC(CC(C)OO)O[O](148) origin: Bimolec_Hydroperoxide_Decomposition
rxn: CCCC(C)OOO(110) + CC(CC(C)OO)OO(171) <=> O(40) + CCCC(C)O[O](33) + CC(CC(C)OO)O[O](148) origin: Bimolec_Hydroperoxide_Decomposition
rxn: CCCCCOOO(116) + CC(CC(C)OO)OO(171) <=> O(40) + CCCCCO[O](70) + CC(CC(C)OO)O[O](148) origin: Bimolec_Hydroperoxide_Decomposition
rxn: CCCO[O](35) + CC(CC(C)OO)O[O](148) <=> oxygen(1) + CCC[O](97) + CC([O])CC(C)OO(172) origin: Peroxyl_Disproportionation
rxn: CCCO[O](35) + CC(CC(C)OO)O[O](148) <=> oxygen(1) + CCC=O(50) + CC(O)CC(C)OO(173) origin: Peroxyl_Termination
rxn: CCCO[O](35) + CC(CC(C)OO)O[O](148) <=> oxygen(1) + CCCO(127) + CC(=O)CC(C)OO(162) origin: Peroxyl_Termination
rxn: [OH](22) + CCC1OC1C(154) <=> O(40) + CC[C]1OC1C(179) origin: H_Abstraction
rxn: [OH](22) + CCC1OC1C(154) <=> O(40) + CCC1O[C]1C(181) origin: H_Abstraction
rxn: [OH](22) + CCC1OC1C(154) <=> O(40) + C[CH]C1OC1C(183) origin: H_Abstraction
rxn: [OH](22) + CCC1OC1C(154) <=> O(40) + [CH2]C1OC1CC(184) origin: H_Abstraction
rxn: [OH](22) + CCC1OC1C(154) <=> O(40) + [CH2]CC1OC1C(185) origin: H_Abstraction
rxn: [OH](22) + CC(CC(C)OO)OO(171) <=> O(40) + C[C](CC(C)OO)OO(188) origin: H_Abstraction
rxn: [OH](22) + CC(CC(C)OO)OO(171) <=> O(40) + CC([CH]C(C)OO)OO(163) origin: H_Abstraction
rxn: [OH](22) + CC(CC(C)OO)OO(171) <=> O(40) + [CH2]C(CC(C)OO)OO(164) origin: H_Abstraction
rxn: [OH](22) + CC=CCC(16) <=> O(40) + C[CH]C=CC(193) origin: H_Abstraction
rxn: [OH](22) + CC=CCC(16) <=> O(40) + [CH2]CC=CC(194) origin: H_Abstraction
rxn: [OH](22) + CC=CCC(16) <=> O(40) + [CH2]C=CCC(83) origin: H_Abstraction
rxn: [OH](22) + CC=CCC(16) <=> O(40) + CC=[C]CC(196) origin: H_Abstraction
rxn: [OH](22) + CC=CCC(16) <=> O(40) + C[C]=CCC(197) origin: H_Abstraction
rxn: [OH](22) + CC=CCC(16) <=> C[CH]C(O)CC(202) origin: R_Addition_MultipleBond
rxn: [OH](22) + CC=CCC(16) <=> CC[CH]C(C)O(103) origin: R_Addition_MultipleBond
rxn: C[CH]OO(63) + C[CH]CCC(11) <=> CCOO(72) + CC=CCC(16) origin: Disproportionation
rxn: C[CH]OO(63) + CC[CH]CC(7) <=> CCOO(72) + CC=CCC(16) origin: Disproportionation
rxn: [CH2]COO(69) + C[CH]CCC(11) <=> CCOO(72) + CC=CCC(16) origin: Disproportionation
rxn: [CH2]COO(69) + CC[CH]CC(7) <=> CCOO(72) + CC=CCC(16) origin: Disproportionation
rxn: CCC1OC1C(154) + CCCC(C)[O](62) <=> CC[C]1OC1C(179) + CCCC(C)O(108) origin: H_Abstraction
rxn: CCC1OC1C(154) + CCCC(C)[O](62) <=> CCC1O[C]1C(181) + CCCC(C)O(108) origin: H_Abstraction
rxn: CCC1OC1C(154) + CCCC(C)[O](62) <=> C[CH]C1OC1C(183) + CCCC(C)O(108) origin: H_Abstraction
rxn: CCC1OC1C(154) + CCCC(C)[O](62) <=> [CH2]C1OC1CC(184) + CCCC(C)O(108) origin: H_Abstraction
rxn: CCC1OC1C(154) + CCCC(C)[O](62) <=> [CH2]CC1OC1C(185) + CCCC(C)O(108) origin: H_Abstraction
rxn: CCCC(C)[O](62) + CC(CC(C)OO)OO(171) <=> CC(CC(C)OO)O[O](148) + CCCC(C)O(108) origin: H_Abstraction
rxn: CCCC(C)[O](62) + CC(CC(C)OO)OO(171) <=> C[C](CC(C)OO)OO(188) + CCCC(C)O(108) origin: H_Abstraction
rxn: CCCC(C)[O](62) + CC(CC(C)OO)OO(171) <=> CC([CH]C(C)OO)OO(163) + CCCC(C)O(108) origin: H_Abstraction
rxn: CCCC(C)[O](62) + CC(CC(C)OO)OO(171) <=> [CH2]C(CC(C)OO)OO(164) + CCCC(C)O(108) origin: H_Abstraction
rxn: CC=CCC(16) + CCCC(C)[O](62) <=> C[CH]C=CC(193) + CCCC(C)O(108) origin: H_Abstraction
rxn: CC=CCC(16) + CCCC(C)[O](62) <=> [CH2]CC=CC(194) + CCCC(C)O(108) origin: H_Abstraction
rxn: CC=CCC(16) + CCCC(C)[O](62) <=> [CH2]C=CCC(83) + CCCC(C)O(108) origin: H_Abstraction
rxn: CC=[C]CC(196) + CCCC(C)O(108) <=> CC=CCC(16) + CCCC(C)[O](62) origin: H_Abstraction
rxn: C[C]=CCC(197) + CCCC(C)O(108) <=> CC=CCC(16) + CCCC(C)[O](62) origin: H_Abstraction
rxn: C[CH]C(32) + C[CH]CCC(11) <=> CCC(37) + CC=CCC(16) origin: Disproportionation
rxn: C[CH]C(32) + CC[CH]CC(7) <=> CCC(37) + CC=CCC(16) origin: Disproportionation
rxn: OOO(114) + CC(CC(C)OO)OO(171) <=> [O]O(13) + O(40) + CC(CC(C)OO)O[O](148) origin: Bimolec_Hydroperoxide_Decomposition

Observables Test Case: RMS_CSTR_liquid_oxidation Comparison

✅ All Observables varied by less than 0.100 on average between old model and new model in all conditions!

RMS_CSTR_liquid_oxidation Passed Observable Testing ✅

Regression test fragment:

Reference: Execution time (DD:HH:MM:SS): 00:00:00:42
Current: Execution time (DD:HH:MM:SS): 00:00:00:38
Reference: Memory used: 2959.95 MB
Current: Memory used: 2943.83 MB

fragment Passed Core Comparison ✅

Original model has 10 species.
Test model has 10 species. ✅
Original model has 2 reactions.
Test model has 2 reactions. ✅

fragment Passed Edge Comparison ✅

Original model has 33 species.
Test model has 33 species. ✅
Original model has 47 reactions.
Test model has 47 reactions. ✅

Observables Test Case: fragment Comparison

✅ All Observables varied by less than 0.100 on average between old model and new model in all conditions!

fragment Passed Observable Testing ✅

Regression test RMS_constantVIdealGasReactor_fragment:

Reference: Execution time (DD:HH:MM:SS): 00:00:03:09
Current: Execution time (DD:HH:MM:SS): 00:00:03:08
Reference: Memory used: 3841.29 MB
Current: Memory used: 3846.80 MB

RMS_constantVIdealGasReactor_fragment Passed Core Comparison ✅

Original model has 10 species.
Test model has 10 species. ✅
Original model has 2 reactions.
Test model has 2 reactions. ✅

RMS_constantVIdealGasReactor_fragment Passed Edge Comparison ✅

Original model has 27 species.
Test model has 27 species. ✅
Original model has 24 reactions.
Test model has 24 reactions. ✅

Observables Test Case: RMS_constantVIdealGasReactor_fragment Comparison

✅ All Observables varied by less than 0.100 on average between old model and new model in all conditions!

RMS_constantVIdealGasReactor_fragment Passed Observable Testing ✅

beep boop this comment was written by a bot 🤖

Copy link

codecov bot commented Mar 11, 2024

Codecov Report

Attention: Patch coverage is 75.72816% with 25 lines in your changes are missing coverage. Please review.

Project coverage is 54.26%. Comparing base (eed950a) to head (24284bc).

Files Patch % Lines
rmgpy/rmg/model.py 73.33% 16 Missing ⚠️
rmgpy/rmg/main.py 84.61% 4 Missing ⚠️
rmgpy/rmg/reactionmechanismsimulator_reactors.py 75.00% 3 Missing ⚠️
rmgpy/rmg/input.py 33.33% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2631      +/-   ##
==========================================
- Coverage   54.90%   54.26%   -0.65%     
==========================================
  Files         125      125              
  Lines       37050    37061      +11     
==========================================
- Hits        20342    20110     -232     
- Misses      16708    16951     +243     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Copy link
Contributor

@hwpang hwpang left a comment

Choose a reason for hiding this comment

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

Thanks for the PR! I have some questions and some comments

@@ -44,8 +40,7 @@ RUN git clone --single-branch --branch main --depth 1 https://github.com/Reactio

WORKDIR /rmg/RMG-Py
# build the conda environment
RUN conda env create --file environment.yml && \
conda clean --all --yes
Copy link
Contributor

Choose a reason for hiding this comment

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

What is the function of this line conda clean --all --yes?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

This was added here in #2437 to reduce the size of the finished docker image. As per the conda docs it just removes some junk files we don't need.

@@ -1558,6 +1559,8 @@ def read_input_file(path, rmg0):
exec(f.read(), global_context, local_context)
except (NameError, TypeError, SyntaxError) as e:
logging.error('The input file "{0}" was invalid:'.format(full_path))
if NO_JULIA:
logging.error("During runtime, import of Julia dependencies failed. To use phase systems and RMS reactors, install RMG-Py with RMS.")
Copy link
Contributor

Choose a reason for hiding this comment

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

I think we should add a link to the documentation page regarding how to install Julia dependencies

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Good call! I will add this to my TODO comment

- rmg::symmetry

# packages we would like to stop maintaining (and why)
- rmg::diffeqpy
Copy link
Contributor

Choose a reason for hiding this comment

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

I just learn that diffeqpy is used for PDep calculations here:

from diffeqpy import de
and we should add an informative error catch

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Thanks for pointing this out! It's good that there are other methods already implemented as well, and informative error catch will go nicely here. A note for when this is added: we should probably only code the 'hey your julia stuff is missing' error string in one place and then import it elsewhere.

@JacksonBurns
Copy link
Contributor Author

I'm all in favor of avoiding the julia start up cost for runs that don't need it. Which should solve issue #2547. Although, as I noted in that issue Arkane is dependent on pyjulia entirely independently of RMS.

Thanks for pointing that out! I have added a comment on that issue.

However, RMS is not an optional install or anything you can treat as an optional backend. We have published RMG features that are not available without RMS, RMS is the only sensible way right now to add a new reactor to RMG, RMG electrochemistry is entirely dependent on RMS because none of the RMG reactors can run it.

I see this as less about removing features and more about increasingly the 'extend-ability' of RMG.
The RMS features are great, yet some of our users only want to run basic reactors and 'plug in' RMG to other tools, which is difficult in the current state.

Our primary distribution method (Docker) will still include all of the RMS stuff, so by default everyone will still have access to every feature we have ever promised.
The CI, too, will continue to install the RMS features and ensure forward-compatibility with the inter-operation of the two packages.

I'll also add that this is somewhat being forced as a technical issue, or at least an issue with my technical understanding.
I only alluded to this in my initial comment ("allow fixing the conda recipe") but I'll be more explicit here.
In the process of attempting to fix the conda recipe, I did not find a way to build a new RMG binary with the RMS installation included. When attempting to build RMS within the conda recipe I couldn't get the build to 'find' RMG (so it went out to install the old binary), couldn't get the build to run (would fail for difficult-to-discern reasons), and overall the Julia language seems to only just be adopting conda as a binary distribution method (with 'new' packages like Conda.jl) picking up steam).

There may very well be a way to get the binary creation to work, but it will certainly be more difficult than the workflow that this change would allow:
We Build Standalone RMG Binary -> Users Install Standalone RMG Binary -> Users Add RMS on Top of It Locally

We have also historically 'promised' binaries, and I see this as the only way to provide those.

Doing so does not save anyone time maintaining the installation because the installation with RMS has to work regardless. The initial install time for RMS is not particularly burdensome. It will even make debugging PRs more complicated because there will be more differences between users' local copies and the tests.

Partly replied to this above - CI will continue to install RMS so it will continue to work in the future.

Second point is a very real challenge, I agree. I can readily imagine circumstances where a user might suggest changes to RMG that pass RMG-only tests locally and then fail RMG+RMS CI on GitHub. This might ultimately be resolved with good practices (i.e. requiring people to run RMG+RMS for development) but I am open to input from the dev team on this.

@mjohnson541
Copy link
Contributor

I'm all in favor of avoiding the julia start up cost for runs that don't need it. Which should solve issue #2547. Although, as
However, RMS is not an optional install or anything you can treat as an optional backend. We have published RMG features that are not available without RMS, RMS is the only sensible way right now to add a new reactor to RMG, RMG electrochemistry is entirely dependent on RMS because none of the RMG reactors can run it.

I see this as less about removing features and more about increasingly the 'extend-ability' of RMG. The RMS features are great, yet some of our users only want to run basic reactors and 'plug in' RMG to other tools, which is difficult in the current state.

Once the julia imports are avoided running RMG without using julia features will not have a meaningful distinction between running RMG without RMS installed. So aside from installation, there won't be a meaningful distinction in difficulty for users.

Our primary distribution method (Docker) will still include all of the RMS stuff, so by default everyone will still have access to every feature we have ever promised. The CI, too, will continue to install the RMS features and ensure forward-compatibility with the inter-operation of the two packages.

I'll also add that this is somewhat being forced as a technical issue, or at least an issue with my technical understanding. I only alluded to this in my initial comment ("allow fixing the conda recipe") but I'll be more explicit here. In the process of attempting to fix the conda recipe, I did not find a way to build a new RMG binary with the RMS installation included. When attempting to build RMS within the conda recipe I couldn't get the build to 'find' RMG (so it went out to install the old binary), couldn't get the build to run (would fail for difficult-to-discern reasons), and overall the Julia language seems to only just be adopting conda as a binary distribution method (with 'new' packages like Conda.jl) picking up steam).

I haven't seen the build script you devised, but this at least sounds resolvable to me. It sounds like RMS is being imported before julia is linked to the correct python (which will cause it to start installing things). Julia-python linking is most easily done inside the python you want to link to by calling julia.install() that should automatically identify julia and link it to the python you are in. I would think that should be done in pyjulia's build script, but for the RMG binary it can be done inside RMG's build script. The point of conda is to be universally applicable so we shouldn't be hindered by choice of language.

@mjohnson541
Copy link
Contributor

mjohnson541 commented Mar 13, 2024

Oh wait, sorry...the issue isn't that...the issue is that the python that you're building with in conda is not the python in use when you run the binary. The linking needs done for the run python. Should just be the linking, the package installs and everything should be fine.

@JacksonBurns
Copy link
Contributor Author

I see this as less about removing features and more about increasingly the 'extend-ability' of RMG. The RMS features are great, yet some of our users only want to run basic reactors and 'plug in' RMG to other tools, which is difficult in the current state.

Once the julia imports are avoided running RMG without using julia features will not have a meaningful distinction between running RMG without RMS installed. So aside from installation, there won't be a meaningful distinction in difficulty for users.

My apologies, I'm not sure I understand what you mean, could you restate this another way?

Our primary distribution method (Docker) will still include all of the RMS stuff, so by default everyone will still have access to every feature we have ever promised. The CI, too, will continue to install the RMS features and ensure forward-compatibility with the inter-operation of the two packages.
I'll also add that this is somewhat being forced as a technical issue, or at least an issue with my technical understanding. I only alluded to this in my initial comment ("allow fixing the conda recipe") but I'll be more explicit here. In the process of attempting to fix the conda recipe, I did not find a way to build a new RMG binary with the RMS installation included. When attempting to build RMS within the conda recipe I couldn't get the build to 'find' RMG (so it went out to install the old binary), couldn't get the build to run (would fail for difficult-to-discern reasons), and overall the Julia language seems to only just be adopting conda as a binary distribution method (with 'new' packages like Conda.jl) picking up steam).

I haven't seen the build script you devised, but this at least sounds resolvable to me. It sounds like RMS is being imported before julia is linked to the correct python (which will cause it to start installing things). Julia-python linking is most easily done inside the python you want to link to by calling julia.install() that should automatically identify julia and link it to the python you are in. I would think that should be done in pyjulia's build script, but for the RMG binary it can be done inside RMG's build script. The point of conda is to be universally applicable so we shouldn't be hindered by choice of language.

The build.sh looked like this:

make install
export PYTHON=$PREFIX/bin/python
export PYTHONPATH=$SRC_DIR:$PYTHONPATH
python -c "import julia; julia.install(); import diffeqpy; diffeqpy.install()"
julia -e 'using Pkg; Pkg.add(PackageSpec(name="Functors",version="0.4.3")); Pkg.pin("Functors"); Pkg.add(PackageSpec(name="ReactionMechanismSimulator",rev="for_rmg")); using ReactionMechanismSimulator'

the conda_build_config.yaml looked like this:

python:
  - 3.7
numpy:
  - 1.15

and the meta.yaml is here:

recipe
# For conda build
package:
  name: rmg
  version: 3.2.0

source:
  path: ../

build:
  number: {{ environ.get('GIT_DESCRIBE_NUMBER', 0) }}

requirements:
  build:
    - {{ compiler('c') }}
  host:
    - cairo
    - cairocffi
    - ffmpeg
    - xlrd
    - xlwt
    - h5py
    - graphviz
    - markupsafe
    - psutil
    - ncurses
    - suitesparse

  # external software tools for chemistry
    - coolprop
    - cantera=2.6
    - mopac
    - cclib >=1.6.3,!=1.8.0
    - openbabel >=3

  # Python tools
    - python >=3.7
    - coverage
    - cython >=0.25.2
    - scikit-learn
    - scipy
    - numpy >=1.10.0
    - pydot
    - jinja2
    - jupyter
    - pymongo
    - pyparsing
    - pyyaml
    - networkx
    - matplotlib >=1.5
    - mpmath
    - pandas

  # packages we maintain
    - rmgdatabase
    - gprof2dot
    - lpsolve55
    - muq2
    - numdifftools
    - pydas >=1.0.3
    - pydqed >=1.0.3
    - pyrdl
    - quantities
    - symmetry
    - chemprop==0.0.1
    - rdkit >=2020.03.3.0
  run:
    - cairo
    - cairocffi
    - ffmpeg
    - xlrd
    - xlwt
    - h5py
    - graphviz
    - markupsafe
    - psutil
    - ncurses
    - suitesparse

  # external software tools for chemistry
    - coolprop
    - cantera=2.6
    - mopac
    - cclib >=1.6.3,!=1.8.0
    - openbabel >=3

  # Python tools
    - python >=3.7
    - coverage
    - cython >=0.25.2
    - scikit-learn
    - scipy
    - numpy >=1.10.0
    - pydot
    - jinja2
    - jupyter
    - pymongo
    - pyparsing
    - pyyaml
    - networkx
    - matplotlib >=1.5
    - mpmath
    - pandas

  # packages we maintain
    - rmgdatabase
    - gprof2dot
    - lpsolve55
    - muq2
    - numdifftools
    - pydas >=1.0.3
    - pydqed >=1.0.3
    - pyrdl
    - quantities
    - symmetry
    - chemprop==0.0.1
    - rdkit >=2020.03.3.0
test:
  requires:
    - cairo
    - cairocffi
    - ffmpeg
    - xlrd
    - xlwt
    - h5py
    - graphviz
    - markupsafe
    - psutil
    - ncurses
    - suitesparse

  # external software tools for chemistry
    - coolprop
    - cantera=2.6
    - mopac
    - cclib >=1.6.3,!=1.8.0
    - openbabel >=3

  # Python tools
    - python >=3.7
    - coverage
    - cython >=0.25.2
    - scikit-learn
    - scipy
    - numpy >=1.10.0
    - pydot
    - jinja2
    - jupyter
    - pymongo
    - pyparsing
    - pyyaml
    - networkx
    - matplotlib >=1.5
    - mpmath
    - pandas

  # packages we maintain
    - rmgdatabase
    - gprof2dot
    - lpsolve55
    - muq2
    - numdifftools
    - pydas >=1.0.3
    - pydqed >=1.0.3
    - pyrdl
    - quantities
    - symmetry
    - chemprop==0.0.1
    - rdkit >=2020.03.3.0
  source_files:
    - 'examples/rmg/superminimal'
    - 'examples/arkane/networks/n-butanol'
  imports:
    - rmgpy
    - arkane
  commands:
    - rmg.py examples/rmg/superminimal/input.py
    - Arkane.py examples/arkane/networks/n-butanol/input.py

about:
  home: https://github.com/ReactionMechanismGenerator/RMG-Py
  license: MIT
  summary: "A program for automatically generating kinetic models of chemical reaction mechanisms."

though this last component would be a little bit simpler now that some of the deps have been removed.

I agree that this should be resolvable, but I'm also anxious about the maintainability of the results. Seems like it would be house of cards waiting to crash down, whereas a system that built an RMG binary independently and then added RMS on top of it would allow for greater flexibility in the two steps.

@mjohnson541
Copy link
Contributor

Sorry, I felt like the reply stuff was getting too nested.

On that point, I guess I don't understand why making RMS an optional install makes future development and plug-ability any easier given that after installation the user experience is the same for a user not using those features.

Super interested about why you needed that Functors line in the build.

Overall on the issues with the build my understanding is that if RMG starts using an RMS feature, RMS tries to install stuff?
My interpretation of this is

  1. Python/pyjulia knows where Julia is
  2. The Julia python finds has RMS installed
  3. Julia/PyCall finds the wrong python and can't find the rmg stuff so tries to install it (probably using the default python)

So it seems that our problem is simply that while everything we need is installed PyCall doesn't know where the right python/conda env is. This can be set by defining environment variables: PYTHON and maybe also CONDA_JL_HOME (see https://github.com/JuliaPy/PyCall.jl and https://github.com/JuliaPy/Conda.jl). In the build we can set environmental variables that will automatically load when the environment loads so in theory if we do this for PYTHON and CONDA_JL_HOME RMS will grab the appropriate python and find that the packages it needs are already there. An example of doing this from the build file I wrote for julia binaries is below:

#make julia directory
mkdir -p ${PREFIX}/share/julia/site
mkdir -p ${PREFIX}/bin
#set JULIA_DEPOT_PATH in conda env
export JULIA_DEPOT_PATH="${PREFIX}/share/julia/site"
ACTIVATE_ENV="${PREFIX}/etc/conda/activate.d/env_vars.sh"
DEACTIVATE_ENV="${PREFIX}/etc/conda/deactivate.d/env_vars.sh"

if [ -f "$ACTIVATE_ENV" ]; then
        echo "export JULIA_DEPOT_PATH=\"${PREFIX}/share/julia/site\"" >> $ACTIVATE_ENV
        echo "export JULIA_OLD_LD_LIBRARY_PATH=$LD_LIBRARY_PATH" >> $ACTIVATE_ENV
        echo "export LD_LIBRARY_PATH=\"${PREFIX}/lib\"" >> $ACTIVATE_ENV
else
        mkdir -p ${PREFIX}/etc/conda/activate.d
        touch ${PREFIX}/etc/conda/activate.d/env_vars.sh
        echo '#!/bin/sh' >> $ACTIVATE_ENV
        echo "export JULIA_DEPOT_PATH=\"${PREFIX}/share/julia/site\"" >> $ACTIVATE_ENV
        echo "export JULIA_OLD_LD_LIBRARY_PATH=$LD_LIBRARY_PATH" >> $ACTIVATE_ENV
        echo "export LD_LIBRARY_PATH=\"${PREFIX}/lib\"" >> $ACTIVATE_ENV
fi
if [ -f "$DEACTIVATE_ENV" ]; then
        echo "unset JULIA_DEPOT_PATH" >> $DEACTIVATE_ENV
        echo "export LD_LIBRARY_PATH=$JULIA_OLD_LD_LIBRARY_PATH" >> $DEACTIVATE_ENV
        echo "unset JULIA_OLD_LD_LIBRARY_PATH" >> $DEACTIVATE_ENV
else
        mkdir -p ${PREFIX}/etc/conda/deactivate.d
        touch ${PREFIX}/etc/conda/deactivate.d/env_vars.sh
        echo '#!/bin/sh' >> $DEACTIVATE_ENV
        echo "unset JULIA_DEPOT_PATH" >> $DEACTIVATE_ENV
        echo "export LD_LIBRARY_PATH=$JULIA_OLD_LD_LIBRARY_PATH" >> $DEACTIVATE_ENV
        echo "unset JULIA_OLD_LD_LIBRARY_PATH" >> $DEACTIVATE_ENV
fi

@JacksonBurns
Copy link
Contributor Author

At a high level I'm still skeptical that this is possible - the whole point of Conda.jl seems to be building Julia packages that require Python rather than Python Packages that require Julia. I can give this script a shot, but I must emphasize that this is a maintainability concern. As soon as Conda.jl changes anything we are going to be stuck unable to build RMG binaries again despite nothing being wrong with the Python side.

There's also just such a natural separation between mechanism generator in Python + reactor simulator in Julia that it seems (to me) unnecessary to try and combine the two. This would decouple our release schedule, allow people to extend RMG without also installing RMS, etc.

To me this is also just occam's razor. Why do this (comparatively) complex installation when we could so easily separate the two?

I don't recall the exact reason the Functors thing was there, I think something was wrong with that upstream on whatever day I wrote that build script.

@mjohnson541
Copy link
Contributor

I'm happy to explain how the python-julia system works, why what I proposed is a robust solution to your particular problem as described (which honestly is rare to find with conda-build problems), what role PyCall.jl and Conda.jl play in the system and why there aren't any concerns about maintainability related to them in particular.

I know this part is new for the binaries and you guys aren't as experienced with these systems as I am. I'm surprised you didn't bring this up with me earlier in the process when you ran into this issue. I would hope that I could have helped you avoid the frustrations it seems you've clearly run into. I'm well aware building binaries is not a fun process especially when dealing with systems you aren't intimately familiar with.

However, I think it would be best to have such a conversation offline.

@mjohnson541
Copy link
Contributor

mjohnson541 commented Mar 15, 2024

Sorry, I felt like the reply stuff was getting too nested.

On that point, I guess I don't understand why making RMS an optional install makes future development and plug-ability any easier given that after installation the user experience is the same for a user not using those features.

Super interested about why you needed that Functors line in the build.

Overall on the issues with the build my understanding is that if RMG starts using an RMS feature, RMS tries to install stuff? My interpretation of this is

1. Python/pyjulia knows where Julia is

2. The Julia python finds has RMS installed

3. Julia/PyCall finds the wrong python and can't find the rmg stuff so tries to install it (probably using the default python)

So it seems that our problem is simply that while everything we need is installed PyCall doesn't know where the right python/conda env is. This can be set by defining environment variables: PYTHON and maybe also CONDA_JL_HOME (see https://github.com/JuliaPy/PyCall.jl and https://github.com/JuliaPy/Conda.jl). In the build we can set environmental variables that will automatically load when the environment loads so in theory if we do this for PYTHON and CONDA_JL_HOME RMS will grab the appropriate python and find that the packages it needs are already there. An example of doing this from the build file I wrote for julia binaries is below:

#make julia directory
mkdir -p ${PREFIX}/share/julia/site
mkdir -p ${PREFIX}/bin
#set JULIA_DEPOT_PATH in conda env
export JULIA_DEPOT_PATH="${PREFIX}/share/julia/site"
ACTIVATE_ENV="${PREFIX}/etc/conda/activate.d/env_vars.sh"
DEACTIVATE_ENV="${PREFIX}/etc/conda/deactivate.d/env_vars.sh"

if [ -f "$ACTIVATE_ENV" ]; then
        echo "export JULIA_DEPOT_PATH=\"${PREFIX}/share/julia/site\"" >> $ACTIVATE_ENV
        echo "export JULIA_OLD_LD_LIBRARY_PATH=$LD_LIBRARY_PATH" >> $ACTIVATE_ENV
        echo "export LD_LIBRARY_PATH=\"${PREFIX}/lib\"" >> $ACTIVATE_ENV
else
        mkdir -p ${PREFIX}/etc/conda/activate.d
        touch ${PREFIX}/etc/conda/activate.d/env_vars.sh
        echo '#!/bin/sh' >> $ACTIVATE_ENV
        echo "export JULIA_DEPOT_PATH=\"${PREFIX}/share/julia/site\"" >> $ACTIVATE_ENV
        echo "export JULIA_OLD_LD_LIBRARY_PATH=$LD_LIBRARY_PATH" >> $ACTIVATE_ENV
        echo "export LD_LIBRARY_PATH=\"${PREFIX}/lib\"" >> $ACTIVATE_ENV
fi
if [ -f "$DEACTIVATE_ENV" ]; then
        echo "unset JULIA_DEPOT_PATH" >> $DEACTIVATE_ENV
        echo "export LD_LIBRARY_PATH=$JULIA_OLD_LD_LIBRARY_PATH" >> $DEACTIVATE_ENV
        echo "unset JULIA_OLD_LD_LIBRARY_PATH" >> $DEACTIVATE_ENV
else
        mkdir -p ${PREFIX}/etc/conda/deactivate.d
        touch ${PREFIX}/etc/conda/deactivate.d/env_vars.sh
        echo '#!/bin/sh' >> $DEACTIVATE_ENV
        echo "unset JULIA_DEPOT_PATH" >> $DEACTIVATE_ENV
        echo "export LD_LIBRARY_PATH=$JULIA_OLD_LD_LIBRARY_PATH" >> $DEACTIVATE_ENV
        echo "unset JULIA_OLD_LD_LIBRARY_PATH" >> $DEACTIVATE_ENV
fi

Actually, in addition to this we also need to run Pkg.build("PyCall") once in the conda environment after construction...cleanest would be the first time the conda environment activates, although calling julia.install() inside RMG will also do this.

Copy link

Regression Testing Results

⚠️ One or more regression tests failed.
Please download the failed results and run the tests locally or check the log to see why.

Detailed regression test results.

Regression test aromatics:

Reference: Execution time (DD:HH:MM:SS): 00:00:01:05
Current: Execution time (DD:HH:MM:SS): 00:00:01:03
Reference: Memory used: 2982.38 MB
Current: Memory used: 2971.48 MB

aromatics Passed Core Comparison ✅

Original model has 15 species.
Test model has 15 species. ✅
Original model has 11 reactions.
Test model has 11 reactions. ✅

aromatics Failed Edge Comparison ❌

Original model has 106 species.
Test model has 106 species. ✅
Original model has 358 reactions.
Test model has 358 reactions. ✅

Non-identical thermo! ❌
original: C=CC1C=CC2=CC1C=C2
tested: C=CC1C=CC2=CC1C=C2

Hf(300K) S(300K) Cp(300K) Cp(400K) Cp(500K) Cp(600K) Cp(800K) Cp(1000K) Cp(1500K)
83.22 82.78 35.48 45.14 53.78 61.40 73.58 82.20 95.08
83.22 84.16 35.48 45.14 53.78 61.40 73.58 82.20 95.08

Identical thermo comments:
thermo: Thermo group additivity estimation: group(Cs-(Cds-Cds)(Cds-Cds)CsH) + group(Cs-(Cds-Cds)(Cds-Cds)CsH) + group(Cds-Cds(Cds-Cds)(Cds-Cds)) + group(Cds- CdsCsH) + group(Cds-CdsCsH) + group(Cds-CdsCsH) + group(Cds-CdsCsH) + group(Cds-Cds(Cds-Cds)H) + group(Cds-Cds(Cds-Cds)H) + group(Cds-CdsHH) + Estimated bicyclic component: polycyclic(s3_5_6_ane) - ring(Cyclohexane) - ring(Cyclopentane) + ring(1,3-Cyclohexadiene) + ring(Cyclopentadiene)

Non-identical thermo! ❌
original: C1=CC2C=CC=1C=C2
tested: C1=CC2C=CC=1C=C2

Hf(300K) S(300K) Cp(300K) Cp(400K) Cp(500K) Cp(600K) Cp(800K) Cp(1000K) Cp(1500K)
164.90 80.93 22.21 28.97 35.25 40.69 48.70 53.97 64.36
129.39 79.85 22.98 30.09 36.61 42.21 50.22 55.39 65.95

thermo: Thermo group additivity estimation: group(Cs-(Cds-Cds)(Cds-Cds)(Cds-Cds)H) + group(Cds-Cds(Cds-Cds)(Cds-Cds)) + group(Cds-CdsCsH) + group(Cds-CdsCsH) + group(Cds-Cds(Cds-Cds)H) + group(Cds-Cds(Cds-Cds)H) + group(Cds-CdsCsH) + group(Cdd-CdsCds) + Estimated bicyclic component: polycyclic(s4_6_6_ane) - ring(Cyclohexane) - ring(Cyclohexane) + ring(124cyclohexatriene) + ring(124cyclohexatriene)
thermo: Thermo group additivity estimation: group(Cs-(Cds-Cds)(Cds-Cds)(Cds-Cds)H) + group(Cds-Cds(Cds-Cds)(Cds-Cds)) + group(Cds-CdsCsH) + group(Cds-CdsCsH) + group(Cds-Cds(Cds-Cds)H) + group(Cds-Cds(Cds-Cds)H) + group(Cds-CdsCsH) + group(Cdd-CdsCds) + Estimated bicyclic component: polycyclic(s4_6_6_ane) - ring(Cyclohexane) - ring(Cyclohexane) + ring(124cyclohexatriene) + ring(1,4-Cyclohexadiene)

Non-identical kinetics! ❌
original:
rxn: [c]1ccccc1(3) + C1=CC2C=C[C]1C=C2(49) <=> benzene(1) + C1=CC2C=CC=1C=C2(79) origin: Disproportionation
tested:
rxn: [c]1ccccc1(3) + C1=CC2C=C[C]1C=C2(49) <=> benzene(1) + C1=CC2C=CC=1C=C2(79) origin: Disproportionation

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): -3.00 -0.74 0.70 1.71 3.07 3.97 5.33 6.15
k(T): 4.24 4.69 5.05 5.33 5.79 6.14 6.78 7.23

kinetics: Arrhenius(A=(17.1699,'cm^3/(mol*s)'), n=3.635, Ea=(9.943,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R Multiplied by reaction path degeneracy 3.0 Ea raised from 38.5 to 41.6 kJ/mol to match endothermicity of reaction.""")
kinetics: Arrhenius(A=(17.1699,'cm^3/(mol*s)'), n=3.635, Ea=(0,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R Multiplied by reaction path degeneracy 3.0""")
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R
Multiplied by reaction path degeneracy 3.0
Ea raised from 38.5 to 41.6 kJ/mol to match endothermicity of reaction.
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R
Multiplied by reaction path degeneracy 3.0

Non-identical kinetics! ❌
original:
rxn: [H](4) + C1=CC2C=C[C]1C=C2(49) <=> [H][H](11) + C1=CC2C=CC=1C=C2(79) origin: Disproportionation
tested:
rxn: [H](4) + C1=CC2C=C[C]1C=C2(49) <=> [H][H](11) + C1=CC2C=CC=1C=C2(79) origin: Disproportionation

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): -7.44 -4.08 -2.05 -0.69 1.02 2.06 3.46 4.18
k(T): 5.77 5.83 5.88 5.92 5.97 6.02 6.10 6.16

kinetics: Arrhenius(A=(4.06926e+10,'cm^3/(mol*s)'), n=0.47, Ea=(18.137,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O Multiplied by reaction path degeneracy 3.0 Ea raised from 75.2 to 75.9 kJ/mol to match endothermicity of reaction.""")
kinetics: Arrhenius(A=(4.06926e+10,'cm^3/(mol*s)'), n=0.47, Ea=(0,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O Multiplied by reaction path degeneracy 3.0""")
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O
Multiplied by reaction path degeneracy 3.0
Ea raised from 75.2 to 75.9 kJ/mol to match endothermicity of reaction.
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O
Multiplied by reaction path degeneracy 3.0

Non-identical kinetics! ❌
original:
rxn: [CH]=C(7) + C1=CC2C=C[C]1C=C2(49) <=> C=C(13) + C1=CC2C=CC=1C=C2(79) origin: Disproportionation
tested:
rxn: [CH]=C(7) + C1=CC2C=C[C]1C=C2(49) <=> C=C(13) + C1=CC2C=CC=1C=C2(79) origin: Disproportionation

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): -7.17 -3.66 -1.56 -0.16 1.60 2.65 4.05 4.75
k(T): 4.06 4.76 5.18 5.46 5.81 6.02 6.30 6.44

kinetics: Arrhenius(A=(7.23e+12,'cm^3/(mol*s)'), n=0, Ea=(19.262,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_N-Sp-6R!H-4CHNS Multiplied by reaction path degeneracy 3.0""")
kinetics: Arrhenius(A=(7.23e+12,'cm^3/(mol*s)'), n=0, Ea=(3.841,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_N-Sp-6R!H-4CHNS Multiplied by reaction path degeneracy 3.0""")
Identical kinetics comments:
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_N-Sp-6R!H-4CHNS
Multiplied by reaction path degeneracy 3.0

Non-identical kinetics! ❌
original:
rxn: [CH]1C2=CC=CC12(8) + C1=CC2C=C[C]1C=C2(49) <=> C1=CC2CC2=C1(27) + C1=CC2C=CC=1C=C2(79) origin: Disproportionation
tested:
rxn: [CH]1C2=CC=CC12(8) + C1=CC2C=C[C]1C=C2(49) <=> C1=CC2CC2=C1(27) + C1=CC2C=CC=1C=C2(79) origin: Disproportionation

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): -30.48 -21.35 -15.79 -12.03 -7.23 -4.28 -0.16 2.03
k(T): -4.55 -1.90 -0.23 0.94 2.49 3.50 5.02 5.92

kinetics: Arrhenius(A=(17.1699,'cm^3/(mol*s)'), n=3.635, Ea=(47.659,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R Multiplied by reaction path degeneracy 3.0 Ea raised from 195.4 to 199.4 kJ/mol to match endothermicity of reaction.""")
kinetics: Arrhenius(A=(17.1699,'cm^3/(mol*s)'), n=3.635, Ea=(12.063,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R Multiplied by reaction path degeneracy 3.0 Ea raised from 46.8 to 50.5 kJ/mol to match endothermicity of reaction.""")
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R
Multiplied by reaction path degeneracy 3.0
Ea raised from 195.4 to 199.4 kJ/mol to match endothermicity of reaction.
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R
Multiplied by reaction path degeneracy 3.0
Ea raised from 46.8 to 50.5 kJ/mol to match endothermicity of reaction.

Non-identical kinetics! ❌
original:
rxn: [CH]1C2=CC=CC12(8) + C1=CC2C=C[C]1C=C2(49) <=> C1=CC2C=C2C1(29) + C1=CC2C=CC=1C=C2(79) origin: Disproportionation
tested:
rxn: [CH]1C2=CC=CC12(8) + C1=CC2C=C[C]1C=C2(49) <=> C1=CC2C=C2C1(29) + C1=CC2C=CC=1C=C2(79) origin: Disproportionation

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): -31.23 -21.91 -16.23 -12.40 -7.51 -4.50 -0.31 1.91
k(T): -5.30 -2.46 -0.68 0.57 2.21 3.28 4.87 5.80

kinetics: Arrhenius(A=(17.1699,'cm^3/(mol*s)'), n=3.635, Ea=(48.686,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R Multiplied by reaction path degeneracy 3.0 Ea raised from 202.2 to 203.7 kJ/mol to match endothermicity of reaction.""")
kinetics: Arrhenius(A=(17.1699,'cm^3/(mol*s)'), n=3.635, Ea=(13.089,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R Multiplied by reaction path degeneracy 3.0 Ea raised from 53.5 to 54.8 kJ/mol to match endothermicity of reaction.""")
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R
Multiplied by reaction path degeneracy 3.0
Ea raised from 202.2 to 203.7 kJ/mol to match endothermicity of reaction.
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R
Multiplied by reaction path degeneracy 3.0
Ea raised from 53.5 to 54.8 kJ/mol to match endothermicity of reaction.

Non-identical kinetics! ❌
original:
rxn: [CH]1C2=CC=CC12(8) + C1=CC2C=C[C]1C=C2(49) <=> C1=CC2=CC2C1(28) + C1=CC2C=CC=1C=C2(79) origin: Disproportionation
tested:
rxn: [CH]1C2=CC=CC12(8) + C1=CC2C=C[C]1C=C2(49) <=> C1=CC2=CC2C1(28) + C1=CC2C=CC=1C=C2(79) origin: Disproportionation

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): -27.24 -18.91 -13.84 -10.40 -6.02 -3.30 0.48 2.51
k(T): -1.38 0.48 1.67 2.52 3.68 4.45 5.66 6.39

kinetics: Arrhenius(A=(17.1699,'cm^3/(mol*s)'), n=3.635, Ea=(43.208,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R Multiplied by reaction path degeneracy 3.0 Ea raised from 180.2 to 180.8 kJ/mol to match endothermicity of reaction.""")
kinetics: Arrhenius(A=(17.1699,'cm^3/(mol*s)'), n=3.635, Ea=(7.718,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R Multiplied by reaction path degeneracy 3.0""")
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R
Multiplied by reaction path degeneracy 3.0
Ea raised from 180.2 to 180.8 kJ/mol to match endothermicity of reaction.
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R
Multiplied by reaction path degeneracy 3.0

Non-identical kinetics! ❌
original:
rxn: [CH]=CC=C(15) + C1=CC2C=C[C]1C=C2(49) <=> C=CC=C(17) + C1=CC2C=CC=1C=C2(79) origin: Disproportionation
tested:
rxn: [CH]=CC=C(15) + C1=CC2C=C[C]1C=C2(49) <=> C=CC=C(17) + C1=CC2C=CC=1C=C2(79) origin: Disproportionation

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): -11.95 -7.61 -5.01 -3.27 -1.10 0.20 1.93 2.80
k(T): -0.49 0.99 1.87 2.46 3.19 3.64 4.23 4.52

kinetics: Arrhenius(A=(2.529e+11,'cm^3/(mol*s)'), n=0, Ea=(23.821,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-6R!H-R Multiplied by reaction path degeneracy 3.0""")
kinetics: Arrhenius(A=(2.529e+11,'cm^3/(mol*s)'), n=0, Ea=(8.084,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-6R!H-R Multiplied by reaction path degeneracy 3.0""")
Identical kinetics comments:
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-6R!H-R
Multiplied by reaction path degeneracy 3.0

Non-identical kinetics! ❌
original:
rxn: C1=CC2C=C[C]1C=C2(49) + [CH]=Cc1ccccc1(12) <=> C1=CC2C=CC=1C=C2(79) + C=Cc1ccccc1(16) origin: Disproportionation
tested:
rxn: C1=CC2C=C[C]1C=C2(49) + [CH]=Cc1ccccc1(12) <=> C1=CC2C=CC=1C=C2(79) + C=Cc1ccccc1(16) origin: Disproportionation

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): -12.28 -7.86 -5.21 -3.44 -1.23 0.10 1.87 2.75
k(T): -0.66 0.85 1.76 2.37 3.13 3.58 4.19 4.49

kinetics: Arrhenius(A=(2.529e+11,'cm^3/(mol*s)'), n=0, Ea=(24.273,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-6R!H-R Multiplied by reaction path degeneracy 3.0""")
kinetics: Arrhenius(A=(2.529e+11,'cm^3/(mol*s)'), n=0, Ea=(8.328,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-6R!H-R Multiplied by reaction path degeneracy 3.0""")
Identical kinetics comments:
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-6R!H-R
Multiplied by reaction path degeneracy 3.0

Non-identical kinetics! ❌
original:
rxn: C1=CC2C=C[C]1C=C2(49) + [CH]1C2=CC=CC1C=C2(48) <=> C1=CC2C=CC=1C=C2(79) + C1=CC2C=CC(=C1)C2(69) origin: Disproportionation
tested:
rxn: C1=CC2C=C[C]1C=C2(49) + [CH]1C2=CC=CC1C=C2(48) <=> C1=CC2C=CC=1C=C2(79) + C1=CC2C=CC(=C1)C2(69) origin: Disproportionation

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): -30.44 -21.32 -15.76 -12.01 -7.22 -4.26 -0.16 2.03
k(T): -4.51 -1.87 -0.20 0.96 2.51 3.52 5.03 5.92

kinetics: Arrhenius(A=(17.1699,'cm^3/(mol*s)'), n=3.635, Ea=(47.606,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R Multiplied by reaction path degeneracy 3.0 Ea raised from 195.1 to 199.2 kJ/mol to match endothermicity of reaction.""")
kinetics: Arrhenius(A=(17.1699,'cm^3/(mol*s)'), n=3.635, Ea=(12.01,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R Multiplied by reaction path degeneracy 3.0 Ea raised from 46.5 to 50.2 kJ/mol to match endothermicity of reaction.""")
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R
Multiplied by reaction path degeneracy 3.0
Ea raised from 195.1 to 199.2 kJ/mol to match endothermicity of reaction.
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R
Multiplied by reaction path degeneracy 3.0
Ea raised from 46.5 to 50.2 kJ/mol to match endothermicity of reaction.

Non-identical kinetics! ❌
original:
rxn: C1=CC2C=C[C]1C=C2(49) + [CH]1C2=CC=CC1C=C2(48) <=> C1=CC2C=CC=1C=C2(79) + C1=CC2C=CC(=C2)C1(70) origin: Disproportionation
tested:
rxn: C1=CC2C=C[C]1C=C2(49) + [CH]1C2=CC=CC1C=C2(48) <=> C1=CC2C=CC=1C=C2(79) + C1=CC2C=CC(=C2)C1(70) origin: Disproportionation

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): -32.11 -22.57 -16.76 -12.84 -7.84 -4.76 -0.49 1.78
k(T): -6.18 -3.12 -1.20 0.13 1.88 3.01 4.70 5.67

kinetics: Arrhenius(A=(17.1699,'cm^3/(mol*s)'), n=3.635, Ea=(49.895,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R Multiplied by reaction path degeneracy 3.0 Ea raised from 205.2 to 208.8 kJ/mol to match endothermicity of reaction.""")
kinetics: Arrhenius(A=(17.1699,'cm^3/(mol*s)'), n=3.635, Ea=(14.299,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R Multiplied by reaction path degeneracy 3.0 Ea raised from 56.6 to 59.8 kJ/mol to match endothermicity of reaction.""")
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R
Multiplied by reaction path degeneracy 3.0
Ea raised from 205.2 to 208.8 kJ/mol to match endothermicity of reaction.
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R
Multiplied by reaction path degeneracy 3.0
Ea raised from 56.6 to 59.8 kJ/mol to match endothermicity of reaction.

Non-identical kinetics! ❌
original:
rxn: C1=CC2C=C[C]1C=C2(49) + [CH]1C2=CC=CC1C=C2(48) <=> C1=CC2C=CC=1C=C2(79) + C1=CC2=CC(C=C2)C1(71) origin: Disproportionation
tested:
rxn: C1=CC2C=C[C]1C=C2(49) + [CH]1C2=CC=CC1C=C2(48) <=> C1=CC2C=CC=1C=C2(79) + C1=CC2=CC(C=C2)C1(71) origin: Disproportionation

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): -33.97 -23.97 -17.88 -13.77 -8.54 -5.32 -0.86 1.50
k(T): -8.04 -4.52 -2.32 -0.81 1.18 2.46 4.32 5.39

kinetics: Arrhenius(A=(17.1699,'cm^3/(mol*s)'), n=3.635, Ea=(52.457,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R Multiplied by reaction path degeneracy 3.0 Ea raised from 214.4 to 219.5 kJ/mol to match endothermicity of reaction.""")
kinetics: Arrhenius(A=(17.1699,'cm^3/(mol*s)'), n=3.635, Ea=(16.86,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R Multiplied by reaction path degeneracy 3.0 Ea raised from 65.8 to 70.5 kJ/mol to match endothermicity of reaction.""")
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R
Multiplied by reaction path degeneracy 3.0
Ea raised from 214.4 to 219.5 kJ/mol to match endothermicity of reaction.
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R
Multiplied by reaction path degeneracy 3.0
Ea raised from 65.8 to 70.5 kJ/mol to match endothermicity of reaction.

Non-identical kinetics! ❌
original:
rxn: C1=CC2C=C[C]1C=C2(49) + C1=CC2C=C[C]1C=C2(49) <=> C1=CC2C=CC=1C=C2(79) + C1=CC2C=CC1C=C2(82) origin: Disproportionation
tested:
rxn: C1=CC2C=C[C]1C=C2(49) + C1=CC2C=C[C]1C=C2(49) <=> C1=CC2C=CC=1C=C2(79) + C1=CC2C=CC1C=C2(82) origin: Disproportionation

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): -30.48 -21.35 -15.79 -12.03 -7.23 -4.28 -0.16 2.03
k(T): -4.55 -1.90 -0.23 0.94 2.49 3.50 5.02 5.92

kinetics: Arrhenius(A=(17.1699,'cm^3/(mol*s)'), n=3.635, Ea=(47.659,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R Multiplied by reaction path degeneracy 3.0 Ea raised from 195.4 to 199.4 kJ/mol to match endothermicity of reaction.""")
kinetics: Arrhenius(A=(17.1699,'cm^3/(mol*s)'), n=3.635, Ea=(12.063,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R Multiplied by reaction path degeneracy 3.0 Ea raised from 46.8 to 50.5 kJ/mol to match endothermicity of reaction.""")
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R
Multiplied by reaction path degeneracy 3.0
Ea raised from 195.4 to 199.4 kJ/mol to match endothermicity of reaction.
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R
Multiplied by reaction path degeneracy 3.0
Ea raised from 46.8 to 50.5 kJ/mol to match endothermicity of reaction.

Non-identical kinetics! ❌
original:
rxn: C1=CC2C=C[C]1C=C2(49) + C1=CC2C=C[C]1C=C2(49) <=> C1=CC2C=CC=1C=C2(79) + C1=CC2C=CC1=CC2(83) origin: Disproportionation
tested:
rxn: C1=CC2C=C[C]1C=C2(49) + C1=CC2C=C[C]1C=C2(49) <=> C1=CC2C=CC=1C=C2(79) + C1=CC2C=CC1=CC2(83) origin: Disproportionation

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): -19.49 -12.98 -9.00 -6.29 -2.81 -0.64 2.42 4.08
k(T): 3.96 4.60 5.07 5.43 5.98 6.39 7.11 7.60

kinetics: Arrhenius(A=(51.5097,'cm^3/(mol*s)'), n=3.635, Ea=(33.226,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R Multiplied by reaction path degeneracy 9.0 Ea raised from 133.4 to 139.0 kJ/mol to match endothermicity of reaction.""")
kinetics: Arrhenius(A=(51.5097,'cm^3/(mol*s)'), n=3.635, Ea=(1.036,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R Multiplied by reaction path degeneracy 9.0""")
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R
Multiplied by reaction path degeneracy 9.0
Ea raised from 133.4 to 139.0 kJ/mol to match endothermicity of reaction.
kinetics: Estimated from node Root_Ext-1R!H-R_N-4R->O_Sp-5R!H=1R!H_Ext-4CHNS-R_Ext-4CHNS-R
Multiplied by reaction path degeneracy 9.0

Observables Test Case: Aromatics Comparison

✅ All Observables varied by less than 0.500 on average between old model and new model in all conditions!

aromatics Passed Observable Testing ✅

Regression test liquid_oxidation:

Reference: Execution time (DD:HH:MM:SS): 00:00:02:08
Current: Execution time (DD:HH:MM:SS): 00:00:02:04
Reference: Memory used: 3105.74 MB
Current: Memory used: 3071.60 MB

liquid_oxidation Passed Core Comparison ✅

Original model has 37 species.
Test model has 37 species. ✅
Original model has 216 reactions.
Test model has 216 reactions. ✅

liquid_oxidation Failed Edge Comparison ❌

Original model has 202 species.
Test model has 202 species. ✅
Original model has 1610 reactions.
Test model has 1610 reactions. ✅

Non-identical kinetics! ❌
original:
rxn: CCCCCO[O](104) + CC(CC(C)OO)O[O](103) <=> oxygen(1) + CCCCC[O](127) + CC([O])CC(C)OO(129) origin: Peroxyl_Disproportionation
tested:
rxn: CCCCCO[O](104) + CC(CC(C)OO)O[O](103) <=> oxygen(1) + CCCCC[O](128) + CC([O])CC(C)OO(127) origin: Peroxyl_Disproportionation

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): 7.79 7.46 7.21 7.00 6.67 6.41 5.94 5.60
k(T): 3.52 4.27 4.71 5.01 5.39 5.61 5.91 6.06

kinetics: Arrhenius(A=(3.18266e+20,'cm^3/(mol*s)'), n=-2.694, Ea=(0.053,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-5R-R_7R!H->C_N-7C-inRing Ea raised from 0.0 to 0.2 kJ/mol to match endothermicity of reaction.""")
kinetics: Arrhenius(A=(3.2e+12,'cm^3/(mol*s)'), n=0, Ea=(4.096,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-5R-R_7R!H->C_N-7C-inRing_Ext-5R-R""")
kinetics: Estimated from node Root_Ext-5R-R_7R!H->C_N-7C-inRing
Ea raised from 0.0 to 0.2 kJ/mol to match endothermicity of reaction.
kinetics: Estimated from node Root_Ext-5R-R_7R!H->C_N-7C-inRing_Ext-5R-R

Observables Test Case: liquid_oxidation Comparison

✅ All Observables varied by less than 0.100 on average between old model and new model in all conditions!

liquid_oxidation Passed Observable Testing ✅

Regression test nitrogen:

Reference: Execution time (DD:HH:MM:SS): 00:00:01:22
Current: Execution time (DD:HH:MM:SS): 00:00:01:14
Reference: Memory used: 3100.00 MB
Current: Memory used: 3080.04 MB

nitrogen Passed Core Comparison ✅

Original model has 41 species.
Test model has 41 species. ✅
Original model has 359 reactions.
Test model has 359 reactions. ✅

nitrogen Passed Edge Comparison ✅

Original model has 132 species.
Test model has 132 species. ✅
Original model has 995 reactions.
Test model has 995 reactions. ✅

Observables Test Case: NC Comparison

✅ All Observables varied by less than 0.200 on average between old model and new model in all conditions!

nitrogen Passed Observable Testing ✅

Regression test oxidation:

Reference: Execution time (DD:HH:MM:SS): 00:00:02:20
Current: Execution time (DD:HH:MM:SS): 00:00:01:46
Reference: Memory used: 2976.81 MB
Current: Memory used: 2958.54 MB

oxidation Passed Core Comparison ✅

Original model has 59 species.
Test model has 59 species. ✅
Original model has 694 reactions.
Test model has 694 reactions. ✅

oxidation Passed Edge Comparison ✅

Original model has 230 species.
Test model has 230 species. ✅
Original model has 1526 reactions.
Test model has 1526 reactions. ✅

Observables Test Case: Oxidation Comparison

✅ All Observables varied by less than 0.500 on average between old model and new model in all conditions!

oxidation Passed Observable Testing ✅

Regression test sulfur:

Reference: Execution time (DD:HH:MM:SS): 00:00:00:54
Current: Execution time (DD:HH:MM:SS): 00:00:00:49
Reference: Memory used: 3081.25 MB
Current: Memory used: 3078.55 MB

sulfur Passed Core Comparison ✅

Original model has 27 species.
Test model has 27 species. ✅
Original model has 74 reactions.
Test model has 74 reactions. ✅

sulfur Failed Edge Comparison ❌

Original model has 89 species.
Test model has 89 species. ✅
Original model has 227 reactions.
Test model has 227 reactions. ✅
The original model has 1 reactions that the tested model does not have. ❌
rxn: O(4) + SO2(15) (+N2) <=> SO3(16) (+N2) origin: primarySulfurLibrary
The tested model has 1 reactions that the original model does not have. ❌
rxn: O(4) + SO2(15) (+N2) <=> SO3(16) (+N2) origin: primarySulfurLibrary

Observables Test Case: SO2 Comparison

✅ All Observables varied by less than 0.100 on average between old model and new model in all conditions!

sulfur Passed Observable Testing ✅

Regression test superminimal:

Reference: Execution time (DD:HH:MM:SS): 00:00:00:34
Current: Execution time (DD:HH:MM:SS): 00:00:00:32
Reference: Memory used: 3181.24 MB
Current: Memory used: 3173.04 MB

superminimal Passed Core Comparison ✅

Original model has 13 species.
Test model has 13 species. ✅
Original model has 21 reactions.
Test model has 21 reactions. ✅

superminimal Passed Edge Comparison ✅

Original model has 18 species.
Test model has 18 species. ✅
Original model has 28 reactions.
Test model has 28 reactions. ✅

Regression test RMS_constantVIdealGasReactor_superminimal:

Reference: Execution time (DD:HH:MM:SS): 00:00:02:26
Current: Execution time (DD:HH:MM:SS): 00:00:02:27
Reference: Memory used: 3644.32 MB
Current: Memory used: 3642.18 MB

RMS_constantVIdealGasReactor_superminimal Passed Core Comparison ✅

Original model has 13 species.
Test model has 13 species. ✅
Original model has 19 reactions.
Test model has 19 reactions. ✅

RMS_constantVIdealGasReactor_superminimal Passed Edge Comparison ✅

Original model has 13 species.
Test model has 13 species. ✅
Original model has 19 reactions.
Test model has 19 reactions. ✅

Observables Test Case: RMS_constantVIdealGasReactor_superminimal Comparison

✅ All Observables varied by less than 0.100 on average between old model and new model in all conditions!

RMS_constantVIdealGasReactor_superminimal Passed Observable Testing ✅

Regression test RMS_CSTR_liquid_oxidation:

Reference: Execution time (DD:HH:MM:SS): 00:00:06:05
Current: Execution time (DD:HH:MM:SS): 00:00:06:10
Reference: Memory used: 3590.43 MB
Current: Memory used: 3575.23 MB

RMS_CSTR_liquid_oxidation Passed Core Comparison ✅

Original model has 37 species.
Test model has 37 species. ✅
Original model has 232 reactions.
Test model has 232 reactions. ✅

RMS_CSTR_liquid_oxidation Failed Edge Comparison ❌

Original model has 206 species.
Test model has 206 species. ✅
Original model has 1508 reactions.
Test model has 1508 reactions. ✅
The original model has 1 reactions that the tested model does not have. ❌
rxn: CCCO[O](34) <=> [OH](22) + CCC=O(44) origin: intra_H_migration
The tested model has 1 reactions that the original model does not have. ❌
rxn: CCCO[O](36) <=> CC[CH]OO(45) origin: intra_H_migration

Observables Test Case: RMS_CSTR_liquid_oxidation Comparison

✅ All Observables varied by less than 0.100 on average between old model and new model in all conditions!

RMS_CSTR_liquid_oxidation Passed Observable Testing ✅

Regression test fragment:

Reference: Execution time (DD:HH:MM:SS): 00:00:00:39
Current: Execution time (DD:HH:MM:SS): 00:00:00:38
Reference: Memory used: 2905.14 MB
Current: Memory used: 2894.54 MB

fragment Passed Core Comparison ✅

Original model has 10 species.
Test model has 10 species. ✅
Original model has 2 reactions.
Test model has 2 reactions. ✅

fragment Passed Edge Comparison ✅

Original model has 33 species.
Test model has 33 species. ✅
Original model has 47 reactions.
Test model has 47 reactions. ✅

Observables Test Case: fragment Comparison

✅ All Observables varied by less than 0.100 on average between old model and new model in all conditions!

fragment Passed Observable Testing ✅

Regression test RMS_constantVIdealGasReactor_fragment:

Reference: Execution time (DD:HH:MM:SS): 00:00:03:04
Current: Execution time (DD:HH:MM:SS): 00:00:03:08
Reference: Memory used: 3807.51 MB
Current: Memory used: 3794.07 MB

RMS_constantVIdealGasReactor_fragment Passed Core Comparison ✅

Original model has 10 species.
Test model has 10 species. ✅
Original model has 2 reactions.
Test model has 2 reactions. ✅

RMS_constantVIdealGasReactor_fragment Passed Edge Comparison ✅

Original model has 27 species.
Test model has 27 species. ✅
Original model has 24 reactions.
Test model has 24 reactions. ✅

Observables Test Case: RMS_constantVIdealGasReactor_fragment Comparison

✅ All Observables varied by less than 0.100 on average between old model and new model in all conditions!

RMS_constantVIdealGasReactor_fragment Passed Observable Testing ✅

beep boop this comment was written by a bot 🤖

@JacksonBurns JacksonBurns changed the title Avoid Unnecessary Julia Operations Avoid Unnecessary Julia Operations + Optional RMS Installation Mar 22, 2024
@JacksonBurns
Copy link
Contributor Author

Rebased onto the latest cclib CI fix in #2638

Copy link

Regression Testing Results

⚠️ One or more regression tests failed.
Please download the failed results and run the tests locally or check the log to see why.

Detailed regression test results.

Regression test aromatics:

Reference: Execution time (DD:HH:MM:SS): 00:00:01:05
Current: Execution time (DD:HH:MM:SS): 00:00:01:04
Reference: Memory used: 2775.14 MB
Current: Memory used: 2752.61 MB

aromatics Passed Core Comparison ✅

Original model has 15 species.
Test model has 15 species. ✅
Original model has 11 reactions.
Test model has 11 reactions. ✅

aromatics Failed Edge Comparison ❌

Original model has 106 species.
Test model has 106 species. ✅
Original model has 358 reactions.
Test model has 358 reactions. ✅

Non-identical thermo! ❌
original: C=CC1C=CC2=CC1C=C2
tested: C=CC1C=CC2=CC1C=C2

Hf(300K) S(300K) Cp(300K) Cp(400K) Cp(500K) Cp(600K) Cp(800K) Cp(1000K) Cp(1500K)
83.22 82.78 35.48 45.14 53.78 61.40 73.58 82.20 95.08
83.22 84.16 35.48 45.14 53.78 61.40 73.58 82.20 95.08

Identical thermo comments:
thermo: Thermo group additivity estimation: group(Cs-(Cds-Cds)(Cds-Cds)CsH) + group(Cs-(Cds-Cds)(Cds-Cds)CsH) + group(Cds-Cds(Cds-Cds)(Cds-Cds)) + group(Cds- CdsCsH) + group(Cds-CdsCsH) + group(Cds-CdsCsH) + group(Cds-CdsCsH) + group(Cds-Cds(Cds-Cds)H) + group(Cds-Cds(Cds-Cds)H) + group(Cds-CdsHH) + Estimated bicyclic component: polycyclic(s3_5_6_ane) - ring(Cyclohexane) - ring(Cyclopentane) + ring(1,3-Cyclohexadiene) + ring(Cyclopentadiene)

Observables Test Case: Aromatics Comparison

✅ All Observables varied by less than 0.500 on average between old model and new model in all conditions!

aromatics Passed Observable Testing ✅

Regression test liquid_oxidation:

Reference: Execution time (DD:HH:MM:SS): 00:00:02:09
Current: Execution time (DD:HH:MM:SS): 00:00:02:07
Reference: Memory used: 2911.35 MB
Current: Memory used: 2858.28 MB

liquid_oxidation Failed Core Comparison ❌

Original model has 37 species.
Test model has 37 species. ✅
Original model has 215 reactions.
Test model has 216 reactions. ❌
The tested model has 1 reactions that the original model does not have. ❌
rxn: CCO[O](30) <=> [OH](22) + CC=O(69) origin: intra_H_migration

liquid_oxidation Failed Edge Comparison ❌

Original model has 202 species.
Test model has 202 species. ✅
Original model has 1613 reactions.
Test model has 1613 reactions. ✅
The original model has 1 reactions that the tested model does not have. ❌
rxn: CCO[O](30) <=> C[CH]OO(73) origin: intra_H_migration
The tested model has 1 reactions that the original model does not have. ❌
rxn: CCO[O](30) <=> [OH](22) + CC=O(69) origin: intra_H_migration

Non-identical kinetics! ❌
original:
rxn: CCCCCO[O](104) + CC(CC(C)OO)O[O](103) <=> oxygen(1) + CCCCC[O](127) + CC([O])CC(C)OO(129) origin: Peroxyl_Disproportionation
tested:
rxn: CCCCCO[O](104) + CC(CC(C)OO)O[O](103) <=> oxygen(1) + CCCCC[O](128) + CC([O])CC(C)OO(127) origin: Peroxyl_Disproportionation

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): 7.79 7.46 7.21 7.00 6.67 6.41 5.94 5.60
k(T): 3.52 4.27 4.71 5.01 5.39 5.61 5.91 6.06

kinetics: Arrhenius(A=(3.18266e+20,'cm^3/(mol*s)'), n=-2.694, Ea=(0.053,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-5R-R_7R!H->C_N-7C-inRing Ea raised from 0.0 to 0.2 kJ/mol to match endothermicity of reaction.""")
kinetics: Arrhenius(A=(3.2e+12,'cm^3/(mol*s)'), n=0, Ea=(4.096,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-5R-R_7R!H->C_N-7C-inRing_Ext-5R-R""")
kinetics: Estimated from node Root_Ext-5R-R_7R!H->C_N-7C-inRing
Ea raised from 0.0 to 0.2 kJ/mol to match endothermicity of reaction.
kinetics: Estimated from node Root_Ext-5R-R_7R!H->C_N-7C-inRing_Ext-5R-R

Observables Test Case: liquid_oxidation Comparison

✅ All Observables varied by less than 0.100 on average between old model and new model in all conditions!

liquid_oxidation Passed Observable Testing ✅

Regression test nitrogen:

Reference: Execution time (DD:HH:MM:SS): 00:00:01:21
Current: Execution time (DD:HH:MM:SS): 00:00:01:13
Reference: Memory used: 2910.90 MB
Current: Memory used: 2858.85 MB

nitrogen Passed Core Comparison ✅

Original model has 41 species.
Test model has 41 species. ✅
Original model has 360 reactions.
Test model has 360 reactions. ✅

nitrogen Failed Edge Comparison ❌

Original model has 132 species.
Test model has 132 species. ✅
Original model has 997 reactions.
Test model has 997 reactions. ✅

Non-identical thermo! ❌
original: O1[C]=N1
tested: O1[C]=N1

Hf(300K) S(300K) Cp(300K) Cp(400K) Cp(500K) Cp(600K) Cp(800K) Cp(1000K) Cp(1500K)
141.64 58.66 12.26 12.27 12.09 11.96 12.26 12.72 12.15
116.46 53.90 11.62 12.71 13.49 13.96 14.14 13.85 13.58

thermo: Thermo group additivity estimation: group(O2s-CdN3d) + group(N3d-OCd) + group(Cd-HN3dO) + ring(oxirene) + radical(CdJ-NdO)
thermo: Thermo group additivity estimation: group(O2s-CdN3d) + group(N3d-OCd) + group(Cd-HN3dO) + ring(Cyclopropene) + radical(CdJ-NdO)

Non-identical kinetics! ❌
original:
rxn: NCO(66) <=> O1[C]=N1(126) origin: Intra_R_Add_Endocyclic
tested:
rxn: NCO(66) <=> O1[C]=N1(126) origin: Intra_R_Add_Endocyclic

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): -66.25 -46.19 -34.19 -26.21 -16.28 -10.36 -2.54 1.31
k(T): -49.54 -33.65 -24.16 -17.85 -10.01 -5.35 0.80 3.82

kinetics: Arrhenius(A=(6.95187e+18,'s^-1'), n=-1.628, Ea=(111.271,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Backbone0_N-2R!H-inRing_N-1R!H-inRing_Sp-2R!H-1R!H""")
kinetics: Arrhenius(A=(6.95187e+18,'s^-1'), n=-1.628, Ea=(88.327,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Backbone0_N-2R!H-inRing_N-1R!H-inRing_Sp-2R!H-1R!H""")
Identical kinetics comments:
kinetics: Estimated from node Backbone0_N-2R!H-inRing_N-1R!H-inRing_Sp-2R!H-1R!H

Observables Test Case: NC Comparison

✅ All Observables varied by less than 0.200 on average between old model and new model in all conditions!

nitrogen Passed Observable Testing ✅

Regression test oxidation:

Reference: Execution time (DD:HH:MM:SS): 00:00:02:23
Current: Execution time (DD:HH:MM:SS): 00:00:01:46
Reference: Memory used: 2780.00 MB
Current: Memory used: 2741.80 MB

oxidation Passed Core Comparison ✅

Original model has 59 species.
Test model has 59 species. ✅
Original model has 694 reactions.
Test model has 694 reactions. ✅

oxidation Passed Edge Comparison ✅

Original model has 230 species.
Test model has 230 species. ✅
Original model has 1526 reactions.
Test model has 1526 reactions. ✅

Observables Test Case: Oxidation Comparison

✅ All Observables varied by less than 0.500 on average between old model and new model in all conditions!

oxidation Passed Observable Testing ✅

Regression test sulfur:

Reference: Execution time (DD:HH:MM:SS): 00:00:00:54
Current: Execution time (DD:HH:MM:SS): 00:00:00:50
Reference: Memory used: 2886.10 MB
Current: Memory used: 2861.99 MB

sulfur Passed Core Comparison ✅

Original model has 27 species.
Test model has 27 species. ✅
Original model has 74 reactions.
Test model has 74 reactions. ✅

sulfur Failed Edge Comparison ❌

Original model has 89 species.
Test model has 89 species. ✅
Original model has 227 reactions.
Test model has 227 reactions. ✅
The original model has 1 reactions that the tested model does not have. ❌
rxn: O(4) + SO2(15) (+N2) <=> SO3(16) (+N2) origin: primarySulfurLibrary
The tested model has 1 reactions that the original model does not have. ❌
rxn: O(4) + SO2(15) (+N2) <=> SO3(16) (+N2) origin: primarySulfurLibrary

Observables Test Case: SO2 Comparison

✅ All Observables varied by less than 0.100 on average between old model and new model in all conditions!

sulfur Passed Observable Testing ✅

Regression test superminimal:

Reference: Execution time (DD:HH:MM:SS): 00:00:00:34
Current: Execution time (DD:HH:MM:SS): 00:00:00:32
Reference: Memory used: 2992.09 MB
Current: Memory used: 2958.99 MB

superminimal Passed Core Comparison ✅

Original model has 13 species.
Test model has 13 species. ✅
Original model has 21 reactions.
Test model has 21 reactions. ✅

superminimal Passed Edge Comparison ✅

Original model has 18 species.
Test model has 18 species. ✅
Original model has 28 reactions.
Test model has 28 reactions. ✅

Regression test RMS_constantVIdealGasReactor_superminimal:

Reference: Execution time (DD:HH:MM:SS): 00:00:02:27
Current: Execution time (DD:HH:MM:SS): 00:00:02:27
Reference: Memory used: 3451.60 MB
Current: Memory used: 3458.48 MB

RMS_constantVIdealGasReactor_superminimal Passed Core Comparison ✅

Original model has 13 species.
Test model has 13 species. ✅
Original model has 19 reactions.
Test model has 19 reactions. ✅

RMS_constantVIdealGasReactor_superminimal Passed Edge Comparison ✅

Original model has 13 species.
Test model has 13 species. ✅
Original model has 19 reactions.
Test model has 19 reactions. ✅

Observables Test Case: RMS_constantVIdealGasReactor_superminimal Comparison

✅ All Observables varied by less than 0.100 on average between old model and new model in all conditions!

RMS_constantVIdealGasReactor_superminimal Passed Observable Testing ✅

Regression test RMS_CSTR_liquid_oxidation:

Reference: Execution time (DD:HH:MM:SS): 00:00:06:08
Current: Execution time (DD:HH:MM:SS): 00:00:06:15
Reference: Memory used: 3384.60 MB
Current: Memory used: 3363.76 MB

RMS_CSTR_liquid_oxidation Failed Core Comparison ❌

Original model has 37 species.
Test model has 37 species. ✅
Original model has 233 reactions.
Test model has 232 reactions. ❌
The original model has 1 reactions that the tested model does not have. ❌
rxn: CCO[O](34) <=> [OH](21) + CC=O(61) origin: intra_H_migration

RMS_CSTR_liquid_oxidation Failed Edge Comparison ❌

Original model has 206 species.
Test model has 206 species. ✅
Original model has 1508 reactions.
Test model has 1508 reactions. ✅
The original model has 1 reactions that the tested model does not have. ❌
rxn: CCO[O](34) <=> [OH](21) + CC=O(61) origin: intra_H_migration
The tested model has 1 reactions that the original model does not have. ❌
rxn: CCO[O](35) <=> C[CH]OO(62) origin: intra_H_migration

Observables Test Case: RMS_CSTR_liquid_oxidation Comparison

✅ All Observables varied by less than 0.100 on average between old model and new model in all conditions!

RMS_CSTR_liquid_oxidation Passed Observable Testing ✅

Regression test fragment:

Reference: Execution time (DD:HH:MM:SS): 00:00:00:40
Current: Execution time (DD:HH:MM:SS): 00:00:00:38
Reference: Memory used: 2711.97 MB
Current: Memory used: 2685.41 MB

fragment Passed Core Comparison ✅

Original model has 10 species.
Test model has 10 species. ✅
Original model has 2 reactions.
Test model has 2 reactions. ✅

fragment Passed Edge Comparison ✅

Original model has 33 species.
Test model has 33 species. ✅
Original model has 47 reactions.
Test model has 47 reactions. ✅

Observables Test Case: fragment Comparison

✅ All Observables varied by less than 0.100 on average between old model and new model in all conditions!

fragment Passed Observable Testing ✅

Regression test RMS_constantVIdealGasReactor_fragment:

Reference: Execution time (DD:HH:MM:SS): 00:00:03:06
Current: Execution time (DD:HH:MM:SS): 00:00:03:10
Reference: Memory used: 3584.70 MB
Current: Memory used: 3577.63 MB

RMS_constantVIdealGasReactor_fragment Passed Core Comparison ✅

Original model has 10 species.
Test model has 10 species. ✅
Original model has 2 reactions.
Test model has 2 reactions. ✅

RMS_constantVIdealGasReactor_fragment Passed Edge Comparison ✅

Original model has 27 species.
Test model has 27 species. ✅
Original model has 24 reactions.
Test model has 24 reactions. ✅

Observables Test Case: RMS_constantVIdealGasReactor_fragment Comparison

✅ All Observables varied by less than 0.100 on average between old model and new model in all conditions!

RMS_constantVIdealGasReactor_fragment Passed Observable Testing ✅

beep boop this comment was written by a bot 🤖

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.

Arkane takes a long time to run due to loading Julia dependencies
3 participants