executorlib 1.10.4__tar.gz → 1.11.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. {executorlib-1.10.4 → executorlib-1.11.0}/PKG-INFO +20 -20
  2. {executorlib-1.10.4 → executorlib-1.11.0}/pyproject.toml +23 -23
  3. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/_version.py +2 -2
  4. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/executor/flux.py +4 -0
  5. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/executor/single.py +4 -0
  6. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/executor/slurm.py +4 -0
  7. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/standalone/inputcheck.py +17 -0
  8. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/task_scheduler/interactive/spawner_pysqa.py +7 -1
  9. {executorlib-1.10.4 → executorlib-1.11.0}/.gitignore +0 -0
  10. {executorlib-1.10.4 → executorlib-1.11.0}/LICENSE +0 -0
  11. {executorlib-1.10.4 → executorlib-1.11.0}/README.md +0 -0
  12. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/__init__.py +0 -0
  13. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/api.py +0 -0
  14. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/backend/__init__.py +0 -0
  15. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/backend/cache_parallel.py +0 -0
  16. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/backend/cache_serial.py +0 -0
  17. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/backend/interactive_parallel.py +0 -0
  18. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/backend/interactive_serial.py +0 -0
  19. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/executor/__init__.py +0 -0
  20. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/executor/base.py +0 -0
  21. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/standalone/__init__.py +0 -0
  22. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/standalone/batched.py +0 -0
  23. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/standalone/command.py +0 -0
  24. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/standalone/command_pysqa.py +0 -0
  25. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/standalone/error.py +0 -0
  26. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/standalone/hdf.py +0 -0
  27. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/standalone/interactive/__init__.py +0 -0
  28. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/standalone/interactive/arguments.py +0 -0
  29. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/standalone/interactive/backend.py +0 -0
  30. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/standalone/interactive/communication.py +0 -0
  31. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/standalone/interactive/spawner.py +0 -0
  32. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/standalone/queue.py +0 -0
  33. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/standalone/select.py +0 -0
  34. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/standalone/serialize.py +0 -0
  35. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/standalone/validate.py +0 -0
  36. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/task_scheduler/__init__.py +0 -0
  37. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/task_scheduler/base.py +0 -0
  38. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/task_scheduler/file/__init__.py +0 -0
  39. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/task_scheduler/file/backend.py +0 -0
  40. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/task_scheduler/file/shared.py +0 -0
  41. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/task_scheduler/file/spawner_pysqa.py +0 -0
  42. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/task_scheduler/file/spawner_subprocess.py +0 -0
  43. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/task_scheduler/file/task_scheduler.py +0 -0
  44. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/task_scheduler/interactive/__init__.py +0 -0
  45. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/task_scheduler/interactive/blockallocation.py +0 -0
  46. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/task_scheduler/interactive/dependency.py +0 -0
  47. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/task_scheduler/interactive/dependency_plot.py +0 -0
  48. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/task_scheduler/interactive/onetoone.py +0 -0
  49. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/task_scheduler/interactive/shared.py +0 -0
  50. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/task_scheduler/interactive/spawner_flux.py +0 -0
  51. {executorlib-1.10.4 → executorlib-1.11.0}/src/executorlib/task_scheduler/interactive/spawner_slurm.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: executorlib
3
- Version: 1.10.4
3
+ Version: 1.11.0
4
4
  Summary: Up-scale python functions for high performance computing (HPC) with executorlib.
5
5
  Project-URL: Homepage, https://github.com/pyiron/executorlib
6
6
  Project-URL: Documentation, https://executorlib.readthedocs.io
@@ -48,32 +48,32 @@ Classifier: Programming Language :: Python :: 3.13
48
48
  Classifier: Programming Language :: Python :: 3.14
49
49
  Classifier: Topic :: Scientific/Engineering :: Physics
50
50
  Requires-Python: <3.15,>3.9
51
- Requires-Dist: cloudpickle<=3.1.2,>=2.0.0
52
- Requires-Dist: pyzmq<=27.2.0,>=25.0.0
51
+ Requires-Dist: cloudpickle<3.2.0,>=2.0.0
52
+ Requires-Dist: pyzmq<27.3.0,>=25.0.0
53
53
  Provides-Extra: all
