Skip to content

Restore incremental Cython builds in Makefile#2902

Merged
rwest merged 3 commits intomainfrom
copilot/restore-incremental-builds-cython-extensions
Mar 26, 2026
Merged

Restore incremental Cython builds in Makefile#2902
rwest merged 3 commits intomainfrom
copilot/restore-incremental-builds-cython-extensions

Conversation

Copy link
Contributor

Copilot AI commented Mar 24, 2026

Issue

As described in #2901, make was invoking pip install -e . on every run, causing full recompilation of all Cython extensions regardless of what changed. This replaces it with setup.py build_ext --inplace, which respects timestamps and only rebuilds modified extensions.

Changes

  • build target (new): runs python setup.py build_ext --inplace for incremental compilation
  • install target (mostly unchanged) still runs pip install --no-build-isolation -vv -e . for initial setup or dependency changes. Creates a sentinel file to indicate that it's installed.
  • all target (default): installs if it is not already installed (first time, or after a clean), but otherwise runs the incremental build. Uses the sentinel file to tell whether it's installed.
  • clean target: uninstalls and deletes the sentinel file.

Result

Running make once installs it.
Running make twice without source changes no longer triggers recompilation.
Running make after editing a single cythonized source file triggers recompilation of only that file, and it is then used in the "installed" version.

Testing

The above results work on my machine.
eg. add the line print("TESTING - LOADING MOLECULE MODULE") near the top of rmgpy/molecule/molecule.py then run make eg0 and this one file will be Cythonized, compiled, and the example will run, outputting TESTING - LOADING MOLECULE MODULE near the top of its output.

Also:

Updated some outdated actions in Github Workflows.
The CI tests currently take 5+ hours, so rather than wait a whole workday for a separate pull request, I'm adding this loosely-related commit to this PR.

Authorship

First commit was by the github co-pilot (who is credited as the author of the pull request) but subsequent ones by @rwest (with some guidance from Claude and copilot)

Fixes #2901

Copilot AI changed the title [WIP] Restore incremental builds for Cython extensions to use build_ext --inplace Restore incremental Cython builds in Makefile Mar 24, 2026
Copilot AI requested a review from rwest March 24, 2026 20:38
@JacksonBurns
Copy link
Contributor

The extended description for the commit causing this behavior explains:

installation updates: make RMG-Py actually `pip`-installable as `reactionmechanismgenerator` to avoid having to set the `PYTHONPATH` variable, which breaks `juliacall`, add a convenience script for installing RMS

We may be able to undo this change (as done in this PR) with the latest Julia installation system. The CI will tell us shortly (the * with RMS tests must pass).

@rwest rwest force-pushed the copilot/restore-incremental-builds-cython-extensions branch from 81a6163 to 9ea1e25 Compare March 25, 2026 02:38
@rwest rwest marked this pull request as ready for review March 25, 2026 02:50
@github-actions
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:00:53
Current: Execution time (DD:HH:MM:SS): 00:00:00:57
Reference: Memory used: 750.00 MB
Current: Memory used: 749.74 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: [CH]1C2C=CC3C(=C2)C13
tested: [CH]1C2C=CC3C(=C2)C13

Hf(300K) S(300K) Cp(300K) Cp(400K) Cp(500K) Cp(600K) Cp(800K) Cp(1000K) Cp(1500K)
125.44 71.45 27.43 34.15 40.42 46.18 56.01 63.43 71.86
144.84 79.03 29.08 35.37 40.95 45.86 53.89 59.79 67.35

thermo: Thermo group additivity estimation: group(Cs-(Cds-Cds)CsCsH) + group(Cs-(Cds-Cds)(Cds-Cds)CsH) + group(Cs-(Cds-Cds)(Cds-Cds)CsH) + group(Cs-CsCsHH) + group(Cds-CdsCsCs) + group(Cds-CdsCsH) + group(Cds-CdsCsH) + group(Cds-CdsCsH) + Estimated bicyclic component: polycyclic(s2_3_5_ane) - ring(Cyclopropane) - ring(Cyclopentane) + ring(Cyclopentene) + ring(Cyclopropane) + polycyclic(s2_3_6_ene_1) + polycyclic(s3_5_6_diene_1_5) - ring(Cyclopropane) - ring(Cyclopentene) - ring(Cyclohexene) + radical(cyclopentene-4)
thermo: Thermo group additivity estimation: group(Cs-(Cds-Cds)CsCsH) + group(Cs-(Cds-Cds)(Cds-Cds)CsH) + group(Cs-(Cds-Cds)(Cds-Cds)CsH) + group(Cs-CsCsHH) + group(Cds-CdsCsCs) + group(Cds-CdsCsH) + group(Cds-CdsCsH) + group(Cds-CdsCsH) + Estimated bicyclic component: polycyclic(s2_3_5_ane) - ring(Cyclopropane) - ring(Cyclopentane) + ring(Cyclopentene) + ring(Cyclopropane) + polycyclic(s2_3_6_diene_0_3) + Estimated bicyclic component: polycyclic(s3_5_6_ane) - ring(Cyclopentane) - ring(Cyclohexane) + ring(Cyclopentene) + ring(1,4-Cyclohexadiene) - ring(Cyclopropane) - ring(Cyclopentene) - ring(1,4-Cyclohexadiene) + radical(cyclopentene-4)

