From c04bccf82c2bf0b40fbfc353f9843cbade00958b Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 17:43:56 +0000 Subject: [PATCH 1/4] Optimize membership checks inside `balanceTranslator` with sets Converts `x.name not in [y.name for y in ...]` list comprehensions into pre-computed sets before the main loop logic within `balanceTranslator`. This changes the complexity of the membership check from O(N) to O(1), turning the overall operation from O(N*M) to O(N+M). Co-authored-by: akutuva21 <44119804+akutuva21@users.noreply.github.com> --- .jules/bolt.md | 3 +++ bionetgen/atomizer/writer/bnglWriter.py | 6 ++++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .jules/bolt.md diff --git a/.jules/bolt.md b/.jules/bolt.md new file mode 100644 index 00000000..e40c97b3 --- /dev/null +++ b/.jules/bolt.md @@ -0,0 +1,3 @@ +## 2024-05-19 - Optimize `balanceTranslator` membership testing +**Learning:** Checking membership inside a loop with a freshly-constructed list comprehension gives an O(N * M) performance impact. Pre-computing a set of keys can reduce it to O(N + M). +**Action:** When finding a list membership test `x not in [y for y in Y]` inside a loop, elevate the inner list creation out of the loop and convert it to a `set` to reduce time complexity to O(1). diff --git a/bionetgen/atomizer/writer/bnglWriter.py b/bionetgen/atomizer/writer/bnglWriter.py index d6a446e7..252606ae 100644 --- a/bionetgen/atomizer/writer/bnglWriter.py +++ b/bionetgen/atomizer/writer/bnglWriter.py @@ -116,16 +116,18 @@ def balanceTranslator(reactant, product, translator): for rMolecule in rMolecules: for pMolecule in pMolecules: if rMolecule.name == pMolecule.name: + p_names = {y.name for y in pMolecule.components} + r_names = {y.name for y in rMolecule.components} overFlowingComponents = [ x for x in rMolecule.components - if x.name not in [y.name for y in pMolecule.components] + if x.name not in p_names ] overFlowingComponents.extend( [ x for x in pMolecule.components - if x.name not in [y.name for y in rMolecule.components] + if x.name not in r_names ] ) rMolecule.removeComponents(overFlowingComponents) From 110d65d7816a4bdb5ff07e0e9c752676c39ace3e Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 18:27:57 +0000 Subject: [PATCH 2/4] Optimize membership checks inside `balanceTranslator` with sets Converts `x.name not in [y.name for y in ...]` list comprehensions into pre-computed sets before the main loop logic within `balanceTranslator`. This changes the complexity of the membership check from O(N) to O(1), turning the overall operation from O(N*M) to O(N+M). This commit also includes formatting fixes by black. Co-authored-by: akutuva21 <44119804+akutuva21@users.noreply.github.com> --- bionetgen/atomizer/writer/bnglWriter.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/bionetgen/atomizer/writer/bnglWriter.py b/bionetgen/atomizer/writer/bnglWriter.py index 252606ae..8bc50b08 100644 --- a/bionetgen/atomizer/writer/bnglWriter.py +++ b/bionetgen/atomizer/writer/bnglWriter.py @@ -119,16 +119,10 @@ def balanceTranslator(reactant, product, translator): p_names = {y.name for y in pMolecule.components} r_names = {y.name for y in rMolecule.components} overFlowingComponents = [ - x - for x in rMolecule.components - if x.name not in p_names + x for x in rMolecule.components if x.name not in p_names ] overFlowingComponents.extend( - [ - x - for x in pMolecule.components - if x.name not in r_names - ] + [x for x in pMolecule.components if x.name not in r_names] ) rMolecule.removeComponents(overFlowingComponents) pMolecule.removeComponents(overFlowingComponents) From 8664afd050579701ae5e93e30f2e5b8e207c99d8 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 18:33:14 +0000 Subject: [PATCH 3/4] Optimize membership checks inside `balanceTranslator` with sets Converts `x.name not in [y.name for y in ...]` list comprehensions into pre-computed sets before the main loop logic within `balanceTranslator`. This changes the complexity of the membership check from O(N) to O(1), turning the overall operation from O(N*M) to O(N+M). This commit also includes formatting fixes by black. Co-authored-by: akutuva21 <44119804+akutuva21@users.noreply.github.com> From 34e56a44a556752c986f16b0a33172ab8f2caeec Mon Sep 17 00:00:00 2001 From: akutuva21 Date: Mon, 13 Apr 2026 10:12:26 -0400 Subject: [PATCH 4/4] chore: PR #21 remove forbidden artifacts and run black --- .gitignore | 2 ++ .jules/bolt.md | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) delete mode 100644 .jules/bolt.md diff --git a/.gitignore b/.gitignore index 39aa9026..f9bf9c80 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,5 @@ temp_testing/* build dist Issues/rule_keywords/test_DeleteMolecules_changed.bngl +.jules/ +__pycache__/ diff --git a/.jules/bolt.md b/.jules/bolt.md deleted file mode 100644 index e40c97b3..00000000 --- a/.jules/bolt.md +++ /dev/null @@ -1,3 +0,0 @@ -## 2024-05-19 - Optimize `balanceTranslator` membership testing -**Learning:** Checking membership inside a loop with a freshly-constructed list comprehension gives an O(N * M) performance impact. Pre-computing a set of keys can reduce it to O(N + M). -**Action:** When finding a list membership test `x not in [y for y in Y]` inside a loop, elevate the inner list creation out of the loop and convert it to a `set` to reduce time complexity to O(1).