54
- Requires-Dist: h5py<=3.16.0,>=3.6.0; extra == 'all'
55
- Requires-Dist: ipython<=9.9.0,>=7.33.0; extra == 'all'
56
- Requires-Dist: mpi4py<=4.1.2,>=3.1.4; extra == 'all'
57
- Requires-Dist: networkx<=3.6.1,>=2.8.8; extra == 'all'
58
- Requires-Dist: pydantic<=2.14.1,>=2.5.3; extra == 'all'
59
- Requires-Dist: pygraphviz<=2.0.3,>=1.10; extra == 'all'
60
- Requires-Dist: pysqa==1.0.1; extra == 'all'
54
+ Requires-Dist: h5py<3.17.0,>=3.6.0; extra == 'all'
55
+ Requires-Dist: ipython<9.10.0,>=7.33.0; extra == 'all'
56
+ Requires-Dist: mpi4py<4.2.0,>=3.1.4; extra == 'all'
57
+ Requires-Dist: networkx<3.7.0,>=2.8.8; extra == 'all'
58
+ Requires-Dist: pydantic<2.15.0,>=2.5.3; extra == 'all'
59
+ Requires-Dist: pygraphviz<2.1.0,>=1.10; extra == 'all'
60
+ Requires-Dist: pysqa==1.1.0; extra == 'all'
61
61
  Provides-Extra: cache
62
- Requires-Dist: h5py<=3.16.0,>=3.6.0; extra == 'cache'
62
+ Requires-Dist: h5py<3.17.0,>=3.6.0; extra == 'cache'
63
63
  Provides-Extra: cluster
64
- Requires-Dist: h5py<=3.16.0,>=3.6.0; extra == 'cluster'
65
- Requires-Dist: pysqa==1.0.1; extra == 'cluster'
64
+ Requires-Dist: h5py<3.17.0,>=3.6.0; extra == 'cluster'
65
+ Requires-Dist: pysqa==1.1.0; extra == 'cluster'
66
66
  Provides-Extra: graph
67
- Requires-Dist: networkx<=3.6.1,>=2.8.8; extra == 'graph'
68
- Requires-Dist: pygraphviz<=2.0.3,>=1.10; extra == 'graph'
67
+ Requires-Dist: networkx<3.7.0,>=2.8.8; extra == 'graph'
68
+ Requires-Dist: pygraphviz<2.1.0,>=1.10; extra == 'graph'
69
69
  Provides-Extra: graphnotebook
70
- Requires-Dist: ipython<=9.9.0,>=7.33.0; extra == 'graphnotebook'
71
- Requires-Dist: networkx<=3.6.1,>=2.8.8; extra == 'graphnotebook'
72
- Requires-Dist: pygraphviz<=2.0.3,>=1.10; extra == 'graphnotebook'
70
+ Requires-Dist: ipython<9.10.0,>=7.33.0; extra == 'graphnotebook'
71
+ Requires-Dist: networkx<3.7.0,>=2.8.8; extra == 'graphnotebook'
72
+ Requires-Dist: pygraphviz<2.1.0,>=1.10; extra == 'graphnotebook'
73
73
  Provides-Extra: mpi
74
- Requires-Dist: mpi4py<=4.1.2,>=3.1.4; extra == 'mpi'
74
+ Requires-Dist: mpi4py<4.2.0,>=3.1.4; extra == 'mpi'
75
75
  Provides-Extra: validation
76
- Requires-Dist: pydantic<=2.14.1,>=2.5.3; extra == 'validation'
76
+ Requires-Dist: pydantic<2.15.0,>=2.5.3; extra == 'validation'
77
77
  Description-Content-Type: text/markdown
78
78
 
79
79
  # executorlib
@@ -1,9 +1,9 @@
1
1
  [build-system]
2
2
  requires = [
3
- "hatchling>=1.27.0,<=1.32.4",
4
- "hatch-vcs==0.5.0",
5
- "cloudpickle>=2.0.0,<=3.1.2",
6
- "pyzmq>=25.0.0,<=27.2.0",
3
+ "hatchling>=1.27.0,<1.33.0",
4
+ "hatch-vcs>=0.4.0,<0.6.0",
5
+ "cloudpickle>=2.0.0,<3.2.0",
6
+ "pyzmq>=25.0.0,<27.3.0",
7
7
  ]
