From 7101168ff9ba98d1dae82596bf7d27ce6543c078 Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Thu, 28 May 2026 16:36:05 -0600 Subject: [PATCH 01/12] [Feature] Accelerate the comparison for batched --- src/executorlib/standalone/batched.py | 12 +++++------- .../task_scheduler/interactive/dependency.py | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/executorlib/standalone/batched.py b/src/executorlib/standalone/batched.py index addd4ab56..1ce65bbfc 100644 --- a/src/executorlib/standalone/batched.py +++ b/src/executorlib/standalone/batched.py @@ -1,26 +1,24 @@ from concurrent.futures import Future -def batched_futures(lst: list[Future], skip_lst: list[list], n: int) -> list[list]: +def batched_futures(lst: list[Future], skip_set: set, n: int) -> list[list]: """ Batch n completed future objects. If the number of completed futures is smaller than n and the end of the batch is - not reached yet, then an empty list is returned. If n future objects are done, which are not included in the skip_lst + not reached yet, then an empty list is returned. If n future objects are done, which are not included in the skip_set then they are returned as batch. Args: lst (list): list of all future objects - skip_lst (list): list of previous batches of future objects + skip_set (set): flat set of individual results already assigned to previous batches n (int): batch size Returns: list: results of the batched futures """ - skipped_elements_lst = [item for items in skip_lst for item in items] - done_lst = [] - n_expected = min(n, len(lst) - len(skipped_elements_lst)) + n_expected = min(n, len(lst) - len(skip_set)) for v in lst: - if v.done() and v.result() not in skipped_elements_lst: + if v.done() and v.result() not in skip_set: done_lst.append(v.result()) if len(done_lst) == n_expected: return done_lst diff --git a/src/executorlib/task_scheduler/interactive/dependency.py b/src/executorlib/task_scheduler/interactive/dependency.py index fe24c3787..404e03a76 100644 --- a/src/executorlib/task_scheduler/interactive/dependency.py +++ b/src/executorlib/task_scheduler/interactive/dependency.py @@ -346,7 +346,7 @@ def _update_waiting_task( done_lst = batched_futures( lst=task_wait_dict["kwargs"]["lst"], n=task_wait_dict["kwargs"]["n"], - skip_lst=[f.result() for f in task_wait_dict["kwargs"]["skip_lst"]], + skip_set={item for f in task_wait_dict["kwargs"]["skip_lst"] for item in f.result()}, ) if len(done_lst) == 0: wait_tmp_lst.append(task_wait_dict) From 4d8052ca0ff72a5f07ce75cc65b4e765cd0dab43 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 28 May 2026 22:37:13 +0000 Subject: [PATCH 02/12] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/executorlib/task_scheduler/interactive/dependency.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/executorlib/task_scheduler/interactive/dependency.py b/src/executorlib/task_scheduler/interactive/dependency.py index 404e03a76..b56ccfb76 100644 --- a/src/executorlib/task_scheduler/interactive/dependency.py +++ b/src/executorlib/task_scheduler/interactive/dependency.py @@ -346,7 +346,11 @@ def _update_waiting_task( done_lst = batched_futures( lst=task_wait_dict["kwargs"]["lst"], n=task_wait_dict["kwargs"]["n"], - skip_set={item for f in task_wait_dict["kwargs"]["skip_lst"] for item in f.result()}, + skip_set={ + item + for f in task_wait_dict["kwargs"]["skip_lst"] + for item in f.result() + }, ) if len(done_lst) == 0: wait_tmp_lst.append(task_wait_dict) From 85682bd8bbe6c09e7d9dad634b06196071e28f7e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 28 May 2026 22:50:11 +0000 Subject: [PATCH 03/12] Fix test parameter name: skip_lst -> skip_set with correct data structure --- src/executorlib/_version.py | 33 +++++++++++++++------------ tests/unit/standalone/test_batched.py | 10 ++++---- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/executorlib/_version.py b/src/executorlib/_version.py index 0e58bba20..0acfe6e42 100644 --- a/src/executorlib/_version.py +++ b/src/executorlib/_version.py @@ -1,21 +1,24 @@ -# file generated by setuptools-scm +# file generated by vcs-versioning # don't change, don't track in version control +from __future__ import annotations -__all__ = ["__version__", "__version_tuple__", "version", "version_tuple"] - -TYPE_CHECKING = False -if TYPE_CHECKING: - from typing import Tuple - from typing import Union - - VERSION_TUPLE = Tuple[Union[int, str], ...] -else: - VERSION_TUPLE = object +__all__ = [ + "__version__", + "__version_tuple__", + "version", + "version_tuple", + "__commit_id__", + "commit_id", +] version: str __version__: str -__version_tuple__: VERSION_TUPLE -version_tuple: VERSION_TUPLE +__version_tuple__: tuple[int | str, ...] +version_tuple: tuple[int | str, ...] +commit_id: str | None +__commit_id__: str | None + +__version__ = version = '0.1.dev3+g6cf91047c.d20260528' +__version_tuple__ = version_tuple = (0, 1, 'dev3', 'g6cf91047c.d20260528') -__version__ = version = "0.0.1" -__version_tuple__ = version_tuple = (0, 0, 1) +__commit_id__ = commit_id = None diff --git a/tests/unit/standalone/test_batched.py b/tests/unit/standalone/test_batched.py index 9b811d26a..1675c41f6 100644 --- a/tests/unit/standalone/test_batched.py +++ b/tests/unit/standalone/test_batched.py @@ -10,14 +10,14 @@ def test_batched_futures(self): f = Future() f.set_result(i) lst.append(f) - self.assertEqual(batched_futures(lst=lst, n=3, skip_lst=[]), [0, 1, 2]) - self.assertEqual(batched_futures(lst=lst, skip_lst=[[0, 1, 2]], n=3), [3, 4, 5]) - self.assertEqual(batched_futures(lst=lst, skip_lst=[[0, 1, 2], [3, 4, 5]], n=3), [6, 7, 8]) - self.assertEqual(batched_futures(lst=lst, skip_lst=[[0, 1, 2], [3, 4, 5], [6, 7, 8]], n=3), [9]) + self.assertEqual(batched_futures(lst=lst, n=3, skip_set=set()), [0, 1, 2]) + self.assertEqual(batched_futures(lst=lst, skip_set={0, 1, 2}, n=3), [3, 4, 5]) + self.assertEqual(batched_futures(lst=lst, skip_set={0, 1, 2, 3, 4, 5}, n=3), [6, 7, 8]) + self.assertEqual(batched_futures(lst=lst, skip_set={0, 1, 2, 3, 4, 5, 6, 7, 8}, n=3), [9]) def test_batched_futures_not_finished(self): lst = [] for _ in list(range(10)): f = Future() lst.append(f) - self.assertEqual(batched_futures(lst=lst, n=3, skip_lst=[]), []) + self.assertEqual(batched_futures(lst=lst, n=3, skip_set=set()), []) From f71b624314d1fb2c74d29c52a2d36bc6b0d246f1 Mon Sep 17 00:00:00 2001 From: pyiron-runner Date: Thu, 28 May 2026 22:52:30 +0000 Subject: [PATCH 04/12] Format black --- src/executorlib/_version.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/executorlib/_version.py b/src/executorlib/_version.py index 0acfe6e42..f9c48bb0c 100644 --- a/src/executorlib/_version.py +++ b/src/executorlib/_version.py @@ -18,7 +18,7 @@ commit_id: str | None __commit_id__: str | None -__version__ = version = '0.1.dev3+g6cf91047c.d20260528' -__version_tuple__ = version_tuple = (0, 1, 'dev3', 'g6cf91047c.d20260528') +__version__ = version = "0.1.dev3+g6cf91047c.d20260528" +__version_tuple__ = version_tuple = (0, 1, "dev3", "g6cf91047c.d20260528") __commit_id__ = commit_id = None From 21ba86330827bdc52668554d4f0564175b7daecc Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Thu, 28 May 2026 16:55:06 -0600 Subject: [PATCH 05/12] Change versioning method and update version info Updated versioning system from vcs-versioning to setuptools-scm and modified version details. --- src/executorlib/_version.py | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/executorlib/_version.py b/src/executorlib/_version.py index f9c48bb0c..0e58bba20 100644 --- a/src/executorlib/_version.py +++ b/src/executorlib/_version.py @@ -1,24 +1,21 @@ -# file generated by vcs-versioning +# file generated by setuptools-scm # don't change, don't track in version control -from __future__ import annotations -__all__ = [ - "__version__", - "__version_tuple__", - "version", - "version_tuple", - "__commit_id__", - "commit_id", -] +__all__ = ["__version__", "__version_tuple__", "version", "version_tuple"] + +TYPE_CHECKING = False +if TYPE_CHECKING: + from typing import Tuple + from typing import Union + + VERSION_TUPLE = Tuple[Union[int, str], ...] +else: + VERSION_TUPLE = object version: str __version__: str -__version_tuple__: tuple[int | str, ...] -version_tuple: tuple[int | str, ...] -commit_id: str | None -__commit_id__: str | None - -__version__ = version = "0.1.dev3+g6cf91047c.d20260528" -__version_tuple__ = version_tuple = (0, 1, "dev3", "g6cf91047c.d20260528") +__version_tuple__: VERSION_TUPLE +version_tuple: VERSION_TUPLE -__commit_id__ = commit_id = None +__version__ = version = "0.0.1" +__version_tuple__ = version_tuple = (0, 0, 1) From 210b084fe737638c868322d5012def4f934ee0e0 Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Wed, 10 Jun 2026 17:37:52 +0200 Subject: [PATCH 06/12] Update dependency.py --- src/executorlib/task_scheduler/interactive/dependency.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/executorlib/task_scheduler/interactive/dependency.py b/src/executorlib/task_scheduler/interactive/dependency.py index b56ccfb76..569a5f95b 100644 --- a/src/executorlib/task_scheduler/interactive/dependency.py +++ b/src/executorlib/task_scheduler/interactive/dependency.py @@ -347,7 +347,7 @@ def _update_waiting_task( lst=task_wait_dict["kwargs"]["lst"], n=task_wait_dict["kwargs"]["n"], skip_set={ - item + id(item) for f in task_wait_dict["kwargs"]["skip_lst"] for item in f.result() }, From b1306c4af3aaac3fadba7112814235e43f844891 Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Wed, 10 Jun 2026 17:40:44 +0200 Subject: [PATCH 07/12] Update test_batched.py --- tests/unit/standalone/test_batched.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/unit/standalone/test_batched.py b/tests/unit/standalone/test_batched.py index 1675c41f6..2b68daa5a 100644 --- a/tests/unit/standalone/test_batched.py +++ b/tests/unit/standalone/test_batched.py @@ -11,9 +11,9 @@ def test_batched_futures(self): f.set_result(i) lst.append(f) self.assertEqual(batched_futures(lst=lst, n=3, skip_set=set()), [0, 1, 2]) - self.assertEqual(batched_futures(lst=lst, skip_set={0, 1, 2}, n=3), [3, 4, 5]) - self.assertEqual(batched_futures(lst=lst, skip_set={0, 1, 2, 3, 4, 5}, n=3), [6, 7, 8]) - self.assertEqual(batched_futures(lst=lst, skip_set={0, 1, 2, 3, 4, 5, 6, 7, 8}, n=3), [9]) + self.assertEqual(batched_futures(lst=lst, skip_set={id(0), id(1), id(2)}, n=3), [3, 4, 5]) + self.assertEqual(batched_futures(lst=lst, skip_set={id(0), id(1), id(2), id(3), id(4), id(5)}, n=3), [6, 7, 8]) + self.assertEqual(batched_futures(lst=lst, skip_set={id(0), id(1), id(2), id(3), id(4), id(5), id(6), id(7), id(8)}, n=3), [9]) def test_batched_futures_not_finished(self): lst = [] From f3f4ed6cffad23c35b5a3465911d4199748fa759 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Jan=C3=9Fen?= Date: Wed, 10 Jun 2026 17:49:01 +0200 Subject: [PATCH 08/12] revert to nested list --- src/executorlib/standalone/batched.py | 10 ++++++++-- .../task_scheduler/interactive/dependency.py | 6 +----- tests/unit/standalone/test_batched.py | 10 +++++++--- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/executorlib/standalone/batched.py b/src/executorlib/standalone/batched.py index bf6afa005..d2a3c1e84 100644 --- a/src/executorlib/standalone/batched.py +++ b/src/executorlib/standalone/batched.py @@ -1,7 +1,7 @@ from concurrent.futures import Future -def batched_futures(lst: list[Future], skip_set: set, n: int) -> list[list]: +def batched_futures(lst: list[Future], nested_skip_lst: list[list], n: int) -> list[list]: """ Batch n completed future objects. If the number of completed futures is smaller than n and the end of the batch is not reached yet, then an empty list is returned. If n future objects are done, which are not included in the skip_set @@ -9,12 +9,18 @@ def batched_futures(lst: list[Future], skip_set: set, n: int) -> list[list]: Args: lst (list): list of all future objects - skip_set (set): flat set of individual results already assigned to previous batches + nested_skip_lst (list): nest list of individual results already assigned to previous batches n (int): batch size Returns: list: results of the batched futures """ + skip_set = { + id(item) + for f in nested_skip_lst + for item in f.result() + } + done_lst = [] n_expected = min(n, len(lst) - len(skip_set)) for v in lst: diff --git a/src/executorlib/task_scheduler/interactive/dependency.py b/src/executorlib/task_scheduler/interactive/dependency.py index 569a5f95b..fff3f5ec2 100644 --- a/src/executorlib/task_scheduler/interactive/dependency.py +++ b/src/executorlib/task_scheduler/interactive/dependency.py @@ -346,11 +346,7 @@ def _update_waiting_task( done_lst = batched_futures( lst=task_wait_dict["kwargs"]["lst"], n=task_wait_dict["kwargs"]["n"], - skip_set={ - id(item) - for f in task_wait_dict["kwargs"]["skip_lst"] - for item in f.result() - }, + skip_set=task_wait_dict["kwargs"]["skip_lst"], ) if len(done_lst) == 0: wait_tmp_lst.append(task_wait_dict) diff --git a/tests/unit/standalone/test_batched.py b/tests/unit/standalone/test_batched.py index 2b68daa5a..6afb28b3f 100644 --- a/tests/unit/standalone/test_batched.py +++ b/tests/unit/standalone/test_batched.py @@ -10,10 +10,14 @@ def test_batched_futures(self): f = Future() f.set_result(i) lst.append(f) + batched_lst = [Future(), Future(), Future()] + batched_lst[0].set_result([0, 1, 2]) + batched_lst[1].set_result([3, 4, 5]) + batched_lst[2].set_result([6, 7, 8]) self.assertEqual(batched_futures(lst=lst, n=3, skip_set=set()), [0, 1, 2]) - self.assertEqual(batched_futures(lst=lst, skip_set={id(0), id(1), id(2)}, n=3), [3, 4, 5]) - self.assertEqual(batched_futures(lst=lst, skip_set={id(0), id(1), id(2), id(3), id(4), id(5)}, n=3), [6, 7, 8]) - self.assertEqual(batched_futures(lst=lst, skip_set={id(0), id(1), id(2), id(3), id(4), id(5), id(6), id(7), id(8)}, n=3), [9]) + self.assertEqual(batched_futures(lst=lst, skip_set=batched_lst[:1], n=3), [3, 4, 5]) + self.assertEqual(batched_futures(lst=lst, skip_set=batched_lst[:2], n=3), [6, 7, 8]) + self.assertEqual(batched_futures(lst=lst, skip_set=batched_lst, n=3), [9]) def test_batched_futures_not_finished(self): lst = [] From ee9a627d325e57649a1c0a70227926b7aaedb4b2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 15:49:22 +0000 Subject: [PATCH 09/12] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/executorlib/standalone/batched.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/executorlib/standalone/batched.py b/src/executorlib/standalone/batched.py index d2a3c1e84..b65c5496b 100644 --- a/src/executorlib/standalone/batched.py +++ b/src/executorlib/standalone/batched.py @@ -1,7 +1,9 @@ from concurrent.futures import Future -def batched_futures(lst: list[Future], nested_skip_lst: list[list], n: int) -> list[list]: +def batched_futures( + lst: list[Future], nested_skip_lst: list[list], n: int +) -> list[list]: """ Batch n completed future objects. If the number of completed futures is smaller than n and the end of the batch is not reached yet, then an empty list is returned. If n future objects are done, which are not included in the skip_set @@ -15,11 +17,7 @@ def batched_futures(lst: list[Future], nested_skip_lst: list[list], n: int) -> l Returns: list: results of the batched futures """ - skip_set = { - id(item) - for f in nested_skip_lst - for item in f.result() - } + skip_set = {id(item) for f in nested_skip_lst for item in f.result()} done_lst = [] n_expected = min(n, len(lst) - len(skip_set)) From 1a26e90a36a1115b01952aed6b4bf3a8080fa44b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Jan=C3=9Fen?= Date: Wed, 10 Jun 2026 17:54:29 +0200 Subject: [PATCH 10/12] fixes --- .../task_scheduler/interactive/dependency.py | 2 +- tests/unit/standalone/test_batched.py | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/executorlib/task_scheduler/interactive/dependency.py b/src/executorlib/task_scheduler/interactive/dependency.py index fff3f5ec2..349b3f1c7 100644 --- a/src/executorlib/task_scheduler/interactive/dependency.py +++ b/src/executorlib/task_scheduler/interactive/dependency.py @@ -346,7 +346,7 @@ def _update_waiting_task( done_lst = batched_futures( lst=task_wait_dict["kwargs"]["lst"], n=task_wait_dict["kwargs"]["n"], - skip_set=task_wait_dict["kwargs"]["skip_lst"], + nested_skip_lst=task_wait_dict["kwargs"]["skip_lst"], ) if len(done_lst) == 0: wait_tmp_lst.append(task_wait_dict) diff --git a/tests/unit/standalone/test_batched.py b/tests/unit/standalone/test_batched.py index 6afb28b3f..31e3d578c 100644 --- a/tests/unit/standalone/test_batched.py +++ b/tests/unit/standalone/test_batched.py @@ -14,14 +14,14 @@ def test_batched_futures(self): batched_lst[0].set_result([0, 1, 2]) batched_lst[1].set_result([3, 4, 5]) batched_lst[2].set_result([6, 7, 8]) - self.assertEqual(batched_futures(lst=lst, n=3, skip_set=set()), [0, 1, 2]) - self.assertEqual(batched_futures(lst=lst, skip_set=batched_lst[:1], n=3), [3, 4, 5]) - self.assertEqual(batched_futures(lst=lst, skip_set=batched_lst[:2], n=3), [6, 7, 8]) - self.assertEqual(batched_futures(lst=lst, skip_set=batched_lst, n=3), [9]) + self.assertEqual(batched_futures(lst=lst, n=3, nested_skip_lst=set()), [0, 1, 2]) + self.assertEqual(batched_futures(lst=lst, nested_skip_lst=batched_lst[:1], n=3), [3, 4, 5]) + self.assertEqual(batched_futures(lst=lst, nested_skip_lst=batched_lst[:2], n=3), [6, 7, 8]) + self.assertEqual(batched_futures(lst=lst, nested_skip_lst=batched_lst, n=3), [9]) def test_batched_futures_not_finished(self): lst = [] for _ in list(range(10)): f = Future() lst.append(f) - self.assertEqual(batched_futures(lst=lst, n=3, skip_set=set()), []) + self.assertEqual(batched_futures(lst=lst, n=3, nested_skip_lst=set()), []) From 10f4f3cb5293f3f8eb3248ded6420ef43456410a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Jan=C3=9Fen?= Date: Wed, 10 Jun 2026 17:57:09 +0200 Subject: [PATCH 11/12] fix type hint --- src/executorlib/standalone/batched.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/executorlib/standalone/batched.py b/src/executorlib/standalone/batched.py index b65c5496b..8ac24271d 100644 --- a/src/executorlib/standalone/batched.py +++ b/src/executorlib/standalone/batched.py @@ -2,7 +2,7 @@ def batched_futures( - lst: list[Future], nested_skip_lst: list[list], n: int + lst: list[Future], nested_skip_lst: list[list[Future]], n: int ) -> list[list]: """ Batch n completed future objects. If the number of completed futures is smaller than n and the end of the batch is From dbf685257a1b0571370a29b7c832153bf07ce44c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Jan=C3=9Fen?= Date: Wed, 10 Jun 2026 18:01:18 +0200 Subject: [PATCH 12/12] nested list with future --- src/executorlib/standalone/batched.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/executorlib/standalone/batched.py b/src/executorlib/standalone/batched.py index 8ac24271d..3c44c0c75 100644 --- a/src/executorlib/standalone/batched.py +++ b/src/executorlib/standalone/batched.py @@ -2,7 +2,7 @@ def batched_futures( - lst: list[Future], nested_skip_lst: list[list[Future]], n: int + lst: list[Future], nested_skip_lst: list[Future[list]], n: int ) -> list[list]: """ Batch n completed future objects. If the number of completed futures is smaller than n and the end of the batch is