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.
- {experimaestro-1.9.1 → experimaestro-1.10.0}/PKG-INFO +22 -29
- {experimaestro-1.9.1 → experimaestro-1.10.0}/pyproject.toml +55 -37
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/cli/filter.py +6 -1
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/launcherfinder/parser.py +7 -2
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/launcherfinder/registry.py +5 -5
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/launcherfinder/specs.py +32 -1
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_findlauncher.py +11 -4
- experimaestro-1.9.1/src/experimaestro/server/data/0c35d18bf06992036b69.woff2 +0 -0
- experimaestro-1.9.1/src/experimaestro/server/data/1815e00441357e01619e.ttf +0 -0
- experimaestro-1.9.1/src/experimaestro/server/data/219aa9140e099e6c72ed.woff2 +0 -0
- experimaestro-1.9.1/src/experimaestro/server/data/2463b90d9a316e4e5294.woff2 +0 -0
- experimaestro-1.9.1/src/experimaestro/server/data/2582b0e4bcf85eceead0.ttf +0 -0
- experimaestro-1.9.1/src/experimaestro/server/data/3a4004a46a653d4b2166.woff +0 -0
- experimaestro-1.9.1/src/experimaestro/server/data/3baa5b8f3469222b822d.woff +0 -0
- experimaestro-1.9.1/src/experimaestro/server/data/4d73cb90e394b34b7670.woff +0 -0
- experimaestro-1.9.1/src/experimaestro/server/data/4ef4218c522f1eb6b5b1.woff2 +0 -0
- experimaestro-1.9.1/src/experimaestro/server/data/5d681e2edae8c60630db.woff +0 -0
- experimaestro-1.9.1/src/experimaestro/server/data/6f420cf17cc0d7676fad.woff2 +0 -0
- experimaestro-1.9.1/src/experimaestro/server/data/89999bdf5d835c012025.woff2 +0 -0
- experimaestro-1.9.1/src/experimaestro/server/data/914997e1bdfc990d0897.ttf +0 -0
- experimaestro-1.9.1/src/experimaestro/server/data/c210719e60948b211a12.woff2 +0 -0
- experimaestro-1.9.1/src/experimaestro/server/data/c380809fd3677d7d6903.woff2 +0 -0
- experimaestro-1.9.1/src/experimaestro/server/data/f882956fd323fd322f31.woff +0 -0
- experimaestro-1.9.1/src/experimaestro/server/data/favicon.ico +0 -0
- experimaestro-1.9.1/src/experimaestro/server/data/index.css +0 -22963
- experimaestro-1.9.1/src/experimaestro/server/data/index.css.map +0 -1
- experimaestro-1.9.1/src/experimaestro/server/data/index.html +0 -27
- experimaestro-1.9.1/src/experimaestro/server/data/index.js +0 -101770
- experimaestro-1.9.1/src/experimaestro/server/data/index.js.map +0 -1
- experimaestro-1.9.1/src/experimaestro/server/data/login.html +0 -22
- experimaestro-1.9.1/src/experimaestro/server/data/manifest.json +0 -15
- {experimaestro-1.9.1 → experimaestro-1.10.0}/LICENSE +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/README.md +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/__init__.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/__main__.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/annotations.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/checkers.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/cli/__init__.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/cli/jobs.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/click.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/commandline.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/compat.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/connectors/__init__.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/connectors/local.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/connectors/ssh.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/__init__.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/arguments.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/callbacks.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/context.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/identifier.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/objects/__init__.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/objects/config.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/objects/config_utils.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/objects/config_walk.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/objects.pyi +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/serialization.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/serializers.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/types.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/core/utils.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/exceptions.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/experiments/__init__.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/experiments/cli.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/experiments/configuration.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/generators.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/huggingface.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/ipc.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/launcherfinder/__init__.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/launcherfinder/base.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/launchers/__init__.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/launchers/direct.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/launchers/oar.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/launchers/slurm/__init__.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/launchers/slurm/base.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/locking.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/mkdocs/__init__.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/mkdocs/annotations.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/mkdocs/base.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/mkdocs/metaloader.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/mkdocs/style.css +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/mypy.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/notifications.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/py.typed +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/rpyc.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/run.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/scheduler/__init__.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/scheduler/base.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/scheduler/dependencies.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/scheduler/dynamic_outputs.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/scheduler/services.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/scheduler/state.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/scheduler/workspace.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/scriptbuilder.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/server/__init__.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/settings.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/sphinx/__init__.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/sphinx/static/experimaestro.css +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/taskglobals.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/__init__.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/conftest.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/connectors/bin/executable.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/connectors/test_local.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/connectors/utils.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/core/__init__.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/core/test_generics.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/definitions_types.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/launchers/__init__.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/launchers/bin/sacct +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/launchers/bin/sbatch +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/launchers/bin/srun +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/launchers/bin/test.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/launchers/common.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/launchers/config_slurm/__init__.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/launchers/config_slurm/launchers.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/launchers/test_local.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/launchers/test_slurm.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/restart.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/restart_main.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/scripts/notifyandwait.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/scripts/waitforfile.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/task_tokens.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/tasks/__init__.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/tasks/all.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/tasks/foreign.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_checkers.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_dependencies.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_experiment.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_forward.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_identifier.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_instance.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_objects.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_outputs.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_param.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_progress.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_serializers.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_snippets.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_ssh.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_tags.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_tasks.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_tokens.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_types.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/test_validation.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/token_reschedule.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tests/utils.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tokens.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tools/__init__.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tools/diff.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tools/documentation.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/tools/jobs.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/typingutils.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/utils/__init__.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/utils/asyncio.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/utils/jobs.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/utils/jupyter.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/utils/resources.py +0 -0
- {experimaestro-1.9.1 → experimaestro-1.10.0}/src/experimaestro/utils/settings.py +0 -0
- {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.
|
|
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
|
+
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
|
|
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,<
|
|
28
|
-
Requires-Dist: fasteners (>=0.19,<
|
|
29
|
-
Requires-Dist: flask (>=2.3,<3
|
|
30
|
-
Requires-Dist: flask-socketio (>=5.3,<6
|
|
31
|
-
Requires-Dist: gevent (>=
|
|
32
|
-
Requires-Dist: gevent-websocket (>=0.10
|
|
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
|
|
35
|
-
Requires-Dist: marshmallow (>=3.20,<4
|
|
36
|
-
Requires-Dist:
|
|
37
|
-
Requires-Dist:
|
|
38
|
-
Requires-Dist:
|
|
39
|
-
Requires-Dist:
|
|
40
|
-
Requires-Dist:
|
|
41
|
-
Requires-Dist:
|
|
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
|
|
44
|
-
Requires-Dist: termcolor (>=2.3)
|
|
45
|
-
Requires-Dist: tqdm (>=4.66.1,<5
|
|
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
|
|
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
|
[](https://badge.fury.io/py/experimaestro)
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
[
|
|
1
|
+
[project]
|
|
2
2
|
name = "experimaestro"
|
|
3
|
-
authors = [
|
|
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
|
-
[
|
|
100
|
+
[project.scripts]
|
|
83
101
|
experimaestro = "experimaestro.__main__:main"
|
|
84
102
|
|
|
85
|
-
[
|
|
103
|
+
[project.entry-points."mkdocs.plugins"]
|
|
86
104
|
experimaestro = "experimaestro.mkdocs:Documentation"
|
|
87
105
|
|
|
88
|
-
[
|
|
106
|
+
[project.entry-points."experimaestro.process"]
|
|
89
107
|
local = "experimaestro.connectors.local:LocalProcess"
|
|
90
108
|
slurm = "experimaestro.launchers.slurm:BatchSlurmProcess"
|
|
91
109
|
|
|
92
|
-
[
|
|
110
|
+
[project.entry-points."experimaestro.connectors"]
|
|
93
111
|
local = "experimaestro.connectors.local:LocalConnector"
|
|
94
112
|
ssh = "experimaestro.connectors.ssh:SshConnector"
|
|
95
113
|
|
|
96
|
-
[
|
|
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.
|
|
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
|
-
|
|
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
|
|
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.
|
|
156
|
+
specs.add(parse(spec))
|
|
157
157
|
else:
|
|
158
|
-
specs.
|
|
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
|
-
|
|
64
|
-
assert isinstance(r,
|
|
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__
|
|
89
|
+
path = ResourcePathWrapper.create(f"{__package__}.launchers", "config_slurm")
|
|
83
90
|
|
|
84
91
|
assert (path / "launchers.py").is_file()
|
|
85
92
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|