8
8
  build-backend = "hatchling.build"
9
9
 
@@ -30,8 +30,8 @@ classifiers = [
30
30
  "Programming Language :: Python :: 3.14",
31
31
  ]
32
32
  dependencies = [
33
- "cloudpickle>=2.0.0,<=3.1.2",
34
- "pyzmq>=25.0.0,<=27.2.0",
33
+ "cloudpickle>=2.0.0,<3.2.0",
34
+ "pyzmq>=25.0.0,<27.3.0",
35
35
  ]
36
36
  dynamic = ["version"]
37
37
 
@@ -41,32 +41,32 @@ Documentation = "https://executorlib.readthedocs.io"
41
41
  Repository = "https://github.com/pyiron/executorlib"
42
42
 
43
43
  [project.optional-dependencies]
44
- cache = ["h5py>=3.6.0,<=3.16.0"]
44
+ cache = ["h5py>=3.6.0,<3.17.0"]
45
45
  graph = [
46
- "pygraphviz>=1.10,<=2.0.3",
47
- "networkx>=2.8.8,<=3.6.1",
46
+ "pygraphviz>=1.10,<2.1.0",
47
+ "networkx>=2.8.8,<3.7.0",
48
48
  ]
49
49
  graphnotebook = [
50
- "pygraphviz>=1.10,<=2.0.3",
51
- "networkx>=2.8.8,<=3.6.1",
52
- "ipython>=7.33.0,<=9.9.0",
50
+ "pygraphviz>=1.10,<2.1.0",
51
+ "networkx>=2.8.8,<3.7.0",
52
+ "ipython>=7.33.0,<9.10.0",
53
53
  ]
54
- mpi = ["mpi4py>=3.1.4,<=4.1.2"]
54
+ mpi = ["mpi4py>=3.1.4,<4.2.0"]
55
55
  cluster = [
56
- "pysqa==1.0.1",
57
- "h5py>=3.6.0,<=3.16.0",
56
+ "pysqa==1.1.0",
57
+ "h5py>=3.6.0,<3.17.0",
58
58
  ]
59
59
  validation = [
60
- "pydantic>=2.5.3,<=2.14.1",
60
+ "pydantic>=2.5.3,<2.15.0",
61
61
  ]
62
62
  all = [
63
- "mpi4py>=3.1.4,<=4.1.2",
64
- "pysqa==1.0.1",
65
- "h5py>=3.6.0,<=3.16.0",
66
- "pydantic>=2.5.3,<=2.14.1",
67
- "pygraphviz>=1.10,<=2.0.3",
68
- "networkx>=2.8.8,<=3.6.1",
69
- "ipython>=7.33.0,<=9.9.0",
63
+ "mpi4py>=3.1.4,<4.2.0",
64
+ "pysqa==1.1.0",
65
+ "h5py>=3.6.0,<3.17.0",
66
+ "pydantic>=2.5.3,<2.15.0",
67
+ "pygraphviz>=1.10,<2.1.0",
68
+ "networkx>=2.8.8,<3.7.0",
69
+ "ipython>=7.33.0,<9.10.0",
70
70
  ]
71
71
 
