experimaestro 1.5.1__py3-none-any.whl → 2.0.0a8__py3-none-any.whl
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/__init__.py +14 -4
- experimaestro/__main__.py +3 -423
- experimaestro/annotations.py +14 -4
- experimaestro/cli/__init__.py +311 -0
- experimaestro/{filter.py → cli/filter.py} +23 -9
- experimaestro/cli/jobs.py +268 -0
- experimaestro/cli/progress.py +269 -0
- experimaestro/click.py +0 -35
- experimaestro/commandline.py +3 -7
- experimaestro/connectors/__init__.py +29 -14
- experimaestro/connectors/local.py +19 -10
- experimaestro/connectors/ssh.py +27 -8
- experimaestro/core/arguments.py +45 -3
- experimaestro/core/callbacks.py +52 -0
- experimaestro/core/context.py +8 -9
- experimaestro/core/identifier.py +310 -0
- experimaestro/core/objects/__init__.py +44 -0
- experimaestro/core/{objects.py → objects/config.py} +399 -772
- experimaestro/core/objects/config_utils.py +58 -0
- experimaestro/core/objects/config_walk.py +151 -0
- experimaestro/core/objects.pyi +15 -45
- experimaestro/core/serialization.py +63 -9
- experimaestro/core/serializers.py +1 -8
- experimaestro/core/types.py +104 -66
- experimaestro/experiments/cli.py +154 -72
- experimaestro/experiments/configuration.py +10 -1
- experimaestro/generators.py +6 -1
- experimaestro/ipc.py +4 -1
- experimaestro/launcherfinder/__init__.py +1 -1
- experimaestro/launcherfinder/base.py +2 -18
- experimaestro/launcherfinder/parser.py +8 -3
- experimaestro/launcherfinder/registry.py +52 -140
- experimaestro/launcherfinder/specs.py +49 -10
- experimaestro/launchers/direct.py +0 -47
- experimaestro/launchers/slurm/base.py +54 -14
- experimaestro/mkdocs/__init__.py +1 -1
- experimaestro/mkdocs/base.py +6 -8
- experimaestro/notifications.py +38 -12
- experimaestro/progress.py +406 -0
- experimaestro/run.py +24 -3
- experimaestro/scheduler/__init__.py +18 -1
- experimaestro/scheduler/base.py +108 -808
- experimaestro/scheduler/dynamic_outputs.py +184 -0
- experimaestro/scheduler/experiment.py +387 -0
- experimaestro/scheduler/jobs.py +475 -0
- experimaestro/scheduler/signal_handler.py +32 -0
- experimaestro/scheduler/state.py +75 -0
- experimaestro/scheduler/workspace.py +27 -8
- experimaestro/scriptbuilder.py +18 -3
- experimaestro/server/__init__.py +36 -5
- experimaestro/server/data/1815e00441357e01619e.ttf +0 -0
- experimaestro/server/data/2463b90d9a316e4e5294.woff2 +0 -0
- experimaestro/server/data/2582b0e4bcf85eceead0.ttf +0 -0
- experimaestro/server/data/89999bdf5d835c012025.woff2 +0 -0
- experimaestro/server/data/914997e1bdfc990d0897.ttf +0 -0
- experimaestro/server/data/c210719e60948b211a12.woff2 +0 -0
- experimaestro/server/data/index.css +5187 -5068
- experimaestro/server/data/index.css.map +1 -1
- experimaestro/server/data/index.js +68887 -68064
- experimaestro/server/data/index.js.map +1 -1
- experimaestro/settings.py +45 -5
- experimaestro/sphinx/__init__.py +7 -17
- experimaestro/taskglobals.py +7 -2
- experimaestro/tests/core/__init__.py +0 -0
- experimaestro/tests/core/test_generics.py +206 -0
- experimaestro/tests/definitions_types.py +5 -3
- experimaestro/tests/launchers/bin/sbatch +34 -7
- experimaestro/tests/launchers/bin/srun +5 -0
- experimaestro/tests/launchers/common.py +17 -5
- experimaestro/tests/launchers/config_slurm/launchers.py +25 -0
- experimaestro/tests/restart.py +10 -5
- experimaestro/tests/tasks/all.py +23 -10
- experimaestro/tests/tasks/foreign.py +2 -4
- experimaestro/tests/test_checkers.py +2 -2
- experimaestro/tests/test_dependencies.py +11 -17
- experimaestro/tests/test_experiment.py +73 -0
- experimaestro/tests/test_file_progress.py +425 -0
- experimaestro/tests/test_file_progress_integration.py +477 -0
- experimaestro/tests/test_findlauncher.py +12 -5
- experimaestro/tests/test_forward.py +5 -5
- experimaestro/tests/test_generators.py +93 -0
- experimaestro/tests/test_identifier.py +182 -158
- experimaestro/tests/test_instance.py +19 -27
- experimaestro/tests/test_objects.py +13 -20
- experimaestro/tests/test_outputs.py +6 -6
- experimaestro/tests/test_param.py +68 -30
- experimaestro/tests/test_progress.py +4 -4
- experimaestro/tests/test_serializers.py +24 -64
- experimaestro/tests/test_ssh.py +7 -0
- experimaestro/tests/test_tags.py +50 -21
- experimaestro/tests/test_tasks.py +42 -51
- experimaestro/tests/test_tokens.py +11 -8
- experimaestro/tests/test_types.py +24 -21
- experimaestro/tests/test_validation.py +67 -110
- experimaestro/tests/token_reschedule.py +1 -1
- experimaestro/tokens.py +24 -13
- experimaestro/tools/diff.py +8 -1
- experimaestro/typingutils.py +20 -11
- experimaestro/utils/asyncio.py +6 -2
- experimaestro/utils/multiprocessing.py +44 -0
- experimaestro/utils/resources.py +11 -3
- {experimaestro-1.5.1.dist-info → experimaestro-2.0.0a8.dist-info}/METADATA +28 -36
- experimaestro-2.0.0a8.dist-info/RECORD +166 -0
- {experimaestro-1.5.1.dist-info → experimaestro-2.0.0a8.dist-info}/WHEEL +1 -1
- {experimaestro-1.5.1.dist-info → experimaestro-2.0.0a8.dist-info}/entry_points.txt +0 -4
- experimaestro/launchers/slurm/cli.py +0 -29
- experimaestro/launchers/slurm/configuration.py +0 -597
- experimaestro/scheduler/environment.py +0 -94
- experimaestro/server/data/016b4a6cdced82ab3aa1.ttf +0 -0
- experimaestro/server/data/50701fbb8177c2dde530.ttf +0 -0
- experimaestro/server/data/878f31251d960bd6266f.woff2 +0 -0
- experimaestro/server/data/b041b1fa4fe241b23445.woff2 +0 -0
- experimaestro/server/data/b6879d41b0852f01ed5b.woff2 +0 -0
- experimaestro/server/data/d75e3fd1eb12e9bd6655.ttf +0 -0
- experimaestro/tests/launchers/config_slurm/launchers.yaml +0 -134
- experimaestro/utils/yaml.py +0 -202
- experimaestro-1.5.1.dist-info/RECORD +0 -148
- {experimaestro-1.5.1.dist-info → experimaestro-2.0.0a8.dist-info/licenses}/LICENSE +0 -0
experimaestro/tokens.py
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
"""Tokens are special types of dependency controlling the access to
|
|
1
|
+
"""Tokens are special types of dependency controlling the access to
|
|
2
2
|
a computational resource (e.g. number of launched jobs, etc.)
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
5
|
from dataclasses import dataclass
|
|
6
6
|
import sys
|
|
7
7
|
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
from omegaconf import DictConfig
|
|
8
10
|
from experimaestro.core.objects import Config
|
|
9
11
|
import fasteners
|
|
10
12
|
import threading
|
|
@@ -14,7 +16,6 @@ from typing import Dict
|
|
|
14
16
|
from experimaestro.launcherfinder.base import TokenConfiguration
|
|
15
17
|
|
|
16
18
|
from experimaestro.launcherfinder.registry import LauncherRegistry
|
|
17
|
-
from experimaestro.utils.yaml import YAMLDict
|
|
18
19
|
|
|
19
20
|
from .ipc import ipcom
|
|
20
21
|
from .locking import Lock, LockError
|
|
@@ -58,6 +59,8 @@ class CounterTokenLock(Lock):
|
|
|
58
59
|
|
|
59
60
|
|
|
60
61
|
class CounterTokenDependency(Dependency):
|
|
62
|
+
"""A dependency onto a token"""
|
|
63
|
+
|
|
61
64
|
def __init__(self, token: "CounterToken", count: int):
|
|
62
65
|
super().__init__(token)
|
|
63
66
|
self._token = token
|
|
@@ -65,6 +68,7 @@ class CounterTokenDependency(Dependency):
|
|
|
65
68
|
|
|
66
69
|
@property
|
|
67
70
|
def name(self):
|
|
71
|
+
"""The (file) name for this dependency, when taken"""
|
|
68
72
|
return f"{self.target.identifier}.token"
|
|
69
73
|
|
|
70
74
|
def status(self) -> DependencyStatus:
|
|
@@ -87,7 +91,7 @@ class TokenFile:
|
|
|
87
91
|
try:
|
|
88
92
|
self.path = path
|
|
89
93
|
with path.open("rt") as fp:
|
|
90
|
-
count, self.uri = [
|
|
94
|
+
count, self.uri = [line.strip() for line in fp.readlines()]
|
|
91
95
|
self.count = int(count)
|
|
92
96
|
except Exception:
|
|
93
97
|
logging.exception("Error while reading %s", self.path)
|
|
@@ -164,7 +168,7 @@ class CounterToken(Token, FileSystemEventHandler):
|
|
|
164
168
|
- TIMESTAMP.token contains (1) the number of tokens (2) the job URI
|
|
165
169
|
"""
|
|
166
170
|
|
|
167
|
-
"""Maps
|
|
171
|
+
"""Maps token keys to CounterToken instances"""
|
|
168
172
|
TOKENS: Dict[str, "CounterToken"] = {}
|
|
169
173
|
|
|
170
174
|
@staticmethod
|
|
@@ -183,13 +187,16 @@ class CounterToken(Token, FileSystemEventHandler):
|
|
|
183
187
|
|
|
184
188
|
@staticmethod
|
|
185
189
|
def init_registry(registry: LauncherRegistry):
|
|
186
|
-
registry.register_token(
|
|
190
|
+
registry.register_token(
|
|
191
|
+
"countertoken",
|
|
192
|
+
DictConfig({}, key_type=str, element_type=CounterConfiguration),
|
|
193
|
+
)
|
|
187
194
|
|
|
188
195
|
def __init__(self, name: str, path: Path, count: int, force=True):
|
|
189
196
|
"""[summary]
|
|
190
197
|
|
|
191
198
|
Arguments:
|
|
192
|
-
path {Path} -- The file path of the token
|
|
199
|
+
path {Path} -- The file path of the token directory
|
|
193
200
|
count {int} -- Number of tokens (overrides previous definitions)
|
|
194
201
|
force -- If the token has already been created, force to write the maximum
|
|
195
202
|
number of tokens
|
|
@@ -294,6 +301,9 @@ class CounterToken(Token, FileSystemEventHandler):
|
|
|
294
301
|
tokenfile = TokenFile(path)
|
|
295
302
|
tokenfile.watch()
|
|
296
303
|
self.cache[path.name] = tokenfile
|
|
304
|
+
except FileNotFoundError:
|
|
305
|
+
# We did not find the token file... just ignore
|
|
306
|
+
pass
|
|
297
307
|
except Exception:
|
|
298
308
|
logger.exception("Uncaught exception in on_modified handler")
|
|
299
309
|
raise
|
|
@@ -332,13 +342,18 @@ class CounterToken(Token, FileSystemEventHandler):
|
|
|
332
342
|
for dependency in dependents:
|
|
333
343
|
dependency.check()
|
|
334
344
|
|
|
345
|
+
# A modified dependency not in cache
|
|
335
346
|
elif path.name.endswith(".token") and path.name not in self.cache:
|
|
336
347
|
with self.lock:
|
|
337
348
|
if path.name not in self.cache:
|
|
338
349
|
logger.debug("Token file not in cache %s", path.name)
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
350
|
+
try:
|
|
351
|
+
tokenfile = TokenFile(path)
|
|
352
|
+
tokenfile.watch()
|
|
353
|
+
self.cache[path.name] = tokenfile
|
|
354
|
+
except FileNotFoundError:
|
|
355
|
+
# Well, the file did not exist anymore...
|
|
356
|
+
pass
|
|
342
357
|
except Exception:
|
|
343
358
|
logger.exception("Uncaught exception in on_modified handler")
|
|
344
359
|
raise
|
|
@@ -456,7 +471,3 @@ class CounterConfiguration(TokenConfiguration):
|
|
|
456
471
|
from experimaestro.connectors.local import LocalConnector
|
|
457
472
|
|
|
458
473
|
return LocalConnector.instance().createtoken(identifier, self.tokens)
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
class CounterTokenConfiguration(YAMLDict[CounterConfiguration]):
|
|
462
|
-
pass
|
experimaestro/tools/diff.py
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import importlib
|
|
1
2
|
from itertools import chain
|
|
2
3
|
from typing import Dict, Any
|
|
3
4
|
from pathlib import Path
|
|
4
5
|
import json
|
|
6
|
+
from src.experimaestro.core.objects.config_utils import getqualattr
|
|
5
7
|
from termcolor import colored
|
|
6
8
|
|
|
7
9
|
|
|
@@ -42,6 +44,11 @@ def build_value(data, store: Store):
|
|
|
42
44
|
elif t == "path.serialized":
|
|
43
45
|
# Again, do not return anything (won't change the identifier)
|
|
44
46
|
return None
|
|
47
|
+
elif t == "enum":
|
|
48
|
+
module = importlib.import_module(data["module"])
|
|
49
|
+
enumClass = getqualattr(module, data["enum"])
|
|
50
|
+
return enumClass[data["value"]]
|
|
51
|
+
|
|
45
52
|
elif t is None:
|
|
46
53
|
return {key: build_value(value, store) for key, value in data.items()}
|
|
47
54
|
assert False, f"Data type {t} not handled"
|
|
@@ -71,7 +78,7 @@ def load(path: Path):
|
|
|
71
78
|
|
|
72
79
|
|
|
73
80
|
def print_diff(path: str, conf1: Any, conf2: Any):
|
|
74
|
-
if type(conf1)
|
|
81
|
+
if type(conf1) is not type(conf2):
|
|
75
82
|
print(f"[{colored(path, 'red')}] {conf1} and {conf2} of different types")
|
|
76
83
|
|
|
77
84
|
if isinstance(conf1, ObjectProxy) and isinstance(conf2, ObjectProxy):
|
experimaestro/typingutils.py
CHANGED
|
@@ -6,16 +6,18 @@ if sys.version_info.major == 3:
|
|
|
6
6
|
if sys.version_info.minor < 11:
|
|
7
7
|
from typing import _collect_type_vars as _collect_parameters
|
|
8
8
|
else:
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
from typing import
|
|
9
|
+
|
|
10
|
+
def _collect_parameters(bases):
|
|
11
|
+
"""Collect type parameters from generic bases"""
|
|
12
|
+
parameters = []
|
|
13
|
+
for base in bases:
|
|
14
|
+
if hasattr(base, "__parameters__"):
|
|
15
|
+
parameters.extend(base.__parameters__)
|
|
16
|
+
return tuple(parameters)
|
|
17
|
+
|
|
18
|
+
# from typing import _collect_parameters
|
|
19
|
+
|
|
20
|
+
from typing import _AnnotatedAlias as AnnotatedAlias, get_args, get_origin
|
|
19
21
|
|
|
20
22
|
GenericAlias = typing._GenericAlias
|
|
21
23
|
|
|
@@ -26,6 +28,13 @@ def isgenericalias(typehint):
|
|
|
26
28
|
return isinstance(typehint, GenericAlias)
|
|
27
29
|
|
|
28
30
|
|
|
31
|
+
def get_union(typehint):
|
|
32
|
+
"""Return the list of types of a union (or the type itself if it is not an union)"""
|
|
33
|
+
if isgenericalias(typehint) and typehint.__origin__ == typing.Union:
|
|
34
|
+
return typehint.__args__
|
|
35
|
+
return None
|
|
36
|
+
|
|
37
|
+
|
|
29
38
|
def get_optional(typehint):
|
|
30
39
|
if isgenericalias(typehint) and typehint.__origin__ == typing.Union:
|
|
31
40
|
if len(typehint.__args__) == 2:
|
|
@@ -62,7 +71,7 @@ def get_type(typehint):
|
|
|
62
71
|
while True:
|
|
63
72
|
if t := get_optional(typehint):
|
|
64
73
|
typehint = t
|
|
65
|
-
if
|
|
74
|
+
if is_annotated(typehint):
|
|
66
75
|
typehint = get_args(typehint)[0]
|
|
67
76
|
else:
|
|
68
77
|
break
|
experimaestro/utils/asyncio.py
CHANGED
|
@@ -10,8 +10,12 @@ def asyncThreadcheck(name, func, *args, **kwargs) -> asyncio.Future:
|
|
|
10
10
|
|
|
11
11
|
def dowait():
|
|
12
12
|
logging.debug("Running %s", func)
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
try:
|
|
14
|
+
result = func(*args, **kwargs)
|
|
15
|
+
logging.debug("Got result from %s", func)
|
|
16
|
+
except Exception:
|
|
17
|
+
logging.exception("Got an error in the thread")
|
|
18
|
+
raise
|
|
15
19
|
loop.call_soon_threadsafe(future.set_result, result)
|
|
16
20
|
|
|
17
21
|
# Start thread
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import multiprocessing as mp
|
|
3
|
+
import time
|
|
4
|
+
import os
|
|
5
|
+
import signal
|
|
6
|
+
import threading
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def delayed_shutdown(delay=60, *, exit_code=1, grace_period=5):
|
|
10
|
+
"""After *delay*'s try a graceful stop, then SIGKILL anything left.
|
|
11
|
+
|
|
12
|
+
:param delay: Delay in seconds before killing
|
|
13
|
+
:param grace_period: Delay in seconds before force-killing a child process
|
|
14
|
+
:param exit_code: The exit code to use
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def _killer():
|
|
18
|
+
time.sleep(delay)
|
|
19
|
+
|
|
20
|
+
logging.info("Stall dectected – killing all subprocesses")
|
|
21
|
+
|
|
22
|
+
# 1️⃣ Try graceful termination
|
|
23
|
+
for p in mp.active_children():
|
|
24
|
+
# sends SIGTERM / TerminateProcess
|
|
25
|
+
p.terminate()
|
|
26
|
+
|
|
27
|
+
alive = mp.active_children()
|
|
28
|
+
deadline = time.time() + grace_period
|
|
29
|
+
while alive and time.time() < deadline:
|
|
30
|
+
alive = [p for p in alive if p.is_alive()]
|
|
31
|
+
time.sleep(0.1)
|
|
32
|
+
|
|
33
|
+
# 2️⃣ Anything still alive? Nuke it.
|
|
34
|
+
for p in alive:
|
|
35
|
+
try:
|
|
36
|
+
os.kill(p.pid, signal.SIGKILL)
|
|
37
|
+
except OSError:
|
|
38
|
+
pass
|
|
39
|
+
|
|
40
|
+
# 3️⃣ Finally kill the parent
|
|
41
|
+
os.kill(os.getpid(), signal.SIGKILL)
|
|
42
|
+
|
|
43
|
+
# Start the thread (non blocking)
|
|
44
|
+
threading.Thread(target=_killer, daemon=True).start()
|
experimaestro/utils/resources.py
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
from contextlib import contextmanager
|
|
2
|
+
from os import PathLike
|
|
2
3
|
from pathlib import Path
|
|
3
4
|
from typing import Union
|
|
4
5
|
from importlib import resources
|
|
5
6
|
from experimaestro.compat import cached_property
|
|
6
7
|
|
|
7
8
|
|
|
8
|
-
class ResourcePathWrapper:
|
|
9
|
+
class ResourcePathWrapper(PathLike):
|
|
9
10
|
"""Simple wrapper for resource path"""
|
|
10
11
|
|
|
11
12
|
def __init__(self, path: Path):
|
|
@@ -23,12 +24,19 @@ class ResourcePathWrapper:
|
|
|
23
24
|
parents = [s.name for s in reversed(self.path.parents)][1:]
|
|
24
25
|
return ".".join(parents)
|
|
25
26
|
|
|
26
|
-
@
|
|
27
|
+
@cached_property
|
|
27
28
|
def name(self):
|
|
28
29
|
return self.path.name
|
|
29
30
|
|
|
30
31
|
def is_file(self):
|
|
31
|
-
return
|
|
32
|
+
return any(
|
|
33
|
+
traversable.name == self.name and traversable.is_file()
|
|
34
|
+
for traversable in resources.files(self.package).iterdir()
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
def __fspath__(self):
|
|
38
|
+
"""Return the file system path representation of the object"""
|
|
39
|
+
return resources.as_file(resources.files(self.package) / self.name)
|
|
32
40
|
|
|
33
41
|
@contextmanager
|
|
34
42
|
def open(self, *args, **kwargs):
|
|
@@ -1,54 +1,46 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: experimaestro
|
|
3
|
-
Version:
|
|
3
|
+
Version: 2.0.0a8
|
|
4
4
|
Summary: "Experimaestro is a computer science experiment manager"
|
|
5
|
-
Home-page: https://github.com/experimaestro/experimaestro-python
|
|
6
5
|
License: GPL-3
|
|
6
|
+
License-File: LICENSE
|
|
7
7
|
Keywords: experiment manager
|
|
8
8
|
Author: Benjamin Piwowarski
|
|
9
9
|
Author-email: benjamin@piwowarski.fr
|
|
10
|
-
Requires-Python: >=3.
|
|
10
|
+
Requires-Python: >=3.10
|
|
11
11
|
Classifier: Development Status :: 4 - Beta
|
|
12
12
|
Classifier: Intended Audience :: Science/Research
|
|
13
13
|
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
|
|
14
|
-
Classifier: License :: Other/Proprietary License
|
|
15
14
|
Classifier: Operating System :: OS Independent
|
|
16
15
|
Classifier: Programming Language :: Python
|
|
17
16
|
Classifier: Programming Language :: Python :: 3
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
20
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
21
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
22
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
23
17
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
24
18
|
Requires-Dist: arpeggio (>=2,<3)
|
|
25
|
-
Requires-Dist: attrs (>=23.1.0,<24
|
|
19
|
+
Requires-Dist: attrs (>=23.1.0,<24)
|
|
26
20
|
Requires-Dist: click (>=8)
|
|
27
21
|
Requires-Dist: decorator (>=5,<6)
|
|
28
|
-
Requires-Dist: docstring-parser (>=0.15,<
|
|
29
|
-
Requires-Dist:
|
|
30
|
-
Requires-Dist:
|
|
31
|
-
Requires-Dist: flask (>=
|
|
32
|
-
Requires-Dist:
|
|
33
|
-
Requires-Dist: gevent (>=
|
|
34
|
-
Requires-Dist: gevent-websocket (>=0.10,<0.11)
|
|
22
|
+
Requires-Dist: docstring-parser (>=0.15,<1)
|
|
23
|
+
Requires-Dist: fasteners (>=0.19,<1)
|
|
24
|
+
Requires-Dist: flask (>=2.3,<3)
|
|
25
|
+
Requires-Dist: flask-socketio (>=5.3,<6)
|
|
26
|
+
Requires-Dist: gevent (>=25)
|
|
27
|
+
Requires-Dist: gevent-websocket (>=0.10)
|
|
35
28
|
Requires-Dist: huggingface-hub (>0.17)
|
|
36
|
-
Requires-Dist: humanfriendly (>=10
|
|
37
|
-
Requires-Dist: marshmallow (>=3.20,<4
|
|
38
|
-
Requires-Dist:
|
|
39
|
-
Requires-Dist:
|
|
40
|
-
Requires-Dist:
|
|
41
|
-
Requires-Dist:
|
|
42
|
-
Requires-Dist:
|
|
43
|
-
Requires-Dist:
|
|
44
|
-
Requires-Dist:
|
|
45
|
-
Requires-Dist:
|
|
46
|
-
Requires-Dist:
|
|
47
|
-
Requires-Dist:
|
|
29
|
+
Requires-Dist: humanfriendly (>=10)
|
|
30
|
+
Requires-Dist: marshmallow (>=3.20,<4)
|
|
31
|
+
Requires-Dist: mkdocs (>=1.5,<2)
|
|
32
|
+
Requires-Dist: omegaconf (>=2.3,<3)
|
|
33
|
+
Requires-Dist: psutil (>=7,<8)
|
|
34
|
+
Requires-Dist: pyparsing (>=3.1,<4)
|
|
35
|
+
Requires-Dist: pytools (>=2023.1.1,<2024)
|
|
36
|
+
Requires-Dist: pyyaml (>=6.0.1,<7)
|
|
37
|
+
Requires-Dist: requests (>=2.31,<3)
|
|
38
|
+
Requires-Dist: rpyc (>=5,<7)
|
|
39
|
+
Requires-Dist: sortedcontainers (>=2.4,<3)
|
|
40
|
+
Requires-Dist: termcolor (>=2.3,<3)
|
|
41
|
+
Requires-Dist: tqdm (>=4.66.1,<5)
|
|
48
42
|
Requires-Dist: typing-extensions (>=4.2) ; python_version < "3.12"
|
|
49
|
-
Requires-Dist: watchdog (>=2
|
|
50
|
-
Project-URL: Documentation, https://experimaestro-python.readthedocs.io/
|
|
51
|
-
Project-URL: Repository, https://github.com/experimaestro/experimaestro-python
|
|
43
|
+
Requires-Dist: watchdog (>=2)
|
|
52
44
|
Description-Content-Type: text/markdown
|
|
53
45
|
|
|
54
46
|
[](https://badge.fury.io/py/experimaestro)
|
|
@@ -146,11 +138,11 @@ def cli(port, workdir, sleeptime):
|
|
|
146
138
|
# Sets the working directory and the name of the xp
|
|
147
139
|
with experiment(workdir, "helloworld", port=port) as xp:
|
|
148
140
|
# Submit the tasks
|
|
149
|
-
hello = Say(word="hello", sleeptime=sleeptime).submit()
|
|
150
|
-
world = Say(word="world", sleeptime=sleeptime).submit()
|
|
141
|
+
hello = Say.C(word="hello", sleeptime=sleeptime).submit()
|
|
142
|
+
world = Say.C(word="world", sleeptime=sleeptime).submit()
|
|
151
143
|
|
|
152
144
|
# Concat will depend on the two first tasks
|
|
153
|
-
Concat(strings=[hello, world], sleeptime=sleeptime).tag("y", 1).submit()
|
|
145
|
+
Concat.C(strings=[hello, world], sleeptime=sleeptime).tag("y", 1).submit()
|
|
154
146
|
|
|
155
147
|
|
|
156
148
|
if __name__ == "__main__":
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
experimaestro/__init__.py,sha256=XCSuw7ozZZxL9ugnkIhqAaG7CQ6dE9NeSiDJ93QFH_I,1649
|
|
2
|
+
experimaestro/__main__.py,sha256=Dv9lFl03yt1dswd0Xb9NIJRgHpA5_IwH4RfQPEHyFz0,158
|
|
3
|
+
experimaestro/annotations.py,sha256=1QhKA247w50KmhsxvFBnDe6BRc7_EIMMq0GT7LIaGv8,8774
|
|
4
|
+
experimaestro/checkers.py,sha256=ZCMbnE_GFC5compWjt-fuHhPImi9fCPjImF8Ow9NqK8,696
|
|
5
|
+
experimaestro/cli/__init__.py,sha256=bJ7lMdR45bTd-W-kw7CJicR-0qXwNzqUZ_EYfaHH3Oc,9537
|
|
6
|
+
experimaestro/cli/filter.py,sha256=bINAF-O7CwJ2u3T6xG_Q_niqDbPeoEASyYLuCeNlbFw,6313
|
|
7
|
+
experimaestro/cli/jobs.py,sha256=BnejUnhKAgMBVgwANfQYj5mLzknXVohveg7NpovNZ8o,7925
|
|
8
|
+
experimaestro/cli/progress.py,sha256=I6qhVe-vvqA1ym6XJE75q7Hb0jGeFwgodIqfhlTrPKY,8200
|
|
9
|
+
experimaestro/click.py,sha256=6BkeQHEgcxaxzq3xEvEEzwzuBj5-dkfrpOGikuA8L00,1377
|
|
10
|
+
experimaestro/commandline.py,sha256=MJIJcfppGCjNA8ozxXUzbUSeDOlTExuzhxryGx3_lIo,9314
|
|
11
|
+
experimaestro/compat.py,sha256=dQqE2ZNHLM2wtdfp7fBRYMfC33qNehVf9J6FGRBUQhs,171
|
|
12
|
+
experimaestro/connectors/__init__.py,sha256=_8jETUTM3Ecdm8azNrxCSCXyXWso0mwDFnTrcNV3a4w,6129
|
|
13
|
+
experimaestro/connectors/local.py,sha256=lCGIubqmUJZ1glLtLRXOgakTMfEaEmFtNkEcw9qV5vw,6143
|
|
14
|
+
experimaestro/connectors/ssh.py,sha256=5giqvv1y0QQKF-GI0IFUzI_Z5H8Bj9EuL_Szpvk899Q,8600
|
|
15
|
+
experimaestro/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
16
|
+
experimaestro/core/arguments.py,sha256=gB0Kq9XL0_mYbm9WHL-mDx2tUGHI1pvsu1ahMaDxIY0,7170
|
|
17
|
+
experimaestro/core/callbacks.py,sha256=59JfeUgWcCCdIQ3pvh-xNnoRp9BX8f4iOAkgm16wBzE,1660
|
|
18
|
+
experimaestro/core/context.py,sha256=1tLmX7WcgEKSbGw77vfziTzS8KNsoZJ02JBWMBCqqOk,2606
|
|
19
|
+
experimaestro/core/identifier.py,sha256=GmS3HtfLwirjoaVx6cZvLJL4r4546P0FFUSu2Nt0W9g,10812
|
|
20
|
+
experimaestro/core/objects/__init__.py,sha256=ucJY5e17QQ1Kc-GYXeL7g8GFj8rP0XB4g2vrl32uhxY,721
|
|
21
|
+
experimaestro/core/objects/config.py,sha256=D6puZs3VH9GapoHhtgNawwjfQUxSH4E5v3V3sdwLZbg,53575
|
|
22
|
+
experimaestro/core/objects/config_utils.py,sha256=ZLECGkeIWdzunm8vwWsQhvcSgV1e064BgXbLiZnxSEM,1288
|
|
23
|
+
experimaestro/core/objects/config_walk.py,sha256=SYBrGuT7HV12no9mQd1HjnebiyygHyO-zq_TO1brUtc,4233
|
|
24
|
+
experimaestro/core/objects.pyi,sha256=Q1tq4F8LrExPm00E-P5aaygxMvViYZqhHvByo_TTZRE,6315
|
|
25
|
+
experimaestro/core/serialization.py,sha256=CSPEwOzlDsgAz6V2og-TgyU0RXDtzt_nXaoXFZleDZE,5775
|
|
26
|
+
experimaestro/core/serializers.py,sha256=iOBuASEgD8dRKPnL16iOLBsM0GHChCJgjBd7LixFui4,919
|
|
27
|
+
experimaestro/core/types.py,sha256=aI-Qad27tkBFR5HyBCeeUwmZFIQif70__AR7enzpjvY,20938
|
|
28
|
+
experimaestro/core/utils.py,sha256=JfC3qGUS9b6FUHc2VxIYUI9ysNpXSQ1LjOBkjfZ8n7o,495
|
|
29
|
+
experimaestro/exceptions.py,sha256=cUy83WHM3GeynxmMk6QRr5xsnpqUAdAoc-m3KQVrE2o,44
|
|
30
|
+
experimaestro/experiments/__init__.py,sha256=GcpDUIbCvhnv6rxFdAp4wTffCVNTv-InY6fbQAlTy-o,159
|
|
31
|
+
experimaestro/experiments/cli.py,sha256=2HCSl4nO8XxNcqXFnl34nJ-6HVsu-pNELPJyUKK0JLc,10122
|
|
32
|
+
experimaestro/experiments/configuration.py,sha256=vVm40BJW5sZNgSDZ0oBzX15jTO9rmOewVYrm0k9iXXY,1466
|
|
33
|
+
experimaestro/generators.py,sha256=DQsEgdMwRUud9suWr-QGxI3vCO5sywP6MVGZWRNQXkk,1372
|
|
34
|
+
experimaestro/huggingface.py,sha256=gnVlr6SZnbutYz4PLH0Q77n1TRF-uk-dR-3UFzFqAY0,2956
|
|
35
|
+
experimaestro/ipc.py,sha256=Xn3tYME83jLEB0nFak3DwEIhpL5IRZpCl3jirBF_jl4,1570
|
|
36
|
+
experimaestro/launcherfinder/__init__.py,sha256=qRUDyv3B9UsAM8Q31mRrZrTZox0AptwdmOY4f2K-TUo,279
|
|
37
|
+
experimaestro/launcherfinder/base.py,sha256=q47SsF_cXdo5O6ZhFKn5385WVFcx8Wd-BcEpd6tRpbs,515
|
|
38
|
+
experimaestro/launcherfinder/parser.py,sha256=MIHhjs2sTVxLHLcc1CgFid9XxhInXker8QdA-GBA-Bk,2364
|
|
39
|
+
experimaestro/launcherfinder/registry.py,sha256=qP2Y9mfxn7XvIBr4ot2zkyKw6sWhmgBxDDKU5Ty04FE,6417
|
|
40
|
+
experimaestro/launcherfinder/specs.py,sha256=eQC2pwAnvq7kF2xmAfHpg_Wx6_lH6YMf3ZCDwqatjKk,7898
|
|
41
|
+
experimaestro/launchers/__init__.py,sha256=lXn544sgJExr6uirILWzAXu_IfmfyqFZOt4OzRnjHXg,2525
|
|
42
|
+
experimaestro/launchers/direct.py,sha256=JZh6WOPnO6ED_xlOs8pL4MRFmnRhmXzpVxTl-ByaD2A,258
|
|
43
|
+
experimaestro/launchers/oar.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
44
|
+
experimaestro/launchers/slurm/__init__.py,sha256=R1Zwd4phZaXV8FwCYhzfB44n0V4cf-hBQzOc6NkFQ0s,41
|
|
45
|
+
experimaestro/launchers/slurm/base.py,sha256=2CPNJeTNuwPOjqgmdkZ3MfdZbKQTIwlJtu_JL-IClg8,15753
|
|
46
|
+
experimaestro/locking.py,sha256=hPT-LuDGZTijpbme8O0kEoB9a3WjdVzI2h31OT44UxE,1477
|
|
47
|
+
experimaestro/mkdocs/__init__.py,sha256=L9UDM7vOrRZl41zXTBOaHKSINEEsbmxwjIMIGESmLfU,46
|
|
48
|
+
experimaestro/mkdocs/annotations.py,sha256=qpDw8lzrxpsOShXcpcP_LAeR3UhiIXAybG8UvS64-OU,263
|
|
49
|
+
experimaestro/mkdocs/base.py,sha256=qHDZZFdoNRsW6RcjRB1WCSp2sOtRiBk9zFO1acK05BQ,16706
|
|
50
|
+
experimaestro/mkdocs/metaloader.py,sha256=qCqnTWhlgxql-oe46E8AbvYdoM311-lQh-msmPnbllQ,1481
|
|
51
|
+
experimaestro/mkdocs/style.css,sha256=42kJ6Ozq_n4Iw5UfJ4-nO1u-HN3ELvV7Vhvj1Xkn7rQ,66
|
|
52
|
+
experimaestro/mypy.py,sha256=M39VFuDrab-ymlCDIF5jys9oKpTwnuBPzb1T8Un5J3s,285
|
|
53
|
+
experimaestro/notifications.py,sha256=30jPhTo8eU1Nd8RRYorswdlXZ99EuGs38Acg-6l9MyM,9643
|
|
54
|
+
experimaestro/progress.py,sha256=ABdgjCxdVreo6e--Pm1WgIjOWkmggloW2dJU-P5hCfk,14856
|
|
55
|
+
experimaestro/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
56
|
+
experimaestro/rpyc.py,sha256=ZRKol-3tVoeoUITLNFenLF4dhWBLW_FvSV_GvsypmeI,3605
|
|
57
|
+
experimaestro/run.py,sha256=_szMzKn-67ulT6Wy21dzhB1g6_fiL379JnBC0zJqpIY,5332
|
|
58
|
+
experimaestro/scheduler/__init__.py,sha256=HssbogPCuGpKGMPZQP07XCT2-uMFRPANuPM-duMIrq4,422
|
|
59
|
+
experimaestro/scheduler/base.py,sha256=Wq5hfryOvBrvGDpOgitdVQ2TkNYgrt-hHCU8Yey6J6M,10316
|
|
60
|
+
experimaestro/scheduler/dependencies.py,sha256=n9XegwrmjayOIxt3xhuTEBVEBGSq4oeVdzz-FviDGXo,1994
|
|
61
|
+
experimaestro/scheduler/dynamic_outputs.py,sha256=yYPL98I0nSgDjlE3Sk9dtvovh2PZ6rUDnKjDNnAg1dc,5732
|
|
62
|
+
experimaestro/scheduler/experiment.py,sha256=gO0S66AE8jDv_huaezra3odFqjNnuLLVmZVv-sorJ1A,13297
|
|
63
|
+
experimaestro/scheduler/jobs.py,sha256=tJFndvHW5-Padfw-KfU_ytO7l3xaXpjhqEOy9g7gFDs,15279
|
|
64
|
+
experimaestro/scheduler/services.py,sha256=aCKkNZMULlceabqf-kOs_-C7KPINnjU3Q-I00o5x6iY,2189
|
|
65
|
+
experimaestro/scheduler/signal_handler.py,sha256=B4ZeSVB8O41VDdFmV4n2cyBds7wKFG3kH2Fp7cpyxa4,872
|
|
66
|
+
experimaestro/scheduler/state.py,sha256=1ICn1K5gNMCEUb85vwwXLIUF6Lxqa5mbTgMzEz2pnXw,2367
|
|
67
|
+
experimaestro/scheduler/workspace.py,sha256=KNdxPBwUk7gO8h2utMCrlIVKB-f2Ylqg_IxLc4okp_8,2320
|
|
68
|
+
experimaestro/scriptbuilder.py,sha256=6GKUkgixLqSEy41sNr-_HNcrjKb8uxaoQ65DywRYsC0,5027
|
|
69
|
+
experimaestro/server/__init__.py,sha256=V1NbTS7ByqI29t6ArGn5GJeDWQ9VYGQ81qCwFbpLGso,11810
|
|
70
|
+
experimaestro/server/data/0c35d18bf06992036b69.woff2,sha256=gmX2R4Y5fWuDLRygqv3xSa2E5ydZ__qfcnLpGg-wFdE,128352
|
|
71
|
+
experimaestro/server/data/1815e00441357e01619e.ttf,sha256=gIRDrmyCBDla3YVD2oqQpguTdvsPh-2OjqN9EJWW2AU,210792
|
|
72
|
+
experimaestro/server/data/219aa9140e099e6c72ed.woff2,sha256=0xv7gdVueQ4Nni-gC4Pfj3FZ-QYxFM3AFIWbHUg5Vsg,135984
|
|
73
|
+
experimaestro/server/data/2463b90d9a316e4e5294.woff2,sha256=qnWZhiOjkeYcaQF5Ss6DLj7N0oi1bWCPIb6gQRrMC44,158220
|
|
74
|
+
experimaestro/server/data/2582b0e4bcf85eceead0.ttf,sha256=0vBZNUCw4zum3iVaVPJy1GbjEUSAaVa-qM_b9-3_yb0,426112
|
|
75
|
+
experimaestro/server/data/3a4004a46a653d4b2166.woff,sha256=-jiI7_pbxjPGuygaSdiSf-eqACEsn8D3M4yBnsXMFu4,156236
|
|
76
|
+
experimaestro/server/data/3baa5b8f3469222b822d.woff,sha256=PTTzCsa7Ivpb9Y0-Uue7bezZnFcdanfV36e-eL7PK1A,339600
|
|
77
|
+
experimaestro/server/data/4d73cb90e394b34b7670.woff,sha256=_YT4i0lwQNT31ejJ-GNa740-cGwPpS4rb6zxTu6H5SI,164912
|
|
78
|
+
experimaestro/server/data/4ef4218c522f1eb6b5b1.woff2,sha256=Hmc7qFiWVHlNKtN1woc_GHCkV48rPoR9zEB63QO1esI,215704
|
|
79
|
+
experimaestro/server/data/5d681e2edae8c60630db.woff,sha256=HBNbFRpB4jE4sy0wZePw6rIwpnrv6SXplwnL4QK9YEw,206260
|
|
80
|
+
experimaestro/server/data/6f420cf17cc0d7676fad.woff2,sha256=NdyopxRaF8jRMG8lo8oJFXjhU5bwsi1h645zJirHVXc,155276
|
|
81
|
+
experimaestro/server/data/89999bdf5d835c012025.woff2,sha256=40VtEoO511M3p3Pf0Ue_kI_QLAG0v0hXbYYDppsTy-U,25472
|
|
82
|
+
experimaestro/server/data/914997e1bdfc990d0897.ttf,sha256=VM9ghve7IfnQcq1JShm0aB-lFt0KFM7lLaAdNlGpE6M,68064
|
|
83
|
+
experimaestro/server/data/c210719e60948b211a12.woff2,sha256=1yNqGb8jy7ICcoDo9R3JnWxFl2ou1g3nM4KwNLGKK2g,118684
|
|
84
|
+
experimaestro/server/data/c380809fd3677d7d6903.woff2,sha256=yUjxJjNBaZs8HpxV2NDz5EZmnQ8rnVVJTGFpIiwCQ6Y,173620
|
|
85
|
+
experimaestro/server/data/f882956fd323fd322f31.woff,sha256=jpR1jFTCboWqzy09yhrXqtpZBKRgI4-uSEPrxEvELtw,182028
|
|
86
|
+
experimaestro/server/data/favicon.ico,sha256=PRD32mxgMXg0AIFmjErFs66XQ8qaJiqw_NMS-7n0i90,3870
|
|
87
|
+
experimaestro/server/data/index.css,sha256=hujPctk1MO9fdUpzFiveEKQzkiABNGmeJOtNoUMqDAY,392757
|
|
88
|
+
experimaestro/server/data/index.css.map,sha256=rKkhyfo3OaALku4FrL0Lqs8-mjxfXlkvPIk5V-LfaBs,575718
|
|
89
|
+
experimaestro/server/data/index.html,sha256=LcXSo2QU5jcmqgmFhVWWOG_CfGyrqdm3H8jwkdRgdGU,706
|
|
90
|
+
experimaestro/server/data/index.js,sha256=q8oG4RM5rRjIGmI1szIrLTxigTHNkVUG1BuHbcjUeSw,3710972
|
|
91
|
+
experimaestro/server/data/index.js.map,sha256=cv7KF28Uq5dy7Ux3yRnoSVztrOFVid359fm0Xn2IJ6s,3903046
|
|
92
|
+
experimaestro/server/data/login.html,sha256=4dvhSOn6DHp_tbmzqIKrqq2uAo0sAUbgLVD0lTnPp4s,511
|
|
93
|
+
experimaestro/server/data/manifest.json,sha256=EpzHQZzrGh9c1Kf63nrqvI33H1cm0nLYfdh5lDm8ijI,318
|
|
94
|
+
experimaestro/settings.py,sha256=j6iVV8bFn5VP-TopjtbSyX1wNgmfs3jzGeeAmaZzOPA,3172
|
|
95
|
+
experimaestro/sphinx/__init__.py,sha256=HAofa65lCLAUOShgWwJIGEEOPKzu4VEs5LZd46V_Bng,9466
|
|
96
|
+
experimaestro/sphinx/static/experimaestro.css,sha256=0rEgt1LoDdD-a_R5rVfWZ19zD1gR-1L7q3f4UibIB58,294
|
|
97
|
+
experimaestro/taskglobals.py,sha256=Lp0bqobVLndR7fOtF9qPI7utTKQXXwTdVN6l5Av9Dc4,660
|
|
98
|
+
experimaestro/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
99
|
+
experimaestro/tests/conftest.py,sha256=CtC6TvUS9sbgSc3pZYyTyEvfilnNGPpOUJvi-jn6twI,695
|
|
100
|
+
experimaestro/tests/connectors/bin/executable.py,sha256=RmCrH_MQiHuPRyeTP2jut0ASpfvHEH1QCxRnlvDZW2s,21
|
|
101
|
+
experimaestro/tests/connectors/test_local.py,sha256=hMX3maYYRABGXqRZFZbTWjf-jcvPkBq9nReLtDwLydk,1204
|
|
102
|
+
experimaestro/tests/connectors/utils.py,sha256=9sM3Pwy2nRfSr7pwQoOoSCDhBrEcDsEElI08Fmrw_gU,702
|
|
103
|
+
experimaestro/tests/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
104
|
+
experimaestro/tests/core/test_generics.py,sha256=QfO25aSV6kKKlGGSvPK19pSOI86FhXKEy3iFQbspIzE,5185
|
|
105
|
+
experimaestro/tests/definitions_types.py,sha256=nMoQxZxhTJAYV87Ce9F2dAITxXGHf7Uw5j-MKsZ3LmQ,399
|
|
106
|
+
experimaestro/tests/launchers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
107
|
+
experimaestro/tests/launchers/bin/sacct,sha256=9mmRAYCE4RBSBOf7aanhFw9hzujOUlcw3OJmZJ3K-Wc,639
|
|
108
|
+
experimaestro/tests/launchers/bin/sbatch,sha256=KgG4xUiIpELHBWLjnM7IUBu5jKiIGnILS9HfHE5eVFk,1715
|
|
109
|
+
experimaestro/tests/launchers/bin/srun,sha256=3oE3qq0UFpVtTvXfR1kH3tovFYX74fp1Fk-o8zgsaJA,47
|
|
110
|
+
experimaestro/tests/launchers/bin/test.py,sha256=MbxdAd2Sf7T-Hj3ldmrtngbQuBdNOkXjMcICJTf39wI,477
|
|
111
|
+
experimaestro/tests/launchers/common.py,sha256=WqVcWX3g0XYJS0aJO7XWVvOmncRBbQmGvuNxH9AHUAE,2998
|
|
112
|
+
experimaestro/tests/launchers/config_slurm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
113
|
+
experimaestro/tests/launchers/config_slurm/launchers.py,sha256=DohwQVv1eXWfDpAYFg7KJekEm7q7G-lMou2lPg-PKOk,838
|
|
114
|
+
experimaestro/tests/launchers/test_local.py,sha256=4oGgWH2YgkEm-Muu6s4cwlgriXtYr5xAd72DVoIw_Yk,717
|
|
115
|
+
experimaestro/tests/launchers/test_slurm.py,sha256=5s-mMtqvE62xJ_GijLd4Hmsu3vWCRCbFy7cPce8YKsM,2534
|
|
116
|
+
experimaestro/tests/restart.py,sha256=aAizVLvw2DaNfIzuRB13iYXOoX1Q5NkgsngumERlo2s,4191
|
|
117
|
+
experimaestro/tests/restart_main.py,sha256=iAFzw0H1q9Aq7t6TrSAj236QBnYU52qx0VF-2dz6tx4,295
|
|
118
|
+
experimaestro/tests/scripts/notifyandwait.py,sha256=3BLXLI5XgP3BnKf6sQ56oKoMVqR80VMHmploJ3JO6Ko,407
|
|
119
|
+
experimaestro/tests/scripts/waitforfile.py,sha256=EDT-TuFi2fU_qt51K5EmAxjw_OnJKkBW7UCfhrtDbVw,120
|
|
120
|
+
experimaestro/tests/task_tokens.py,sha256=vgqUa-S_YC2Id9pGOSv40qFTwq1WGZkFhr556Z5o678,477
|
|
121
|
+
experimaestro/tests/tasks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
122
|
+
experimaestro/tests/tasks/all.py,sha256=2KF0D1CB2PBwM_aXX09Ug6vy0MUQgoTATdheNeNKXHg,2101
|
|
123
|
+
experimaestro/tests/tasks/foreign.py,sha256=uhXDOcWozkcm26ybbeEU9RElJpbhjC-zdzmlSKfPcdY,122
|
|
124
|
+
experimaestro/tests/test_checkers.py,sha256=e6Rv2TlePRY__VXs0vUb6a5Aw_KIq_cs4N86VhnYHtw,407
|
|
125
|
+
experimaestro/tests/test_dependencies.py,sha256=LvpmMcfnRzQPzUIuFNCIQnJot8YBSxCA827xh9gYlq0,1890
|
|
126
|
+
experimaestro/tests/test_experiment.py,sha256=Nfevu_aMyX4c5xTjDHMeKXZWs2HMOhy96tsQlnF-IVs,1693
|
|
127
|
+
experimaestro/tests/test_file_progress.py,sha256=uNUUq-ptcnxu56zRvUUZ5EYM9ZIQbUmOU_LI0roMgSw,15119
|
|
128
|
+
experimaestro/tests/test_file_progress_integration.py,sha256=ejXASpdnpi6HUy569Q5Vx5F8SV_RDU-4o3yuQka6vS4,16751
|
|
129
|
+
experimaestro/tests/test_findlauncher.py,sha256=KPy8ow--NXS1KFCIpxrmEJFRvjo-v-PwlVHVyoVKLPg,3134
|
|
130
|
+
experimaestro/tests/test_forward.py,sha256=9y1zYm7hT_Lx5citxnK7n20cMZ2WJbsaEeY5irCZ9U4,735
|
|
131
|
+
experimaestro/tests/test_generators.py,sha256=R0UypTzxX0dPYvY4A_kozpLDHhGzQDNfLQyc0oRaSx8,2891
|
|
132
|
+
experimaestro/tests/test_identifier.py,sha256=0uv7lsgLLzKHLinlq2J9yj9UyKG6ud1EYtxIyeXbyhE,14368
|
|
133
|
+
experimaestro/tests/test_instance.py,sha256=VFRvjy1OXGtGgkh__mf73KmJq4Lom7ppvBDkhE7rjTA,1325
|
|
134
|
+
experimaestro/tests/test_objects.py,sha256=hGku35h1qkNMIdgP_gWM7HeviaqW7jrZDffOsCJh-_Q,1787
|
|
135
|
+
experimaestro/tests/test_outputs.py,sha256=vilnECNfc-cyzDZjTvCgCSMesC7QwWTfhJtlOyM9kIM,797
|
|
136
|
+
experimaestro/tests/test_param.py,sha256=OW3uguPjy9U6f9BrLr8z4ieo88EH6da2zMho-FVwmKQ,7324
|
|
137
|
+
experimaestro/tests/test_progress.py,sha256=j-V65Adk9psBzMcSzlH7uSqDiLkYDd3Udpy1UCT8j2Y,7588
|
|
138
|
+
experimaestro/tests/test_serializers.py,sha256=dQkiuvHAQ1g-SCRCfOy977nQMWR7CFuBUud65N_vfiI,1248
|
|
139
|
+
experimaestro/tests/test_snippets.py,sha256=rojnyDjtmAMnSuDUj6Bv9XEgdP8oQf2nVc132JF8vsM,3081
|
|
140
|
+
experimaestro/tests/test_ssh.py,sha256=KS1NWltiXrJBSStY9d4mwrexeqgNGWmhxuAU_WLQDAU,1449
|
|
141
|
+
experimaestro/tests/test_tags.py,sha256=_FE0g1kCwrgy7AlLNmgYHol07lMk8Iyera60-gO2k-s,2886
|
|
142
|
+
experimaestro/tests/test_tasks.py,sha256=Lbo9hc3FGah8XTsMFQVfFFp4YqE3FtHNCrEuz43ZHOs,9016
|
|
143
|
+
experimaestro/tests/test_tokens.py,sha256=0PPVCBcYWzFqgCQEbJsNAZOIVZt4VVv2vu-W4sk0Ogg,7859
|
|
144
|
+
experimaestro/tests/test_types.py,sha256=Y76TvSv9euJqI6Zu14cnD8ldToWxts43yvGa7-HV2kA,1363
|
|
145
|
+
experimaestro/tests/test_validation.py,sha256=tinkXETcAGtgPIsmbioKSU00kGIV1YnniHTGDDcUOq8,4118
|
|
146
|
+
experimaestro/tests/token_reschedule.py,sha256=z7oVrFvRkUlBC3FMTr552ayeCt6DWTpx1j9Dk5YtPq8,1703
|
|
147
|
+
experimaestro/tests/utils.py,sha256=41krZFgUaCxCYBQPmo5dNFDd9W6RU8ZzzyzY3FyutUI,3805
|
|
148
|
+
experimaestro/tokens.py,sha256=ZnsDnfJgyAUgThv0c-ta28CrHre0gRyQF6q5FD9tCLY,15147
|
|
149
|
+
experimaestro/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
150
|
+
experimaestro/tools/diff.py,sha256=4GWWXgpkotO6a7i6qG64oWPGm8Ej7eFCDNj0wjZ-G7s,3715
|
|
151
|
+
experimaestro/tools/documentation.py,sha256=O2UzjzodPqGot3YSe6NYlK7S42XpplakUdqxFpvjqHQ,9184
|
|
152
|
+
experimaestro/tools/jobs.py,sha256=63bXhJ7RGdczLU_nxu2skGn-9dwgr4r5pD23qH4WeBA,3516
|
|
153
|
+
experimaestro/typingutils.py,sha256=v7wS9xewF3cYOKvaBFxlTB-qplJ8olI1OaO3tAKiwIo,3678
|
|
154
|
+
experimaestro/utils/__init__.py,sha256=BdYguxAbR1jOQPV36OgGA31itaMvBJ6WVPV6b4Jn4xw,2434
|
|
155
|
+
experimaestro/utils/asyncio.py,sha256=9r_vFQs6T6tqmymC_DbHVFhY9YVRO6X48uEuyL_ugP8,726
|
|
156
|
+
experimaestro/utils/jobs.py,sha256=42FAdKcn_v_-M6hcQZPUBr9kbDt1eVsk3a4E8Gc4eu8,2394
|
|
157
|
+
experimaestro/utils/jupyter.py,sha256=JcEo2yQK7x3Cr1tNl5FqGMZOICxCv9DwMvL5xsWdQPk,2183
|
|
158
|
+
experimaestro/utils/multiprocessing.py,sha256=am3DkHP_kmWbpynbck2c9QystCUtPBoSAC0ViBVzndU,1275
|
|
159
|
+
experimaestro/utils/resources.py,sha256=j-nvsTFwmgENMoVGOD2Ap-UD3WU85WkI0IgeSszMCX4,1328
|
|
160
|
+
experimaestro/utils/settings.py,sha256=jpFMqF0DLL4_P1xGal0zVR5cOrdD8O0Y2IOYvnRgN3k,793
|
|
161
|
+
experimaestro/xpmutils.py,sha256=S21eMbDYsHfvmZ1HmKpq5Pz5O-1HnCLYxKbyTBbASyQ,638
|
|
162
|
+
experimaestro-2.0.0a8.dist-info/METADATA,sha256=vZ4UCEkPrs1HE6gA8YUcTeyLyKgRz1-iGg9buRdX4D0,5712
|
|
163
|
+
experimaestro-2.0.0a8.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
|
|
164
|
+
experimaestro-2.0.0a8.dist-info/entry_points.txt,sha256=TppTNiz5qm5xm1fhAcdLKdCLMrlL-eQggtCrCI00D9c,446
|
|
165
|
+
experimaestro-2.0.0a8.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
166
|
+
experimaestro-2.0.0a8.dist-info/RECORD,,
|
|
@@ -5,10 +5,6 @@ experimaestro=experimaestro.__main__:main
|
|
|
5
5
|
local=experimaestro.connectors.local:LocalConnector
|
|
6
6
|
ssh=experimaestro.connectors.ssh:SshConnector
|
|
7
7
|
|
|
8
|
-
[experimaestro.launchers]
|
|
9
|
-
slurm=experimaestro.launchers.slurm:SlurmLauncher
|
|
10
|
-
unix=experimaestro.launchers.direct:DirectLauncher
|
|
11
|
-
|
|
12
8
|
[experimaestro.process]
|
|
13
9
|
local=experimaestro.connectors.local:LocalProcess
|
|
14
10
|
slurm=experimaestro.launchers.slurm:BatchSlurmProcess
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import sys
|
|
2
|
-
import click
|
|
3
|
-
|
|
4
|
-
from .configuration import SlurmConfiguration, fill_nodes_configuration
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
@click.group()
|
|
8
|
-
def cli():
|
|
9
|
-
pass
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
@click.option("--no-hosts", is_flag=True, help="Disable hosts")
|
|
13
|
-
@cli.command()
|
|
14
|
-
def convert(no_hosts):
|
|
15
|
-
"""Convert the ouptut of 'scontrol show node' into a YAML form compatible
|
|
16
|
-
with launchers.yaml"""
|
|
17
|
-
import yaml
|
|
18
|
-
from experimaestro.launcherfinder import LauncherRegistry
|
|
19
|
-
|
|
20
|
-
configuration = SlurmConfiguration(id="", partitions={})
|
|
21
|
-
fill_nodes_configuration(sys.stdin, configuration)
|
|
22
|
-
|
|
23
|
-
if no_hosts:
|
|
24
|
-
for pid, partition in configuration.partitions.items():
|
|
25
|
-
for node in partition.nodes:
|
|
26
|
-
node.hosts = []
|
|
27
|
-
configuration.use_hosts = False
|
|
28
|
-
|
|
29
|
-
yaml.dump(configuration, sys.stdout, Dumper=LauncherRegistry.instance().Dumper)
|