Non-identical thermo! ❌
original: [CH]1C2=CC3C1C3C=C2
tested: [CH]1C2=CC3C1C3C=C2

Hf(300K) S(300K) Cp(300K) Cp(400K) Cp(500K) Cp(600K) Cp(800K) Cp(1000K) Cp(1500K)
100.48 61.70 25.50 33.41 40.70 47.02 56.22 61.78 71.32
98.15 66.21 25.82 33.30 40.19 46.24 55.47 61.34 70.49

thermo: Thermo group additivity estimation: group(Cs-CsCsCsH) + group(Cs-(Cds-Cds)CsCsH) + group(Cs-(Cds-Cds)CsCsH) + group(Cs-(Cds-Cds)CsHH) + group(Cds- Cds(Cds-Cds)Cs) + group(Cds-CdsCsH) + group(Cds-CdsCsH) + group(Cds-Cds(Cds-Cds)H) + polycyclic(s2_3_5_ene_1) + polycyclic(s2_3_6_ene_1) + Estimated bicyclic component: polycyclic(s3_5_6_ane) - ring(Cyclopentane) - ring(Cyclohexane) + ring(Cyclopentene) + ring(Cyclohexene) - ring(Cyclopropane) - ring(Cyclopentene) - ring(Cyclohexene) + radical(cyclopentene-allyl)
thermo: Thermo group additivity estimation: group(Cs-CsCsCsH) + group(Cs-(Cds-Cds)CsCsH) + group(Cs-(Cds-Cds)CsCsH) + group(Cs-(Cds-Cds)CsHH) + group(Cds- Cds(Cds-Cds)Cs) + group(Cds-CdsCsH) + group(Cds-CdsCsH) + group(Cds-Cds(Cds-Cds)H) + polycyclic(s2_3_5_ene_1) + polycyclic(s2_3_6_diene_1_3) + Estimated bicyclic component: polycyclic(s3_5_6_ane) - ring(Cyclopentane) - ring(Cyclohexane) + ring(Cyclopentene) + ring(1,3-Cyclohexadiene) - ring(Cyclopropane) - ring(Cyclopentene) - ring(1,3-Cyclohexadiene) + radical(cyclopentene-allyl)

Non-identical kinetics! ❌
original:
rxn: [CH]1C2=CC=CC1C=C2(48) <=> [CH]1C2C=CC3C(=C2)C13(63) origin: Intra_R_Add_Endocyclic
tested:
rxn: [CH]1C2=CC=CC1C=C2(48) <=> [CH]1C2C=CC3C(=C2)C13(63) origin: Intra_R_Add_Endocyclic

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): -27.05 -17.33 -11.49 -7.60 -2.72 0.21 4.13 6.10
k(T): -37.76 -25.37 -17.92 -12.96 -6.74 -3.01 1.98 4.49

kinetics: Arrhenius(A=(1.12e+11,'s^-1'), n=0.26, Ea=(53.177,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Backbone3_Sp-4R!H=1R!H_Sp-3R!H-2R!H_Sp-2R!H-1R!H_Ext-2R!H-R in family Intra_R_Add_Endocyclic.""")
kinetics: Arrhenius(A=(1.12e+11,'s^-1'), n=0.26, Ea=(67.891,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Backbone3_Sp-4R!H=1R!H_Sp-3R!H-2R!H_Sp-2R!H-1R!H_Ext-2R!H-R in family Intra_R_Add_Endocyclic.""")
Identical kinetics comments:
kinetics: Estimated from node Backbone3_Sp-4R!H=1R!H_Sp-3R!H-2R!H_Sp-2R!H-1R!H_Ext-2R!H-R in family Intra_R_Add_Endocyclic.

Non-identical kinetics! ❌
original:
rxn: [CH]1C2=CC=CC1C=C2(48) <=> [CH]1C2=CC3C1C3C=C2(67) origin: Intra_R_Add_Endocyclic
tested:
rxn: [CH]1C2=CC=CC1C=C2(48) <=> [CH]1C2=CC3C1C3C=C2(67) origin: Intra_R_Add_Endocyclic

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): -15.17 -8.42 -4.36 -1.66 1.73 3.77 6.50 7.88
k(T): -14.18 -7.68 -3.77 -1.16 2.10 4.07 6.70 8.03

kinetics: Arrhenius(A=(1.12e+11,'s^-1'), n=0.26, Ea=(36.869,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Backbone3_Sp-4R!H=1R!H_Sp-3R!H-2R!H_Sp-2R!H-1R!H_Ext-2R!H-R in family Intra_R_Add_Endocyclic.""")
kinetics: Arrhenius(A=(1.12e+11,'s^-1'), n=0.26, Ea=(35.513,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Backbone3_Sp-4R!H=1R!H_Sp-3R!H-2R!H_Sp-2R!H-1R!H_Ext-2R!H-R in family Intra_R_Add_Endocyclic.""")
Identical kinetics comments:
kinetics: Estimated from node Backbone3_Sp-4R!H=1R!H_Sp-3R!H-2R!H_Sp-2R!H-1R!H_Ext-2R!H-R in family Intra_R_Add_Endocyclic.

Non-identical kinetics! ❌
original:
rxn: C1=CC2C=C[C]1C=C2(49) <=> [CH]1C2C=CC3=CC2C13(80) origin: Intra_R_Add_Endocyclic
tested:
rxn: C1=CC2C=C[C]1C=C2(49) <=> [CH]1C2C=CC3=CC2C13(80) origin: Intra_R_Add_Endocyclic

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): -56.49 -38.05 -27.01 -19.66 -10.50 -5.02 2.25 5.85
k(T): -59.93 -40.64 -29.08 -21.38 -11.79 -6.05 1.56 5.34