72
72
  [tool.ruff]
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.10.4'
22
- __version_tuple__ = version_tuple = (1, 10, 4)
21
+ __version__ = version = '1.11.0'
22
+ __version_tuple__ = version_tuple = (1, 11, 0)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -4,6 +4,7 @@ from executorlib.executor.base import BaseExecutor
4
4
  from executorlib.standalone.inputcheck import (
5
5
  check_command_line_argument_lst,
6
6
  check_init_function,
7
+ check_init_function_with_cache,
7
8
  check_log_obj_size,
8
9
  check_oversubscribe,
9
10
  check_plot_dependency_graph,
@@ -580,6 +581,9 @@ def create_flux_executor(
580
581
  executor_kwargs["hostname_localhost"] = hostname_localhost
581
582
  executor_kwargs["log_obj_size"] = log_obj_size
582
583
  check_init_function(block_allocation=block_allocation, init_function=init_function)
584
+ check_init_function_with_cache(
585
+ init_function=init_function, cache_directory=cache_directory
586
+ )
583
587
  check_pmi(backend="flux_allocation", pmi=pmi_mode)
584
588
  check_oversubscribe(
585
589
  oversubscribe=executor_kwargs.get("openmpi_oversubscribe", False)
@@ -5,6 +5,7 @@ from executorlib.standalone.inputcheck import (
5
5
  check_command_line_argument_lst,
6
6
  check_gpus_per_worker,
7
7
  check_init_function,
8
+ check_init_function_with_cache,
8
9
  check_plot_dependency_graph,
9
10
  check_refresh_rate,
10
11
  check_restart_limit,
@@ -511,6 +512,9 @@ def create_single_node_executor(
511
512
  executor_kwargs["log_obj_size"] = log_obj_size
512
513
 
513
514
  check_init_function(block_allocation=block_allocation, init_function=init_function)
515
+ check_init_function_with_cache(
516
+ init_function=init_function, cache_directory=cache_directory
517
+ )
514
518
  check_gpus_per_worker(gpus_per_worker=executor_kwargs.get("gpus_per_core", 0))
515
519
  check_command_line_argument_lst(
516
520
  command_line_argument_lst=executor_kwargs.get("slurm_cmd_args", [])
@@ -3,6 +3,7 @@ from typing import Callable, Optional, Union
3
3
  from executorlib.executor.base import BaseExecutor
4
4
  from executorlib.standalone.inputcheck import (
5
5
  check_init_function,
6
+ check_init_function_with_cache,
6
7
  check_log_obj_size,
7
8
  check_plot_dependency_graph,
8
9
  check_refresh_rate,
@@ -552,6 +553,9 @@ def create_slurm_executor(
552
553
  executor_kwargs["log_obj_size"] = log_obj_size
553
554
  executor_kwargs["pmi_mode"] = pmi_mode
554
555
  check_init_function(block_allocation=block_allocation, init_function=init_function)
556
+ check_init_function_with_cache(
557
+ init_function=init_function, cache_directory=cache_directory
558
+ )
555
559
  check_wait_on_shutdown(wait_on_shutdown=wait)
556
560
  if block_allocation:
557
561
  executor_kwargs["init_function"] = init_function
@@ -138,6 +138,23 @@ def check_init_function(
138
138
  raise ValueError("")
139
139
 
140
140
 
141
+ def check_init_function_with_cache(
142
+ init_function: Optional[Callable], cache_directory: Optional[str]
143
+ ) -> None:
144
+ """
145
+ Check if init_function and cache_directory are both set, and raise a warning if they are. The cache key is
146
+ computed from the submitted function and its arguments only, so it does not reflect the state set by the
147
+ init_function, which can lead to stale results being returned from the cache.
148
+ """
149
+ if init_function is not None and cache_directory is not None:
150
+ warn(
151
+ "The init_function and the cache_directory are incompatible: the cache key does not include the "
152
+ "state set by the init_function, so functions which depend on this state may return stale results "
153
+ "from the cache. See https://github.com/pyiron/executorlib/issues/1084",
154
+ stacklevel=2,
155
+ )
156
+
157
+
141
158
  def check_max_workers_and_cores(
142
159
  max_workers: Optional[int], max_cores: Optional[int]
143
160
  ) -> None:
@@ -6,7 +6,10 @@ from typing import Callable, Optional
6
6
  from pysqa import QueueAdapter
7
7
 
8
8
  from executorlib.standalone.command_pysqa import pysqa_execute_command, pysqa_terminate
9
- from executorlib.standalone.inputcheck import validate_number_of_cores
9
+ from executorlib.standalone.inputcheck import (
10
+ check_init_function_with_cache,
11
+ validate_number_of_cores,
12
+ )
10
13
  from executorlib.standalone.interactive.spawner import (
11
14
  BaseSpawner,
12
15
  set_current_directory_in_environment,
@@ -233,6 +236,9 @@ def create_pysqa_block_allocation_scheduler(
233
236
  backend: Optional[str] = None,
234
237
  validator: Callable = validate_resource_dict,
235
238
  ):
239
+ check_init_function_with_cache(
240
+ init_function=init_function, cache_directory=cache_directory
241
+ )
236
242
  if executor_kwargs is None:
237
243
  executor_kwargs = {}
238
244
  cores_per_worker = executor_kwargs.get("cores", 1)
File without changes
File without changes
File without changes