experimaestro 1.9.1__tar.gz → 1.10.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.

Potentially problematic release.


This version of experimaestro might be problematic. Click here for more details.

Files changed (156) hide show
  1. {experimaestro-1.9.1 → experimaestro-1.10.0}/PKG-INFO +22 -29
  2. {experimaestro-1.9.1 → experimaestro-1.10.0}/pyproject.toml +55 -37
  3. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/cli/filter.py +6 -1
  4. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/launcherfinder/parser.py +7 -2
  5. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/launcherfinder/registry.py +5 -5
  6. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/launcherfinder/specs.py +32 -1
  7. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_findlauncher.py +11 -4
  8. experimaestro-1.9.1/src/experimaestro/server/data/0c35d18bf06992036b69.woff2 +0 -0
  9. experimaestro-1.9.1/src/experimaestro/server/data/1815e00441357e01619e.ttf +0 -0
  10. experimaestro-1.9.1/src/experimaestro/server/data/219aa9140e099e6c72ed.woff2 +0 -0
  11. experimaestro-1.9.1/src/experimaestro/server/data/2463b90d9a316e4e5294.woff2 +0 -0
  12. experimaestro-1.9.1/src/experimaestro/server/data/2582b0e4bcf85eceead0.ttf +0 -0
  13. experimaestro-1.9.1/src/experimaestro/server/data/3a4004a46a653d4b2166.woff +0 -0
  14. experimaestro-1.9.1/src/experimaestro/server/data/3baa5b8f3469222b822d.woff +0 -0
  15. experimaestro-1.9.1/src/experimaestro/server/data/4d73cb90e394b34b7670.woff +0 -0
  16. experimaestro-1.9.1/src/experimaestro/server/data/4ef4218c522f1eb6b5b1.woff2 +0 -0
  17. experimaestro-1.9.1/src/experimaestro/server/data/5d681e2edae8c60630db.woff +0 -0
  18. experimaestro-1.9.1/src/experimaestro/server/data/6f420cf17cc0d7676fad.woff2 +0 -0
  19. experimaestro-1.9.1/src/experimaestro/server/data/89999bdf5d835c012025.woff2 +0 -0
  20. experimaestro-1.9.1/src/experimaestro/server/data/914997e1bdfc990d0897.ttf +0 -0
  21. experimaestro-1.9.1/src/experimaestro/server/data/c210719e60948b211a12.woff2 +0 -0
  22. experimaestro-1.9.1/src/experimaestro/server/data/c380809fd3677d7d6903.woff2 +0 -0
  23. experimaestro-1.9.1/src/experimaestro/server/data/f882956fd323fd322f31.woff +0 -0
  24. experimaestro-1.9.1/src/experimaestro/server/data/favicon.ico +0 -0
  25. experimaestro-1.9.1/src/experimaestro/server/data/index.css +0 -22963
  26. experimaestro-1.9.1/src/experimaestro/server/data/index.css.map +0 -1
  27. experimaestro-1.9.1/src/experimaestro/server/data/index.html +0 -27
  28. experimaestro-1.9.1/src/experimaestro/server/data/index.js +0 -101770
  29. experimaestro-1.9.1/src/experimaestro/server/data/index.js.map +0 -1
  30. experimaestro-1.9.1/src/experimaestro/server/data/login.html +0 -22
  31. experimaestro-1.9.1/src/experimaestro/server/data/manifest.json +0 -15
  32. {experimaestro-1.9.1 → experimaestro-1.10.0}/LICENSE +0 -0
  33. {experimaestro-1.9.1 → experimaestro-1.10.0}/README.md +0 -0
  34. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/__init__.py +0 -0
  35. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/__main__.py +0 -0
  36. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/annotations.py +0 -0
  37. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/checkers.py +0 -0
  38. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/cli/__init__.py +0 -0
  39. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/cli/jobs.py +0 -0
  40. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/click.py +0 -0
  41. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/commandline.py +0 -0
  42. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/compat.py +0 -0
  43. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/connectors/__init__.py +0 -0
  44. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/connectors/local.py +0 -0
  45. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/connectors/ssh.py +0 -0
  46. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/__init__.py +0 -0
  47. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/arguments.py +0 -0
  48. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/callbacks.py +0 -0
  49. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/context.py +0 -0
  50. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/identifier.py +0 -0
  51. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/objects/__init__.py +0 -0
  52. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/objects/config.py +0 -0
  53. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/objects/config_utils.py +0 -0
  54. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/objects/config_walk.py +0 -0
  55. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/objects.pyi +0 -0
  56. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/serialization.py +0 -0
  57. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/serializers.py +0 -0
  58. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/types.py +0 -0
  59. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/utils.py +0 -0
  60. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/exceptions.py +0 -0
  61. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/experiments/__init__.py +0 -0
  62. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/experiments/cli.py +0 -0
  63. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/experiments/configuration.py +0 -0
  64. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/generators.py +0 -0
  65. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/huggingface.py +0 -0
  66. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/ipc.py +0 -0
  67. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/launcherfinder/__init__.py +0 -0
  68. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/launcherfinder/base.py +0 -0
  69. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/launchers/__init__.py +0 -0
  70. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/launchers/direct.py +0 -0
  71. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/launchers/oar.py +0 -0
  72. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/launchers/slurm/__init__.py +0 -0
  73. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/launchers/slurm/base.py +0 -0
  74. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/locking.py +0 -0
  75. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/mkdocs/__init__.py +0 -0
  76. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/mkdocs/annotations.py +0 -0
  77. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/mkdocs/base.py +0 -0
  78. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/mkdocs/metaloader.py +0 -0
  79. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/mkdocs/style.css +0 -0
  80. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/mypy.py +0 -0
  81. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/notifications.py +0 -0
  82. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/py.typed +0 -0
  83. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/rpyc.py +0 -0
  84. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/run.py +0 -0
  85. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/scheduler/__init__.py +0 -0
  86. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/scheduler/base.py +0 -0
  87. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/scheduler/dependencies.py +0 -0
  88. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/scheduler/dynamic_outputs.py +0 -0
  89. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/scheduler/services.py +0 -0
  90. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/scheduler/state.py +0 -0
  91. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/scheduler/workspace.py +0 -0
  92. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/scriptbuilder.py +0 -0
  93. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/server/__init__.py +0 -0
  94. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/settings.py +0 -0
  95. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/sphinx/__init__.py +0 -0
  96. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/sphinx/static/experimaestro.css +0 -0
  97. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/taskglobals.py +0 -0
  98. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/__init__.py +0 -0
  99. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/conftest.py +0 -0
  100. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/connectors/bin/executable.py +0 -0
  101. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/connectors/test_local.py +0 -0
  102. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/connectors/utils.py +0 -0
  103. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/core/__init__.py +0 -0
  104. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/core/test_generics.py +0 -0
  105. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/definitions_types.py +0 -0
  106. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/launchers/__init__.py +0 -0
  107. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/launchers/bin/sacct +0 -0
  108. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/launchers/bin/sbatch +0 -0
  109. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/launchers/bin/srun +0 -0
  110. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/launchers/bin/test.py +0 -0
  111. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/launchers/common.py +0 -0
  112. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/launchers/config_slurm/__init__.py +0 -0
  113. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/launchers/config_slurm/launchers.py +0 -0
  114. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/launchers/test_local.py +0 -0
  115. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/launchers/test_slurm.py +0 -0
  116. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/restart.py +0 -0
  117. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/restart_main.py +0 -0
  118. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/scripts/notifyandwait.py +0 -0
  119. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/scripts/waitforfile.py +0 -0
  120. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/task_tokens.py +0 -0
  121. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/tasks/__init__.py +0 -0
  122. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/tasks/all.py +0 -0
  123. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/tasks/foreign.py +0 -0
  124. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_checkers.py +0 -0
  125. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_dependencies.py +0 -0
  126. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_experiment.py +0 -0
  127. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_forward.py +0 -0
  128. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_identifier.py +0 -0
  129. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_instance.py +0 -0
  130. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_objects.py +0 -0
  131. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_outputs.py +0 -0
  132. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_param.py +0 -0
  133. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_progress.py +0 -0
  134. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_serializers.py +0 -0
  135. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_snippets.py +0 -0
  136. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_ssh.py +0 -0
  137. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_tags.py +0 -0
  138. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_tasks.py +0 -0
  139. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_tokens.py +0 -0
  140. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_types.py +0 -0
  141. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_validation.py +0 -0
  142. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/token_reschedule.py +0 -0
  143. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/utils.py +0 -0
  144. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tokens.py +0 -0
  145. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tools/__init__.py +0 -0
  146. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tools/diff.py +0 -0
  147. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tools/documentation.py +0 -0
  148. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tools/jobs.py +0 -0
  149. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/typingutils.py +0 -0
  150. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/utils/__init__.py +0 -0
  151. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/utils/asyncio.py +0 -0
  152. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/utils/jobs.py +0 -0
  153. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/utils/jupyter.py +0 -0
  154. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/utils/resources.py +0 -0
  155. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/utils/settings.py +0 -0
  156. {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/xpmutils.py +0 -0
@@ -1,52 +1,45 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: experimaestro
3
- Version: 1.9.1
3
+ Version: 1.10.0
4
4
  Summary: "Experimaestro is a computer science experiment manager"
5
5
  License: GPL-3
6
6
  Keywords: experiment manager
7
7
  Author: Benjamin Piwowarski
8
8
  Author-email: benjamin@piwowarski.fr
9
- Requires-Python: >=3.9,<4.0
9
+ Requires-Python: >=3.10
10
10
  Classifier: Development Status :: 4 - Beta
11
11
  Classifier: Intended Audience :: Science/Research
12
12
  Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
13
- Classifier: License :: Other/Proprietary License
14
13
  Classifier: Operating System :: OS Independent
15
14
  Classifier: Programming Language :: Python
16
15
  Classifier: Programming Language :: Python :: 3
17
- Classifier: Programming Language :: Python :: 3.9
18
- Classifier: Programming Language :: Python :: 3.10
19
- Classifier: Programming Language :: Python :: 3.11
20
- Classifier: Programming Language :: Python :: 3.12
21
- Classifier: Programming Language :: Python :: 3.13
22
16
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
23
17
  Requires-Dist: arpeggio (>=2,<3)
24
- Requires-Dist: attrs (>=23.1.0,<24.0.0)
18
+ Requires-Dist: attrs (>=23.1.0,<24)
25
19
  Requires-Dist: click (>=8)
26
20
  Requires-Dist: decorator (>=5,<6)
27
- Requires-Dist: docstring-parser (>=0.15,<0.16)
28
- Requires-Dist: fasteners (>=0.19,<0.20)
29
- Requires-Dist: flask (>=2.3,<3.0)
30
- Requires-Dist: flask-socketio (>=5.3,<6.0)
31
- Requires-Dist: gevent (>=24.11.1,<25.0.0)
32
- Requires-Dist: gevent-websocket (>=0.10,<0.11)
21
+ Requires-Dist: docstring-parser (>=0.15,<1)
22
+ Requires-Dist: fasteners (>=0.19,<1)
23
+ Requires-Dist: flask (>=2.3,<3)
24
+ Requires-Dist: flask-socketio (>=5.3,<6)
25
+ Requires-Dist: gevent (>=25)
26
+ Requires-Dist: gevent-websocket (>=0.10)
33
27
  Requires-Dist: huggingface-hub (>0.17)
34
- Requires-Dist: humanfriendly (>=10,<11)
35
- Requires-Dist: marshmallow (>=3.20,<4.0)
36
- Requires-Dist: omegaconf (>=2.3,<3.0)
37
- Requires-Dist: psutil (>=7)
38
- Requires-Dist: pyparsing (>=3.1,<4.0)
39
- Requires-Dist: pytools (>=2023.1.1,<2024.0.0)
40
- Requires-Dist: pyyaml (>=6.0.1,<7.0.0)
41
- Requires-Dist: requests (>=2.31,<3.0)
28
+ Requires-Dist: humanfriendly (>=10)
29
+ Requires-Dist: marshmallow (>=3.20,<4)
30
+ Requires-Dist: mkdocs (>=1.5,<2)
31
+ Requires-Dist: omegaconf (>=2.3,<3)
32
+ Requires-Dist: psutil (>=7,<8)
33
+ Requires-Dist: pyparsing (>=3.1,<4)
34
+ Requires-Dist: pytools (>=2023.1.1,<2024)
35
+ Requires-Dist: pyyaml (>=6.0.1,<7)
36
+ Requires-Dist: requests (>=2.31,<3)
42
37
  Requires-Dist: rpyc (>=5,<7)
43
- Requires-Dist: sortedcontainers (>=2.4,<3.0)
44
- Requires-Dist: termcolor (>=2.3)
45
- Requires-Dist: tqdm (>=4.66.1,<5.0.0)
38
+ Requires-Dist: sortedcontainers (>=2.4,<3)
39
+ Requires-Dist: termcolor (>=2.3,<3)
40
+ Requires-Dist: tqdm (>=4.66.1,<5)
46
41
  Requires-Dist: typing-extensions (>=4.2) ; python_version < "3.12"
47
- Requires-Dist: watchdog (>=2,<3)
48
- Project-URL: Documentation, https://experimaestro-python.readthedocs.io/
49
- Project-URL: Repository, https://github.com/experimaestro/experimaestro-python
42
+ Requires-Dist: watchdog (>=2)
50
43
  Description-Content-Type: text/markdown
51
44
 
52
45
  [![PyPI version](https://badge.fury.io/py/experimaestro.svg)](https://badge.fury.io/py/experimaestro)
@@ -1,6 +1,8 @@
1
- [tool.poetry]
1
+ [project]
2
2
  name = "experimaestro"
3
- authors = ["Benjamin Piwowarski <benjamin@piwowarski.fr>"]
3
+ authors = [
4
+ {name = "Benjamin Piwowarski", email = "benjamin@piwowarski.fr"}
5
+ ]
4
6
  description = '"Experimaestro is a computer science experiment manager"'
5
7
  readme = "README.md"
6
8
  license = "GPL-3"
@@ -20,9 +22,39 @@ include = [
20
22
  "src/experimaestro/mkdocs/style.css",
21
23
  { path="src/experimaestro/server/data/*", format=['sdist', 'wheel']}
22
24
  ]
23
- version = "1.9.1"
24
25
  repository = "https://github.com/experimaestro/experimaestro-python"
25
26
  documentation = "https://experimaestro-python.readthedocs.io/"
27
+ dynamic = []
28
+ requires-python = ">=3.10"
29
+ dependencies = [
30
+ "arpeggio >=2,<3",
31
+ "attrs >=23.1.0,<24",
32
+ "click >=8",
33
+ "decorator >=5,<6",
34
+ "docstring-parser >=0.15,<1",
35
+ "fasteners >=0.19,<1",
36
+ "flask >=2.3,<3",
37
+ "flask-socketio >=5.3,<6",
38
+ "gevent >=25",
39
+ "gevent-websocket >=0.10",
40
+ "humanfriendly >=10",
41
+ "huggingface-hub >0.17",
42
+ "marshmallow >=3.20,<4",
43
+ "mkdocs >=1.5,<2",
44
+ "omegaconf >=2.3,<3",
45
+ "psutil >=7,<8",
46
+ "pyparsing >=3.1,<4",
47
+ "pytools >=2023.1.1,<2024",
48
+ "pyyaml >=6.0.1,<7",
49
+ "requests >=2.31,<3",
50
+ "rpyc >=5,<7",
51
+ "sortedcontainers >=2.4,<3",
52
+ "termcolor >=2.3,<3",
53
+ "tqdm >=4.66.1,<5",
54
+ "typing-extensions >=4.2; python_version < \"3.12\"",
55
+ "watchdog >=2"
56
+ ]
57
+ version = "1.10.0"
26
58
 
27
59
  [tool.poetry-dynamic-versioning]
28
60
  enable = false
@@ -33,38 +65,24 @@ format-jinja = """{%- set pre = [] -%}{%- set metadata = [] -%}
33
65
  {%- if revision is not none -%}{{ pre.append("rc" + revision|string) or "" }}{%- endif -%}
34
66
  {%- if distance > 0 -%}{{ metadata.append(distance|string) or "" }}{%- endif -%}
35
67
  {{ serialize_semver(base, pre, metadata)}}"""
68
+
69
+ [tool.poetry]
70
+
71
+ [tool.poetry-dynamic-versioning.files."src/experimaestro/version.py"]
72
+ persistent-substitution = true
73
+ initial-content = """
74
+ # These version placeholders will be replaced later during substitution.
75
+ __version__ = "0.0.0"
76
+ __version_tuple__ = (0, 0, 0)
77
+ """
78
+
79
+ [tool.poetry.requires-plugins]
80
+ poetry-dynamic-versioning = { version = ">=1.0.0,<2.0.0", extras = ["plugin"] }
81
+
36
82
  [build-system]
37
83
  requires = ["poetry-core>=1.0.0", "poetry-dynamic-versioning>=1.0.0,<2.0.0"]
38
84
  build-backend = "poetry_dynamic_versioning.backend"
39
85
 
40
- [tool.poetry.dependencies]
41
- python = "^3.9"
42
- click = ">=8"
43
- omegaconf = "^2.3"
44
- typing-extensions = {version = ">=4.2", markers = "python_version < \"3.12\""}
45
- attrs = "^23.1.0"
46
- fasteners = "^0.19"
47
- pyyaml = "^6.0.1"
48
- psutil = ">=7"
49
- pytools = "^2023.1.1"
50
- tqdm = "^4.66.1"
51
- docstring-parser = "^0.15"
52
- termcolor = ">=2.3"
53
- requests = "^2.31"
54
- sortedcontainers = "^2.4"
55
- pyparsing = "^3.1"
56
- humanfriendly = "^10"
57
- huggingface-hub = ">0.17"
58
- gevent = "^24.11.1"
59
- gevent-websocket = "^0.10"
60
- flask = "^2.3"
61
- flask-socketio = "^5.3"
62
- arpeggio = "^2"
63
- watchdog = "^2"
64
- marshmallow = "^3.20"
65
- decorator = "^5"
66
- rpyc = ">=5,<7"
67
-
68
86
  [tool.poetry.group.ssh]
69
87
  optional = true
70
88
 
@@ -79,21 +97,21 @@ optional = true
79
97
  docutils = "^0.18"
80
98
  Pygments = "^2.15"
81
99
 
82
- [tool.poetry.scripts]
100
+ [project.scripts]
83
101
  experimaestro = "experimaestro.__main__:main"
84
102
 
85
- [tool.poetry.plugins."mkdocs.plugins"]
103
+ [project.entry-points."mkdocs.plugins"]
86
104
  experimaestro = "experimaestro.mkdocs:Documentation"
87
105
 
88
- [tool.poetry.plugins."experimaestro.process"]
106
+ [project.entry-points."experimaestro.process"]
89
107
  local = "experimaestro.connectors.local:LocalProcess"
90
108
  slurm = "experimaestro.launchers.slurm:BatchSlurmProcess"
91
109
 
92
- [tool.poetry.plugins."experimaestro.connectors"]
110
+ [project.entry-points."experimaestro.connectors"]
93
111
  local = "experimaestro.connectors.local:LocalConnector"
94
112
  ssh = "experimaestro.connectors.ssh:SshConnector"
95
113
 
96
- [tool.poetry.plugins."experimaestro.tokens"]
114
+ [project.entry-points."experimaestro.tokens"]
97
115
  unix = "experimaestro.tokens:CounterToken"
98
116
 
99
117
 
@@ -122,7 +140,7 @@ warn_unused_ignores = true
122
140
 
123
141
  [tool.commitizen]
124
142
  name = "cz_conventional_commits"
125
- version = "1.9.1"
143
+ version = "1.10.0"
126
144
  changelog_start_rev = "v1.0.0"
127
145
  tag_format = "v$major.$minor.$patch$prerelease"
128
146
  # update_changelog_on_bump = true
@@ -1,4 +1,5 @@
1
1
  import asyncio
2
+ import logging
2
3
  from typing import Any, Callable, Dict, List, Optional
3
4
  import pyparsing as pp
4
5
  from pathlib import Path
@@ -16,7 +17,11 @@ class JobInformation:
16
17
 
17
18
  @cached_property
18
19
  def params(self):
19
- return json.loads((self.path / "params.json").read_text())
20
+ try:
21
+ return json.loads((self.path / "params.json").read_text())
22
+ except Exception:
23
+ logging.warning("Could not load params.json in %s", self.path)
24
+ return {"tags": {}}
20
25
 
21
26
  @cached_property
22
27
  def tags(self) -> List[str]:
@@ -51,7 +51,12 @@ def cpu():
51
51
 
52
52
 
53
53
  def duration():
54
- return "duration", "=", RegExMatch(r"\d+"), RegExMatch(r"h(ours)?|d(ays)?")
54
+ return (
55
+ "duration",
56
+ "=",
57
+ RegExMatch(r"\d+"),
58
+ RegExMatch(r"h(ours?)?|d(ays?)?|m(ins?)?"),
59
+ )
55
60
 
56
61
 
57
62
  def one_spec():
@@ -67,7 +72,7 @@ def grammar():
67
72
 
68
73
  class Visitor(PTNodeVisitor):
69
74
  def visit_grammar(self, node, children):
70
- return [child for child in children]
75
+ return specs.RequirementUnion(*[child for child in children])
71
76
 
72
77
  def visit_one_spec(self, node, children):
73
78
  return reduce(lambda x, el: x & el, children)
@@ -9,7 +9,7 @@ from omegaconf import DictConfig, OmegaConf, SCMode
9
9
  import pkg_resources
10
10
  from experimaestro.utils import logger
11
11
  from .base import ConnectorConfiguration, TokenConfiguration
12
- from .specs import HostRequirement
12
+ from .specs import HostRequirement, RequirementUnion
13
13
 
14
14
  if typing.TYPE_CHECKING:
15
15
  from experimaestro.launchers import Launcher
@@ -150,18 +150,18 @@ class LauncherRegistry:
150
150
  # Parse specs
151
151
  from .parser import parse
152
152
 
153
- specs = []
153
+ specs = RequirementUnion()
154
154
  for spec in input_specs:
155
155
  if isinstance(spec, str):
156
- specs.extend(parse(spec))
156
+ specs.add(parse(spec))
157
157
  else:
158
- specs.append(spec)
158
+ specs.add(spec)
159
159
 
160
160
  # Use launcher function
161
161
  from experimaestro.launchers import Launcher
162
162
 
163
163
  if self.find_launcher_fn is not None:
164
- for spec in specs:
164
+ for spec in specs.requirements:
165
165
  if launcher := self.find_launcher_fn(spec, tags):
166
166
  assert isinstance(
167
167
  launcher, Launcher
@@ -1,4 +1,6 @@
1
+ from abc import ABC, abstractmethod
1
2
  import logging
3
+ import math
2
4
  from attr import Factory
3
5
  from attrs import define
4
6
  from copy import copy, deepcopy
@@ -88,7 +90,7 @@ class MatchRequirement:
88
90
  requirement: "HostSimpleRequirement"
89
91
 
90
92
 
91
- class HostRequirement:
93
+ class HostRequirement(ABC):
92
94
  """A requirement must be a disjunction of host requirements"""
93
95
 
94
96
  requirements: List["HostSimpleRequirement"]
@@ -103,6 +105,12 @@ class HostRequirement:
103
105
  def match(self, host: HostSpecification) -> Optional[MatchRequirement]:
104
106
  raise NotImplementedError()
105
107
 
108
+ @abstractmethod
109
+ def multiply_duration(self, coefficient: float) -> "HostRequirement":
110
+ """Returns a new HostRequirement with a duration multiplied by the
111
+ provided coefficient"""
112
+ ...
113
+
106
114
 
107
115
  class RequirementUnion(HostRequirement):
108
116
  """Ordered list of simple host requirements -- the first one is the priority"""
@@ -112,6 +120,16 @@ class RequirementUnion(HostRequirement):
112
120
  def __init__(self, *requirements: "HostSimpleRequirement"):
113
121
  self.requirements = list(requirements)
114
122
 
123
+ def add(self, requirement: "HostRequirement"):
124
+ match requirement:
125
+ case HostSimpleRequirement():
126
+ self.requirements.extend(*requirement.requirements)
127
+ case RequirementUnion():
128
+ self.requirements.append(requirement)
129
+ case _:
130
+ raise RuntimeError("Cannot handle type %s", type(requirement))
131
+ return self
132
+
115
133
  def match(self, host: HostSpecification) -> Optional[MatchRequirement]:
116
134
  """Returns the matched requirement (if any)"""
117
135
 
@@ -126,6 +144,14 @@ class RequirementUnion(HostRequirement):
126
144
 
127
145
  return argmax
128
146
 
147
+ def multiply_duration(self, coefficient: float) -> "RequirementUnion":
148
+ return RequirementUnion(
149
+ *[r.multiply_duration(coefficient) for r in self.requirements]
150
+ )
151
+
152
+ def __repr__(self):
153
+ return " | ".join(repr(r) for r in self.requirements)
154
+
129
155
 
130
156
  class HostSimpleRequirement(HostRequirement):
131
157
  """Simple host requirement"""
@@ -142,6 +168,11 @@ class HostSimpleRequirement(HostRequirement):
142
168
  def __repr__(self):
143
169
  return f"Req(cpu={self.cpu}, cuda={self.cuda_gpus}, duration={self.duration})"
144
170
 
171
+ def multiply_duration(self, coefficient: float) -> "HostSimpleRequirement":
172
+ r = HostSimpleRequirement(self)
173
+ r.duration = math.ceil(self.duration * coefficient)
174
+ return r
175
+
145
176
  def __init__(self, *reqs: "HostSimpleRequirement"):
146
177
  self.cuda_gpus = []
147
178
  self.cpu = CPUSpecification(0, 0)
@@ -3,9 +3,9 @@ from experimaestro.launcherfinder.specs import (
3
3
  CPUSpecification,
4
4
  CudaSpecification,
5
5
  HostSpecification,
6
+ RequirementUnion,
6
7
  cpu,
7
8
  cuda_gpu,
8
- HostSimpleRequirement,
9
9
  )
10
10
  from experimaestro.launcherfinder import parse
11
11
  from humanfriendly import parse_size, parse_timespan
@@ -39,6 +39,11 @@ def test_findlauncher_specs():
39
39
  assert m is not None
40
40
  assert m.requirement is req2
41
41
 
42
+ # Multiply
43
+ req2 = req.multiply_duration(2)
44
+ for i in range(2):
45
+ assert req2.requirements[i].duration == req.requirements[i].duration * 2
46
+
42
47
 
43
48
  def test_findlauncher_specs_gpu_mem():
44
49
  host = HostSpecification(
@@ -60,8 +65,10 @@ def test_findlauncher_specs_gpu_mem():
60
65
 
61
66
 
62
67
  def test_findlauncher_parse():
63
- (r,) = parse("""duration=4 d & cuda(mem=4G) * 2 & cpu(mem=400M, cores=4)""")
64
- assert isinstance(r, HostSimpleRequirement)
68
+ r = parse("""duration=4 d & cuda(mem=4G) * 2 & cpu(mem=400M, cores=4)""")
69
+ assert isinstance(r, RequirementUnion)
70
+
71
+ r = r.requirements[0]
65
72
 
66
73
  assert len(r.cuda_gpus) == 2
67
74
  assert r.cuda_gpus[0].memory == parse_size("4G")
@@ -79,7 +86,7 @@ def slurm_constraint_split(constraint: str):
79
86
 
80
87
 
81
88
  def test_findlauncher_slurm():
82
- path = ResourcePathWrapper.create(f"{__package__ }.launchers", "config_slurm")
89
+ path = ResourcePathWrapper.create(f"{__package__}.launchers", "config_slurm")
83
90
 
84
91
  assert (path / "launchers.py").is_file()
85
92