kinetics: Arrhenius(A=(6.50724e+19,'s^-1'), n=-0.859, Ea=(101.822,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Backbone1_2R!H-inRing_1R!H-inRing in family Intra_R_Add_Endocyclic. Multiplied by reaction path degeneracy 6.0""")
kinetics: Arrhenius(A=(6.50724e+19,'s^-1'), n=-0.859, Ea=(106.547,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Backbone1_2R!H-inRing_1R!H-inRing in family Intra_R_Add_Endocyclic. Multiplied by reaction path degeneracy 6.0""")
Identical kinetics comments:
kinetics: Estimated from node Backbone1_2R!H-inRing_1R!H-inRing in family Intra_R_Add_Endocyclic.
Multiplied by reaction path degeneracy 6.0

Non-identical kinetics! ❌
original:
rxn: C1=CC2C=C[C]1C=C2(49) <=> [CH]1C2=CC3C1C3C=C2(67) origin: Intra_R_Add_Endocyclic
tested:
rxn: C1=CC2C=C[C]1C=C2(49) <=> [CH]1C2=CC3C1C3C=C2(67) origin: Intra_R_Add_Endocyclic

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): -8.89 -3.16 0.28 2.58 5.46 7.19 9.52 10.69
k(T): -8.00 -2.50 0.81 3.02 5.79 7.46 9.70 10.83

kinetics: Arrhenius(A=(1.49409e+13,'s^-1'), n=0.283, Ea=(31.249,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Backbone2_Sp-3R!H=1R!H_N-4R!H->S_2R!H-inRing_5R!H-inRing_Ext-5R!H-R_Ext-6R!H-R_Ext-7R!H-R_1R!H-inRing in family Intra_R_Add_Endocyclic. Multiplied by reaction path degeneracy 3.0""")
kinetics: Arrhenius(A=(1.49409e+13,'s^-1'), n=0.283, Ea=(30.033,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Backbone2_Sp-3R!H=1R!H_N-4R!H->S_2R!H-inRing_5R!H-inRing_Ext-5R!H-R_Ext-6R!H-R_Ext-7R!H-R_1R!H-inRing in family Intra_R_Add_Endocyclic. Multiplied by reaction path degeneracy 3.0""")
Identical kinetics comments:
kinetics: Estimated from node Backbone2_Sp-3R!H=1R!H_N-4R!H->S_2R!H-inRing_5R!H-inRing_Ext-5R!H-R_Ext-6R!H-R_Ext-7R!H-R_1R!H-inRing in family Intra_R_Add_Endocyclic.
Multiplied by reaction path degeneracy 3.0

Details 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:01:53
Current: Execution time (DD:HH:MM:SS): 00:00:02:01
Reference: Memory used: 850.67 MB
Current: Memory used: 849.67 MB

liquid_oxidation Passed Core Comparison ✅

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

liquid_oxidation Failed Edge Comparison ❌

Original model has 214 species.
Test model has 214 species. ✅
Original model has 1590 reactions.
Test model has 1590 reactions. ✅

Non-identical kinetics! ❌
original:
rxn: CCC(CC)O[O](37) + CCCCCO[O](36) <=> oxygen(1) + CCC([O])CC(69) + CCCCC[O](67) origin: Peroxyl_Disproportionation
tested:
rxn: CCC(CC)O[O](36) + CCCCCO[O](35) <=> oxygen(1) + CCC([O])CC(67) + CCCCC[O](69) origin: Peroxyl_Disproportionation

k(1bar) 300K 400K 500K 600K 800K 1000K 1500K 2000K
k(T): 7.83 7.49 7.23 7.02 6.68 6.42 5.95 5.61
k(T): 3.54 4.28 4.73 5.02 5.39 5.62 5.91 6.06

kinetics: Arrhenius(A=(3.18266e+20,'cm^3/(mol*s)'), n=-2.694, Ea=(0,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-5R-R_7R!H->C_N-7C-inRing in family Peroxyl_Disproportionation.""")
kinetics: Arrhenius(A=(3.2e+12,'cm^3/(mol*s)'), n=0, Ea=(4.064,'kcal/mol'), T0=(1,'K'), comment="""Estimated from node Root_Ext-5R-R_7R!H->C_N-7C-inRing_Ext-5R-R in family Peroxyl_Disproportionation.""")
kinetics: Estimated from node Root_Ext-5R-R_7R!H->C_N-7C-inRing in family Peroxyl_Disproportionation.
kinetics: Estimated from node Root_Ext-5R-R_7R!H->C_N-7C-inRing_Ext-5R-R in family Peroxyl_Disproportionation.

Details 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:00:59
Current: Execution time (DD:HH:MM:SS): 00:00:01:04
Reference: Memory used: 852.87 MB
Current: Memory used: 847.71 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 133 species.
Test model has 133 species. ✅
Original model has 983 reactions.
Test model has 983 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)
116.46 53.90 11.62 12.71 13.49 13.96 14.14 13.85 13.58
141.64 58.66 12.26 12.27 12.09 11.96 12.26 12.72 12.15

thermo: Thermo group additivity estimation: group(O2s-CdN3d) + group(N3d-OCd) + group(Cd-HN3dO) + ring(Cyclopropene) + radical(CdJ-NdO)
thermo: Thermo group additivity estimation: group(O2s-CdN3d) + group(N3d-OCd) + group(Cd-HN3dO) + ring(oxirene) + 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): -49.54 -33.65 -24.16 -17.85 -10.01 -5.35 0.80 3.82
k(T): -66.25 -46.19 -34.19 -26.21 -16.28 -10.36 -2.54 1.31

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 in family Intra_R_Add_Endocyclic.""")
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 in family Intra_R_Add_Endocyclic.""")
Identical kinetics comments:
kinetics: Estimated from node Backbone0_N-2R!H-inRing_N-1R!H-inRing_Sp-2R!H-1R!H in family Intra_R_Add_Endocyclic.

Details 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:01:39
Current: Execution time (DD:HH:MM:SS): 00:00:01:47
Reference: Memory used: 738.31 MB
Current: Memory used: 737.89 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. ✅

Details 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 ✅
Errors occurred during observable testing ⚠️ WARNING:root:Initial mole fractions do not sum to one; normalizing.

Regression test sulfur:

Reference: Execution time (DD:HH:MM:SS): 00:00:00:38
Current: Execution time (DD:HH:MM:SS): 00:00:00:41
Reference: Memory used: 848.67 MB
Current: Memory used: 847.11 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

Details Observables Test Case: SO2 Comparison

The following observables did not match:

❌ Observable species O=S=O varied by more than 0.100 on average between old model SO2(15) and new model SO2(15) in condition 1.

⚠️ The following reaction conditions had some discrepancies:
Condition 1:
Reactor Type: IdealGasReactor
Reaction Time: 0.01 s
T0: 900 K
P0: 30 bar
Initial Mole Fractions: {'S': 0.000756, '[O][O]': 0.00129, 'N#N': 0.997954}

sulfur Failed Observable Testing ❌

Regression test superminimal:

Reference: Execution time (DD:HH:MM:SS): 00:00:00:23
Current: Execution time (DD:HH:MM:SS): 00:00:00:27
Reference: Memory used: 934.92 MB
Current: Memory used: 938.70 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:39
Current: Execution time (DD:HH:MM:SS): 00:00:02:23
Reference: Memory used: 2498.51 MB
Current: Memory used: 2297.81 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. ✅

Details 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:09:01
Current: Execution time (DD:HH:MM:SS): 00:00:08:48
Reference: Memory used: 2623.25 MB
Current: Memory used: 2562.53 MB

RMS_CSTR_liquid_oxidation Failed Core Comparison ❌

Original model has 35 species.
Test model has 35 species. ✅
Original model has 128 reactions.
Test model has 121 reactions. ❌
The original model has 5 species that the tested model does not have. ❌
spc: CCCCCO
spc: CC1CC(C)O1(87)
spc: CC=CC(C)OO(88)
spc: C=CCC(C)OO(89)
spc: CC(CC(C)OO)OO
The tested model has 5 species that the original model does not have. ❌
spc: [CH2]CCC(9)
spc: CH3
spc: C=CC(18)
spc: [CH2]C(CCC)OO(33)
spc: [CH2]CCC(C)OO(35)
The original model has 30 reactions that the tested model does not have. ❌
rxn: [O]O(13) + [CH2]CCCC(12) <=> CCCCCOO(78) origin: R_Recombination
rxn: [OH](26) + [OH](26) <=> OO(23) origin: R_Recombination
rxn: [O]O(13) + CCCCCO[O](61) <=> oxygen(1) + CCCCCOO(78) origin: H_Abstraction
rxn: OO(23) + CCCC(C)OO(25) <=> [OH](26) + O(42) + CCCC(C)O[O](21) origin: Bimolec_Hydroperoxide_Decomposition
rxn: OO(23) + CCC(CC)OO(24) <=> [OH](26) + O(42) + CCC(CC)O[O](20) origin: Bimolec_Hydroperoxide_Decomposition
rxn: [CH2]CCCC(12) + CCCCCO[O](61) <=> C=CCCC(18) + CCCCCOO(78) origin: Disproportionation
rxn: C[CH]CCC(11) + CCCCCO[O](61) <=> C=CCCC(18) + CCCCCOO(78) origin: Disproportionation
rxn: OO(23) + CCCCCOO(78) <=> [OH](26) + O(42) + CCCCCO[O](61) origin: Bimolec_Hydroperoxide_Decomposition
rxn: oxygen(1) + C[CH]CC(C)OO(34) <=> CC(CC(C)OO)O[O](91) origin: R_Recombination
rxn: CCCC(C)OO(25) + CCCCCOO(78) <=> O(42) + CCCC(C)[O](41) + CCCCCO[O](61) origin: Bimolec_Hydroperoxide_Decomposition
rxn: OO(23) + CCCC(C)OO(25) <=> [O]O(13) + O(42) + CCCC(C)[O](41) origin: Bimolec_Hydroperoxide_Decomposition
rxn: oxygen(1) + C[CH]CC(C)OO(34) <=> [O]O(13) + CC=CC(C)OO(88) origin: Disproportionation
rxn: [OH](26) + CCCCC[O](79) <=> CCCCCOO(78) origin: R_Recombination
rxn: CCCC(C)OO(25) + CCCCCOO(78) <=> O(42) + CCCCC[O](79) + CCCC(C)O[O](21) origin: Bimolec_Hydroperoxide_Decomposition
rxn: CCC(CC)OO(24) + CCCCCOO(78) <=> O(42) + CCCCC[O](79) + CCC(CC)O[O](20) origin: Bimolec_Hydroperoxide_Decomposition
rxn: CCCCCOO(78) + CCCCCOO(78) <=> O(42) + CCCCC[O](79) + CCCCCO[O](61) origin: Bimolec_Hydroperoxide_Decomposition
rxn: OO(23) + CCCCCOO(78) <=> [O]O(13) + O(42) + CCCCC[O](79) origin: Bimolec_Hydroperoxide_Decomposition
rxn: CCC(CC)OO(24) + CCCCCOO(78) <=> O(42) + CCC([O])CC(44) + CCCCCO[O](61) origin: Bimolec_Hydroperoxide_Decomposition
rxn: OO(23) + CCC(CC)OO(24) <=> [O]O(13) + O(42) + CCC([O])CC(44) origin: Bimolec_Hydroperoxide_Decomposition
rxn: [O]O(13) + C[CH]CCCOO(75) <=> oxygen(1) + CCCCCOO(78) origin: H_Abstraction
rxn: [CH2]CCCC(12) + C[CH]CCCOO(75) <=> C=CCCC(18) + CCCCCOO(78) origin: Disproportionation
rxn: C[CH]CCC(11) + C[CH]CCCOO(75) <=> C=CCCC(18) + CCCCCOO(78) origin: Disproportionation
rxn: C[CH]CC(C)OO(34) <=> [OH](26) + CC1CC(C)O1(87) origin: Cyclic_Ether_Formation
rxn: oxygen(1) + C[CH]CC(C)OO(34) <=> [O]O(13) + C=CCC(C)OO(89) origin: Disproportionation
rxn: [O]O(13) + [CH2]CCCCOO(76) <=> oxygen(1) + CCCCCOO(78) origin: H_Abstraction
rxn: [CH2]CCCC(12) + [CH2]CCCCOO(76) <=> C=CCCC(18) + CCCCCOO(78) origin: Disproportionation
rxn: C[CH]CCC(11) + [CH2]CCCCOO(76) <=> C=CCCC(18) + CCCCCOO(78) origin: Disproportionation
rxn: [O]O(13) + CC[CH]CCOO(74) <=> oxygen(1) + CCCCCOO(78) origin: H_Abstraction
rxn: [CH2]CCCC(12) + CC[CH]CCOO(74) <=> C=CCCC(18) + CCCCCOO(78) origin: Disproportionation
rxn: C[CH]CCC(11) + CC[CH]CCOO(74) <=> C=CCCC(18) + CCCCCOO(78) origin: Disproportionation
The tested model has 23 reactions that the original model does not have. ❌
rxn: C[CH]CCC(11) <=> C[CH2](6) + C=CC(18) origin: R_Addition_MultipleBond
rxn: CCCC(C)O[O](21) <=> [CH2]C(CCC)OO(33) origin: intra_H_migration
rxn: [O]O(13) + [CH2]C(CCC)OO(33) <=> oxygen(1) + CCCC(C)OO(26) origin: H_Abstraction
rxn: OO(23) + [CH2]C(CCC)OO(33) <=> [O]O(13) + CCCC(C)OO(26) origin: H_Abstraction
rxn: [CH2]C(CCC)OO(33) + pentane(2) <=> C[CH]CCC(11) + CCCC(C)OO(26) origin: H_Abstraction
rxn: [CH2]C(CCC)OO(33) + pentane(2) <=> CC[CH]CC(7) + CCCC(C)OO(26) origin: H_Abstraction
rxn: [CH2]C(CCC)OO(33) + CCCC(C)OO(26) <=> CCCC(C)O[O](21) + CCCC(C)OO(26) origin: H_Abstraction
rxn: [CH2]C(CCC)OO(33) + CCC(CC)OO(27) <=> CCC(CC)O[O](22) + CCCC(C)OO(26) origin: H_Abstraction
rxn: [CH2]C(CCC)OO(33) + pentane(2) <=> [CH2]CCCC(12) + CCCC(C)OO(26) origin: H_Abstraction
rxn: [O]O(13) + C=CCCC(17) <=> [CH2]C(CCC)OO(33) origin: R_Addition_MultipleBond
rxn: [CH2]CCCC(12) + [CH2]C(CCC)OO(33) <=> C=CCCC(17) + CCCC(C)OO(26) origin: Disproportionation
rxn: C[CH]CCC(11) + [CH2]C(CCC)OO(33) <=> C=CCCC(17) + CCCC(C)OO(26) origin: Disproportionation
rxn: [CH2]CCC(C)OO(35) <=> CCCC(C)O[O](21) origin: intra_H_migration
rxn: [O]O(13) + [CH2]CCC(C)OO(35) <=> oxygen(1) + CCCC(C)OO(26) origin: H_Abstraction
rxn: OO(23) + [CH2]CCC(C)OO(35) <=> [O]O(13) + CCCC(C)OO(26) origin: H_Abstraction
rxn: [CH2]CCC(C)OO(35) + pentane(2) <=> C[CH]CCC(11) + CCCC(C)OO(26) origin: H_Abstraction
rxn: [CH2]CCC(C)OO(35) + pentane(2) <=> CC[CH]CC(7) + CCCC(C)OO(26) origin: H_Abstraction
rxn: [CH2]CCC(C)OO(35) + CCCC(C)OO(26) <=> CCCC(C)O[O](21) + CCCC(C)OO(26) origin: H_Abstraction
rxn: [CH2]CCC(C)OO(35) + CCC(CC)OO(27) <=> CCC(CC)O[O](22) + CCCC(C)OO(26) origin: H_Abstraction
rxn: [CH2]CCC(C)OO(35) + pentane(2) <=> [CH2]CCCC(12) + CCCC(C)OO(26) origin: H_Abstraction
rxn: [CH2]CCCC(12) + [CH2]CCC(C)OO(35) <=> C=CCCC(17) + CCCC(C)OO(26) origin: Disproportionation
rxn: C[CH]CCC(11) + [CH2]CCC(C)OO(35) <=> C=CCCC(17) + CCCC(C)OO(26) origin: Disproportionation
rxn: [CH3](10) + [CH2]CCC(9) <=> pentane(2) origin: R_Recombination

RMS_CSTR_liquid_oxidation Failed Edge Comparison ❌

Original model has 90 species.
Test model has 77 species. ❌
Original model has 316 reactions.
Test model has 246 reactions. ❌
The original model has 13 species that the tested model does not have. ❌
spc: CCCCCO
spc: [CH2]COO(80)
spc: [CH2]CCOO(81)
spc: [CH2]OO(82)
spc: [CH2]CCCOO(83)
spc: CCCC[CH]OO(84)
spc: C[CH]CCOO(85)
spc: [CH2]C(C)C(C)OO(86)
spc: CC1CC(C)O1(87)
spc: CC=CC(C)OO(88)
spc: C=CCC(C)OO(89)
spc: CC([O])CC(C)O(90)
spc: CC(CC(C)OO)OO
The original model has 70 reactions that the tested model does not have. ❌
rxn: [O]O(13) + [CH2]CCCC(12) <=> CCCCCOO(78) origin: R_Recombination
rxn: [OH](26) + [OH](26) <=> OO(23) origin: R_Recombination
rxn: [O]O(13) + CCCCCO[O](61) <=> oxygen(1) + CCCCCOO(78) origin: H_Abstraction
rxn: OO(23) + CCCC(C)OO(25) <=> [OH](26) + O(42) + CCCC(C)O[O](21) origin: Bimolec_Hydroperoxide_Decomposition
rxn: OO(23) + CCC(CC)OO(24) <=> [OH](26) + O(42) + CCC(CC)O[O](20) origin: Bimolec_Hydroperoxide_Decomposition
rxn: [CH2]CCCC(12) + CCCCCO[O](61) <=> C=CCCC(18) + CCCCCOO(78) origin: Disproportionation
rxn: C[CH]CCC(11) + CCCCCO[O](61) <=> C=CCCC(18) + CCCCCOO(78) origin: Disproportionation
rxn: OO(23) + CCCCCOO(78) <=> [OH](26) + O(42) + CCCCCO[O](61) origin: Bimolec_Hydroperoxide_Decomposition
rxn: oxygen(1) + C[CH]CC(C)OO(34) <=> CC(CC(C)OO)O[O](91) origin: R_Recombination
rxn: CCCC(C)OO(25) + CCCCCOO(78) <=> O(42) + CCCC(C)[O](41) + CCCCCO[O](61) origin: Bimolec_Hydroperoxide_Decomposition
rxn: OO(23) + CCCC(C)OO(25) <=> [O]O(13) + O(42) + CCCC(C)[O](41) origin: Bimolec_Hydroperoxide_Decomposition
rxn: oxygen(1) + C[CH]CC(C)OO(34) <=> [O]O(13) + CC=CC(C)OO(88) origin: Disproportionation
rxn: [OH](26) + CCCCC[O](79) <=> CCCCCOO(78) origin: R_Recombination
rxn: CCCC(C)OO(25) + CCCCCOO(78) <=> O(42) + CCCCC[O](79) + CCCC(C)O[O](21) origin: Bimolec_Hydroperoxide_Decomposition
rxn: CCC(CC)OO(24) + CCCCCOO(78) <=> O(42) + CCCCC[O](79) + CCC(CC)O[O](20) origin: Bimolec_Hydroperoxide_Decomposition
rxn: CCCCCOO(78) + CCCCCOO(78) <=> O(42) + CCCCC[O](79) + CCCCCO[O](61) origin: Bimolec_Hydroperoxide_Decomposition
rxn: OO(23) + CCCCCOO(78) <=> [O]O(13) + O(42) + CCCCC[O](79) origin: Bimolec_Hydroperoxide_Decomposition
rxn: CCC(CC)OO(24) + CCCCCOO(78) <=> O(42) + CCC([O])CC(44) + CCCCCO[O](61) origin: Bimolec_Hydroperoxide_Decomposition
rxn: OO(23) + CCC(CC)OO(24) <=> [O]O(13) + O(42) + CCC([O])CC(44) origin: Bimolec_Hydroperoxide_Decomposition
rxn: [O]O(13) + C[CH]CCCOO(75) <=> oxygen(1) + CCCCCOO(78) origin: H_Abstraction
rxn: [CH2]CCCC(12) + C[CH]CCCOO(75) <=> C=CCCC(18) + CCCCCOO(78) origin: Disproportionation
rxn: C[CH]CCC(11) + C[CH]CCCOO(75) <=> C=CCCC(18) + CCCCCOO(78) origin: Disproportionation
rxn: C[CH]CC(C)OO(34) <=> [OH](26) + CC1CC(C)O1(87) origin: Cyclic_Ether_Formation
rxn: oxygen(1) + C[CH]CC(C)OO(34) <=> [O]O(13) + C=CCC(C)OO(89) origin: Disproportionation
rxn: [O]O(13) + [CH2]CCCCOO(76) <=> oxygen(1) + CCCCCOO(78) origin: H_Abstraction
rxn: [CH2]CCCC(12) + [CH2]CCCCOO(76) <=> C=CCCC(18) + CCCCCOO(78) origin: Disproportionation
rxn: C[CH]CCC(11) + [CH2]CCCCOO(76) <=> C=CCCC(18) + CCCCCOO(78) origin: Disproportionation
rxn: [O]O(13) + CC[CH]CCOO(74) <=> oxygen(1) + CCCCCOO(78) origin: H_Abstraction
rxn: [CH2]CCCC(12) + CC[CH]CCOO(74) <=> C=CCCC(18) + CCCCCOO(78) origin: Disproportionation
rxn: C[CH]CCC(11) + CC[CH]CCOO(74) <=> C=CCCC(18) + CCCCCOO(78) origin: Disproportionation
rxn: C=CC[CH]C(64) + [CH2]CCCC(12) <=> C=CCCC(18) + C=CCCC(18) origin: Disproportionation
rxn: C=CC[CH]C(64) + C[CH]CCC(11) <=> C=CCCC(18) + C=CCCC(18) origin: Disproportionation
rxn: [CH2]C=CCC(66) + [CH2]CCCC(12) <=> C=CCCC(18) + C=CCCC(18) origin: Disproportionation
rxn: [CH2]C=CCC(66) + C[CH]CCC(11) <=> C=CCCC(18) + C=CCCC(18) origin: Disproportionation
rxn: [CH2]CCC=C(67) + [CH2]CCCC(12) <=> C=CCCC(18) + C=CCCC(18) origin: Disproportionation
rxn: [CH2]CCC=C(67) + C[CH]CCC(11) <=> C=CCCC(18) + C=CCCC(18) origin: Disproportionation
rxn: C=[C]CCC(68) + [CH2]CCCC(12) <=> C=CCCC(18) + C=CCCC(18) origin: Disproportionation
rxn: C=[C]CCC(68) + C[CH]CCC(11) <=> C=CCCC(18) + C=CCCC(18) origin: Disproportionation
rxn: [CH]=CCCC(69) + [CH2]CCCC(12) <=> C=CCCC(18) + C=CCCC(18) origin: Disproportionation
rxn: [CH]=CCCC(69) + C[CH]CCC(11) <=> C=CCCC(18) + C=CCCC(18) origin: Disproportionation
rxn: [CH2](3) + CCCCOO(50) <=> CCCCCOO(78) origin: 1,2_Insertion_carbene
rxn: [CH2](3) + CCCCOO(50) <=> CCCCCOO(78) origin: 1,2_Insertion_carbene
rxn: [H](8) + CCCCCO[O](61) <=> CCCCCOO(78) origin: R_Recombination
rxn: [CH2]COO(80) + [CH2]CC(5) <=> CCCCCOO(78) origin: R_Recombination
rxn: C[CH2](6) + [CH2]CCOO(81) <=> CCCCCOO(78) origin: R_Recombination
rxn: [H](8) + CC[CH]CCOO(74) <=> CCCCCOO(78) origin: R_Recombination
rxn: [CH2]OO(82) + [CH2]CCC(9) <=> CCCCCOO(78) origin: R_Recombination
rxn: [H](8) + CCC[CH]COO(73) <=> CCCCCOO(78) origin: R_Recombination
rxn: [CH3](10) + [CH2]CCCOO(83) <=> CCCCCOO(78) origin: R_Recombination
rxn: [H](8) + C[CH]CCCOO(75) <=> CCCCCOO(78) origin: R_Recombination
rxn: [H](8) + CCCC[CH]OO(84) <=> CCCCCOO(78) origin: R_Recombination
rxn: [H](8) + [CH2]CCCCOO(76) <=> CCCCCOO(78) origin: R_Recombination
rxn: [CH2](3) + C[CH]CCOO(85) <=> C[CH]CC(C)OO(34) origin: 1,2_Insertion_carbene
rxn: [CH2]C(C)C(C)OO(86) <=> C[CH]CC(C)OO(34) origin: 1,2_shiftC
rxn: [H](8) + CC=CC(C)OO(88) <=> C[CH]CC(C)OO(34) origin: R_Addition_MultipleBond
rxn: [H](8) + C=CCC(C)OO(89) <=> C[CH]CC(C)OO(34) origin: R_Addition_MultipleBond
rxn: C[CH]OO(52) + C=CC(19) <=> C[CH]CC(C)OO(34) origin: R_Addition_MultipleBond
rxn: CC[CH]C(C)OO(32) <=> C[CH]CC(C)OO(34) origin: intra_H_migration
rxn: [CH2]CCC(C)OO(35) <=> C[CH]CC(C)OO(34) origin: intra_H_migration
rxn: C[CH]CC(C)OO(34) <=> CCC[C](C)OO(54) origin: intra_H_migration
rxn: C[CH]CC(C)OO(34) <=> [CH2]C(CCC)OO(33) origin: intra_H_migration
rxn: C[CH]CC(C)OO(34) <=> CC([O])CC(C)O(90) origin: intra_OH_migration
rxn: [H](8) + [OH](26) <=> O(42) origin: R_Recombination
rxn: [H](8) + [O]O(13) <=> OO(23) origin: R_Recombination
rxn: [O]O(13) + CCC[CH]COO(73) <=> oxygen(1) + CCCCCOO(78) origin: H_Abstraction
rxn: [O]O(13) + CCCC[CH]OO(84) <=> oxygen(1) + CCCCCOO(78) origin: H_Abstraction
rxn: [CH2]CCCC(12) + CCC[CH]COO(73) <=> C=CCCC(18) + CCCCCOO(78) origin: Disproportionation
rxn: [CH2]CCCC(12) + CCCC[CH]OO(84) <=> C=CCCC(18) + CCCCCOO(78) origin: Disproportionation
rxn: C[CH]CCC(11) + CCC[CH]COO(73) <=> C=CCCC(18) + CCCCCOO(78) origin: Disproportionation
rxn: C[CH]CCC(11) + CCCC[CH]OO(84) <=> C=CCCC(18) + CCCCCOO(78) origin: Disproportionation

Details 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:32
Current: Execution time (DD:HH:MM:SS): 00:00:00:35
Reference: Memory used: 698.91 MB
Current: Memory used: 698.72 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. ✅

Details 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 ✅
Errors occurred during observable testing ⚠️ WARNING:root:Initial mole fractions do not sum to one; normalizing.

Regression test RMS_constantVIdealGasReactor_fragment:

Reference: Execution time (DD:HH:MM:SS): 00:00:03:03
Current: Execution time (DD:HH:MM:SS): 00:00:02:53
Reference: Memory used: 2554.67 MB
Current: Memory used: 2397.83 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. ✅

Details 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 ✅
Errors occurred during observable testing ⚠️ WARNING:root:Initial mole fractions do not sum to one; normalizing.

Regression test minimal_surface:

Reference: Execution time (DD:HH:MM:SS): 00:00:00:30
Current: Execution time (DD:HH:MM:SS): 00:00:00:33
Reference: Memory used: 854.19 MB
Current: Memory used: 853.03 MB

minimal_surface Passed Core Comparison ✅

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

minimal_surface Passed Edge Comparison ✅

Original model has 38 species.
Test model has 38 species. ✅
Original model has 38 reactions.
Test model has 38 reactions. ✅

Details Observables Test Case: minimal_surface Comparison

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

minimal_surface Passed Observable Testing ✅

beep boop this comment was written by a bot 🤖

@rwest
Copy link
Member

rwest commented Mar 25, 2026

I've moved the Conda-build related commits onto #2900, to see if that fixes the conda build that is failing there (and everywhere else). That PR should be merged first, then this rebased.

Copilot AI and others added 3 commits March 25, 2026 14:02
The goal is that `make` will install it if needed (with an editable install, which just links to the current source),
but if it's already installed, then it'll just do
an incremental build.
Although calling setuptools directly is deprecated, it is one of the only clean
ways to get incremental builds of the cython
modules.
Node.js 20 actions are deprecated. The following actions are running on Node.js 20
and may not work as expected: actions/checkout@v4,
 conda-incubator/setup-miniconda@v3.
 Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026

Unfortunately there is not yet a newer version of setup-miniconda than v3, although the main branch
has been updated to Node.js 24 so it
might not be long until they release v4.

This also addresses that `auto-activate-base` is deprecated in Setup Miniforge.
@rwest rwest force-pushed the copilot/restore-incremental-builds-cython-extensions branch from 9ea1e25 to 6d1a385 Compare March 25, 2026 18:03
@rwest rwest requested review from JacksonBurns and removed request for rwest March 25, 2026 18:28
@rwest rwest enabled auto-merge March 25, 2026 19:44
@rwest rwest merged commit 67c60b2 into main Mar 26, 2026
33 checks passed
@rwest rwest deleted the copilot/restore-incremental-builds-cython-extensions branch March 26, 2026 00:26
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.

Restore incremental builds for Cython extensions (make should use build_ext --inplace)

3 participants