hpcflow-new2 0.2.0a156__py3-none-any.whl → 0.2.0a158__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.
- hpcflow/_version.py +1 -1
- hpcflow/sdk/core/element.py +6 -2
- hpcflow/sdk/persistence/base.py +10 -4
- hpcflow/sdk/persistence/json.py +22 -5
- hpcflow/sdk/persistence/pending.py +10 -9
- hpcflow/sdk/persistence/zarr.py +63 -16
- hpcflow/sdk/submission/schedulers/__init__.py +1 -1
- hpcflow/sdk/submission/schedulers/sge.py +10 -1
- hpcflow/sdk/submission/schedulers/slurm.py +10 -1
- hpcflow/tests/unit/test_submission.py +25 -0
- {hpcflow_new2-0.2.0a156.dist-info → hpcflow_new2-0.2.0a158.dist-info}/METADATA +1 -1
- {hpcflow_new2-0.2.0a156.dist-info → hpcflow_new2-0.2.0a158.dist-info}/RECORD +14 -14
- {hpcflow_new2-0.2.0a156.dist-info → hpcflow_new2-0.2.0a158.dist-info}/WHEEL +0 -0
- {hpcflow_new2-0.2.0a156.dist-info → hpcflow_new2-0.2.0a158.dist-info}/entry_points.txt +0 -0
hpcflow/_version.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "0.2.
|
1
|
+
__version__ = "0.2.0a158"
|
hpcflow/sdk/core/element.py
CHANGED
@@ -307,10 +307,14 @@ class ElementResources(JSONLike):
|
|
307
307
|
|
308
308
|
# "direct_posix" scheduler is valid on Windows if using WSL:
|
309
309
|
cfg_lookup = f"{self.scheduler}_posix" if "wsl" in self.shell else self.scheduler
|
310
|
-
cfg_sched = self.app.config.schedulers.get(cfg_lookup, {})
|
310
|
+
cfg_sched = copy.deepcopy(self.app.config.schedulers.get(cfg_lookup, {}))
|
311
311
|
|
312
312
|
# merge defaults scheduler args from config:
|
313
|
-
|
313
|
+
cfg_defs = cfg_sched.get("defaults", {})
|
314
|
+
cfg_opts = cfg_defs.pop("options", {})
|
315
|
+
opts = {**cfg_opts, **self.scheduler_args.get("options", {})}
|
316
|
+
self.scheduler_args["options"] = opts
|
317
|
+
self.scheduler_args = {**cfg_defs, **self.scheduler_args}
|
314
318
|
|
315
319
|
def validate_against_machine(self):
|
316
320
|
"""Validate the values for `os_name`, `shell` and `scheduler` against those
|
hpcflow/sdk/persistence/base.py
CHANGED
@@ -45,6 +45,12 @@ TEMPLATE_COMP_TYPES = (
|
|
45
45
|
"task_schemas",
|
46
46
|
)
|
47
47
|
|
48
|
+
PARAM_DATA_NOT_SET = 0
|
49
|
+
|
50
|
+
|
51
|
+
def update_param_source_dict(source, update):
|
52
|
+
return dict(sorted({**source, **update}.items()))
|
53
|
+
|
48
54
|
|
49
55
|
@dataclass
|
50
56
|
class PersistentStoreFeatures:
|
@@ -435,7 +441,7 @@ class StoreParameter:
|
|
435
441
|
else:
|
436
442
|
return self._encode(obj=self.data, **kwargs)
|
437
443
|
else:
|
438
|
-
return
|
444
|
+
return PARAM_DATA_NOT_SET
|
439
445
|
|
440
446
|
def _encode(
|
441
447
|
self,
|
@@ -538,7 +544,7 @@ class StoreParameter:
|
|
538
544
|
source=source,
|
539
545
|
is_pending=False,
|
540
546
|
)
|
541
|
-
elif data
|
547
|
+
elif data == PARAM_DATA_NOT_SET:
|
542
548
|
# parameter is not set
|
543
549
|
return cls(
|
544
550
|
id_=id_,
|
@@ -618,7 +624,7 @@ class StoreParameter:
|
|
618
624
|
|
619
625
|
def update_source(self, src: Dict) -> None:
|
620
626
|
"""Return a copy, with updated source."""
|
621
|
-
new_src =
|
627
|
+
new_src = update_param_source_dict(self.source, src)
|
622
628
|
return self.__class__(
|
623
629
|
id_=self.id_,
|
624
630
|
is_set=self.is_set,
|
@@ -1062,7 +1068,7 @@ class PersistentStore(ABC):
|
|
1062
1068
|
id_=new_idx,
|
1063
1069
|
is_pending=True,
|
1064
1070
|
is_set=is_set,
|
1065
|
-
data=data,
|
1071
|
+
data=PARAM_DATA_NOT_SET if not is_set else data,
|
1066
1072
|
file=file,
|
1067
1073
|
source=source,
|
1068
1074
|
)
|
hpcflow/sdk/persistence/json.py
CHANGED
@@ -26,6 +26,7 @@ from hpcflow.sdk.persistence.base import (
|
|
26
26
|
)
|
27
27
|
from hpcflow.sdk.persistence.pending import CommitResourceMap
|
28
28
|
from hpcflow.sdk.persistence.store_resource import JSONFileStoreResource
|
29
|
+
from hpcflow.sdk.persistence.base import update_param_source_dict
|
29
30
|
|
30
31
|
|
31
32
|
class JSONPersistentStore(PersistentStore):
|
@@ -277,15 +278,31 @@ class JSONPersistentStore(PersistentStore):
|
|
277
278
|
# no need to update sources array:
|
278
279
|
params["data"][str(param_id)] = param.encode()
|
279
280
|
|
280
|
-
def
|
281
|
-
"""
|
281
|
+
def _set_parameter_values(self, set_parameters: Dict[int, Tuple[Any, bool]]):
|
282
|
+
"""Set multiple unset persistent parameters."""
|
283
|
+
param_ids = list(set_parameters.keys())
|
284
|
+
param_objs = self._get_persistent_parameters(param_ids)
|
285
|
+
with self.using_resource("parameters", "update") as params:
|
286
|
+
for param_id, (value, is_file) in set_parameters.items():
|
287
|
+
param_i = param_objs[param_id]
|
288
|
+
if is_file:
|
289
|
+
param_i = param_i.set_file(value)
|
290
|
+
else:
|
291
|
+
param_i = param_i.set_data(value)
|
292
|
+
params["data"][str(param_id)] = param_i.encode()
|
282
293
|
|
283
|
-
|
284
|
-
|
294
|
+
def _update_parameter_sources(self, sources: Dict[int, Dict]):
|
295
|
+
"""Update the sources of multiple persistent parameters."""
|
296
|
+
|
297
|
+
param_ids = list(sources.keys())
|
298
|
+
param_objs = self._get_persistent_parameters(param_ids)
|
285
299
|
|
286
300
|
with self.using_resource("parameters", "update") as params:
|
287
301
|
# no need to update data array:
|
288
|
-
|
302
|
+
for p_id, src_i in sources.items():
|
303
|
+
param_i = param_objs[p_id]
|
304
|
+
new_src_i = update_param_source_dict(param_i.source, src_i)
|
305
|
+
params["sources"][str(p_id)] = new_src_i
|
289
306
|
|
290
307
|
def _update_template_components(self, tc: Dict):
|
291
308
|
with self.using_resource("metadata", "update") as md:
|
@@ -349,10 +349,11 @@ class PendingChanges:
|
|
349
349
|
self.store._append_parameters(params)
|
350
350
|
self.clear_add_parameters()
|
351
351
|
|
352
|
-
|
353
|
-
|
354
|
-
self.logger.debug(f"commit: setting
|
355
|
-
self.store.
|
352
|
+
if self.set_parameters:
|
353
|
+
param_ids = list(self.set_parameters.keys())
|
354
|
+
self.logger.debug(f"commit: setting values of parameter IDs {param_ids!r}.")
|
355
|
+
self.store._set_parameter_values(self.set_parameters)
|
356
|
+
|
356
357
|
self.clear_set_parameters()
|
357
358
|
|
358
359
|
@TimeIt.decorator
|
@@ -373,11 +374,11 @@ class PendingChanges:
|
|
373
374
|
@TimeIt.decorator
|
374
375
|
def commit_param_sources(self) -> None:
|
375
376
|
"""Make pending changes to parameter sources persistent."""
|
376
|
-
|
377
|
-
|
378
|
-
self.logger.debug(f"commit: updating
|
379
|
-
self.store.
|
380
|
-
|
377
|
+
if self.update_param_sources:
|
378
|
+
param_ids = list(self.update_param_sources.keys())
|
379
|
+
self.logger.debug(f"commit: updating sources of parameter IDs {param_ids!r}.")
|
380
|
+
self.store._update_parameter_sources(self.update_param_sources)
|
381
|
+
self.clear_update_param_sources()
|
381
382
|
|
382
383
|
@TimeIt.decorator
|
383
384
|
def commit_loop_indices(self) -> None:
|
hpcflow/sdk/persistence/zarr.py
CHANGED
@@ -23,6 +23,7 @@ from hpcflow.sdk.core.errors import (
|
|
23
23
|
)
|
24
24
|
from hpcflow.sdk.core.utils import ensure_in, get_relative_path, set_in_container
|
25
25
|
from hpcflow.sdk.persistence.base import (
|
26
|
+
PARAM_DATA_NOT_SET,
|
26
27
|
PersistentStoreFeatures,
|
27
28
|
PersistentStore,
|
28
29
|
StoreEAR,
|
@@ -34,6 +35,7 @@ from hpcflow.sdk.persistence.base import (
|
|
34
35
|
from hpcflow.sdk.persistence.store_resource import ZarrAttrsStoreResource
|
35
36
|
from hpcflow.sdk.persistence.utils import ask_pw_on_auth_exc
|
36
37
|
from hpcflow.sdk.persistence.pending import CommitResourceMap
|
38
|
+
from hpcflow.sdk.persistence.base import update_param_source_dict
|
37
39
|
from hpcflow.sdk.log import TimeIt
|
38
40
|
|
39
41
|
|
@@ -454,6 +456,8 @@ class ZarrPersistentStore(PersistentStore):
|
|
454
456
|
object_codec=MsgPack(),
|
455
457
|
chunks=1,
|
456
458
|
compressor=cmp,
|
459
|
+
write_empty_chunks=False,
|
460
|
+
fill_value=PARAM_DATA_NOT_SET,
|
457
461
|
)
|
458
462
|
parameter_data.create_dataset(
|
459
463
|
name=cls._param_sources_arr_name,
|
@@ -659,15 +663,28 @@ class ZarrPersistentStore(PersistentStore):
|
|
659
663
|
|
660
664
|
def _append_parameters(self, params: List[ZarrStoreParameter]):
|
661
665
|
"""Add new persistent parameters."""
|
662
|
-
base_arr = self._get_parameter_base_array(mode="r+")
|
666
|
+
base_arr = self._get_parameter_base_array(mode="r+", write_empty_chunks=False)
|
663
667
|
src_arr = self._get_parameter_sources_array(mode="r+")
|
668
|
+
self.logger.debug(
|
669
|
+
f"PersistentStore._append_parameters: adding {len(params)} parameters."
|
670
|
+
)
|
671
|
+
|
672
|
+
param_encode_root_group = self._get_parameter_user_array_group(mode="r+")
|
673
|
+
param_enc = []
|
674
|
+
src_enc = []
|
664
675
|
for param_i in params:
|
665
676
|
dat_i = param_i.encode(
|
666
|
-
root_group=
|
677
|
+
root_group=param_encode_root_group,
|
667
678
|
arr_path=self._param_data_arr_grp_name(param_i.id_),
|
668
679
|
)
|
669
|
-
|
670
|
-
|
680
|
+
param_enc.append(dat_i)
|
681
|
+
src_enc.append(dict(sorted(param_i.source.items())))
|
682
|
+
|
683
|
+
base_arr.append(param_enc)
|
684
|
+
src_arr.append(src_enc)
|
685
|
+
self.logger.debug(
|
686
|
+
f"PersistentStore._append_parameters: finished adding {len(params)} parameters."
|
687
|
+
)
|
671
688
|
|
672
689
|
def _set_parameter_value(self, param_id: int, value: Any, is_file: bool):
|
673
690
|
"""Set an unset persistent parameter."""
|
@@ -687,15 +704,44 @@ class ZarrPersistentStore(PersistentStore):
|
|
687
704
|
base_arr = self._get_parameter_base_array(mode="r+")
|
688
705
|
base_arr[param_id] = dat_i
|
689
706
|
|
690
|
-
def
|
691
|
-
"""
|
707
|
+
def _set_parameter_values(self, set_parameters: Dict[int, Tuple[Any, bool]]):
|
708
|
+
"""Set multiple unset persistent parameters."""
|
692
709
|
|
693
|
-
|
694
|
-
|
710
|
+
param_ids = list(set_parameters.keys())
|
711
|
+
# the `decode` call in `_get_persistent_parameters` should be quick:
|
712
|
+
params = self._get_persistent_parameters(param_ids)
|
713
|
+
new_data = []
|
714
|
+
param_encode_root_group = self._get_parameter_user_array_group(mode="r+")
|
715
|
+
for param_id, (value, is_file) in set_parameters.items():
|
716
|
+
|
717
|
+
param_i = params[param_id]
|
718
|
+
if is_file:
|
719
|
+
param_i = param_i.set_file(value)
|
720
|
+
else:
|
721
|
+
param_i = param_i.set_data(value)
|
722
|
+
|
723
|
+
new_data.append(
|
724
|
+
param_i.encode(
|
725
|
+
root_group=param_encode_root_group,
|
726
|
+
arr_path=self._param_data_arr_grp_name(param_i.id_),
|
727
|
+
)
|
728
|
+
)
|
729
|
+
|
730
|
+
# no need to update sources array:
|
731
|
+
base_arr = self._get_parameter_base_array(mode="r+")
|
732
|
+
base_arr.set_coordinate_selection(param_ids, new_data)
|
733
|
+
|
734
|
+
def _update_parameter_sources(self, sources: Dict[int, Dict]):
|
735
|
+
"""Update the sources of multiple persistent parameters."""
|
695
736
|
|
696
|
-
|
737
|
+
param_ids = list(sources.keys())
|
697
738
|
src_arr = self._get_parameter_sources_array(mode="r+")
|
698
|
-
|
739
|
+
existing_sources = src_arr.get_coordinate_selection(param_ids)
|
740
|
+
new_sources = []
|
741
|
+
for idx, source_i in enumerate(sources.values()):
|
742
|
+
new_src_i = update_param_source_dict(existing_sources[idx], source_i)
|
743
|
+
new_sources.append(new_src_i)
|
744
|
+
src_arr.set_coordinate_selection(param_ids, new_sources)
|
699
745
|
|
700
746
|
def _update_template_components(self, tc: Dict):
|
701
747
|
with self.using_resource("attrs", "update") as md:
|
@@ -740,14 +786,15 @@ class ZarrPersistentStore(PersistentStore):
|
|
740
786
|
self._zarr_store = self._get_zarr_store(self.path, self.fs)
|
741
787
|
return self._zarr_store
|
742
788
|
|
743
|
-
def _get_root_group(self, mode: str = "r") -> zarr.Group:
|
744
|
-
return zarr.open(self.zarr_store, mode=mode)
|
789
|
+
def _get_root_group(self, mode: str = "r", **kwargs) -> zarr.Group:
|
790
|
+
return zarr.open(self.zarr_store, mode=mode, **kwargs)
|
745
791
|
|
746
|
-
def _get_parameter_group(self, mode: str = "r") -> zarr.Group:
|
747
|
-
return self._get_root_group(mode=mode).get(self._param_grp_name)
|
792
|
+
def _get_parameter_group(self, mode: str = "r", **kwargs) -> zarr.Group:
|
793
|
+
return self._get_root_group(mode=mode, **kwargs).get(self._param_grp_name)
|
748
794
|
|
749
|
-
def _get_parameter_base_array(self, mode: str = "r") -> zarr.Array:
|
750
|
-
|
795
|
+
def _get_parameter_base_array(self, mode: str = "r", **kwargs) -> zarr.Array:
|
796
|
+
path = f"{self._param_grp_name}/{self._param_base_arr_name}"
|
797
|
+
return zarr.open(self.zarr_store, mode=mode, path=path, **kwargs)
|
751
798
|
|
752
799
|
def _get_parameter_sources_array(self, mode: str = "r") -> zarr.Array:
|
753
800
|
return self._get_parameter_group(mode=mode).get(self._param_sources_arr_name)
|
@@ -16,7 +16,7 @@ class NullScheduler:
|
|
16
16
|
):
|
17
17
|
self.shebang_args = shebang_args or self.DEFAULT_SHEBANG_ARGS
|
18
18
|
self.shell_args = shell_args or self.DEFAULT_SHELL_ARGS
|
19
|
-
self.options = options or
|
19
|
+
self.options = options or {}
|
20
20
|
|
21
21
|
@property
|
22
22
|
def unique_properties(self):
|
@@ -163,7 +163,16 @@ class SGEPosix(Scheduler):
|
|
163
163
|
opts.append(self.format_array_request(num_elements))
|
164
164
|
|
165
165
|
opts.extend(self.format_std_stream_file_option_lines(is_array, sub_idx))
|
166
|
-
|
166
|
+
|
167
|
+
for opt_k, opt_v in self.options.items():
|
168
|
+
if isinstance(opt_v, list):
|
169
|
+
for i in opt_v:
|
170
|
+
opts.append(f"{self.js_cmd} {opt_k} {i}")
|
171
|
+
elif opt_v:
|
172
|
+
opts.append(f"{self.js_cmd} {opt_k} {opt_v}")
|
173
|
+
elif opt_v is None:
|
174
|
+
opts.append(f"{self.js_cmd} {opt_k}")
|
175
|
+
|
167
176
|
return "\n".join(opts) + "\n"
|
168
177
|
|
169
178
|
def get_version_info(self):
|
@@ -348,7 +348,16 @@ class SlurmPosix(Scheduler):
|
|
348
348
|
opts.append(self.format_array_request(num_elements, resources))
|
349
349
|
|
350
350
|
opts.extend(self.format_std_stream_file_option_lines(is_array, sub_idx))
|
351
|
-
|
351
|
+
|
352
|
+
for opt_k, opt_v in self.options.items():
|
353
|
+
if isinstance(opt_v, list):
|
354
|
+
for i in opt_v:
|
355
|
+
opts.append(f"{self.js_cmd} {opt_k} {i}")
|
356
|
+
elif opt_v:
|
357
|
+
opts.append(f"{self.js_cmd} {opt_k} {opt_v}")
|
358
|
+
elif opt_v is None:
|
359
|
+
opts.append(f"{self.js_cmd} {opt_k}")
|
360
|
+
|
352
361
|
return "\n".join(opts) + "\n"
|
353
362
|
|
354
363
|
def get_version_info(self):
|
@@ -516,3 +516,28 @@ def test_unique_schedulers_two_direct_and_SLURM(new_null_config, tmp_path):
|
|
516
516
|
scheds = sub.get_unique_schedulers()
|
517
517
|
|
518
518
|
assert len(scheds) == 2
|
519
|
+
|
520
|
+
|
521
|
+
def test_scheduler_config_defaults(new_null_config, tmp_path):
|
522
|
+
"""Check default options defined in the config are merged into jobscript resources."""
|
523
|
+
hf.config.set("schedulers.direct.defaults.options", {"a": "c"})
|
524
|
+
|
525
|
+
t1 = hf.Task(
|
526
|
+
schema=hf.task_schemas.test_t1_ps,
|
527
|
+
inputs={"p1": 1},
|
528
|
+
resources={"any": {"scheduler": "direct"}},
|
529
|
+
)
|
530
|
+
t2 = hf.Task(
|
531
|
+
schema=hf.task_schemas.test_t1_ps,
|
532
|
+
inputs={"p1": 1},
|
533
|
+
resources={
|
534
|
+
"any": {"scheduler": "direct", "scheduler_args": {"options": {"a": "b"}}}
|
535
|
+
},
|
536
|
+
)
|
537
|
+
wkt = hf.WorkflowTemplate(name="temp", tasks=[t1, t2])
|
538
|
+
wk = hf.Workflow.from_template(
|
539
|
+
template=wkt,
|
540
|
+
)
|
541
|
+
sub = wk.add_submission()
|
542
|
+
assert sub.jobscripts[0].resources.scheduler_args == {"options": {"a": "c"}}
|
543
|
+
assert sub.jobscripts[1].resources.scheduler_args == {"options": {"a": "b"}}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
hpcflow/__init__.py,sha256=WIETuRHeOp2SqUqHUzpjQ-lk9acbYv-6aWOhZPRdlhs,64
|
2
2
|
hpcflow/__pyinstaller/__init__.py,sha256=YOzBlPSck6slucv6lJM9K80JtsJWxXRL00cv6tRj3oc,98
|
3
3
|
hpcflow/__pyinstaller/hook-hpcflow.py,sha256=SeMopsPkhCyd9gqIrzwFNRj3ZlkUlUYl-74QYz61mo4,1089
|
4
|
-
hpcflow/_version.py,sha256=
|
4
|
+
hpcflow/_version.py,sha256=r8ptXPZcFJexuxp2d9u747EhQ1a07r3A3SkNJOWkTjw,26
|
5
5
|
hpcflow/app.py,sha256=GQsMq_sjjXxMLLiIPF1ZvyapW_7IgsxALCCwMiqmC8I,1520
|
6
6
|
hpcflow/cli.py,sha256=G2J3D9v6MnMWOWMMWK6UEKLn_6wnV9lT_qygEBBxg-I,66
|
7
7
|
hpcflow/data/demo_data_manifest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -47,7 +47,7 @@ hpcflow/sdk/core/__init__.py,sha256=GcIklEsXy3M5PWpmxyhd2KoI0u6HjXRIjD_aR1bgRjo,
|
|
47
47
|
hpcflow/sdk/core/actions.py,sha256=ad8oQlLL_wxXnurao0ABLLKm0yA4lHyoBwR06PAk8Jg,74184
|
48
48
|
hpcflow/sdk/core/command_files.py,sha256=oEW6g6f_cQFmRAgP1DTWPZPhufXcRi56yJZWaS8fU28,18161
|
49
49
|
hpcflow/sdk/core/commands.py,sha256=-Tiu7zVVwWr1xiTXVB9oH3E4g09ebRRtHSRrMdFDCRY,12060
|
50
|
-
hpcflow/sdk/core/element.py,sha256=
|
50
|
+
hpcflow/sdk/core/element.py,sha256=S7MMXycpQXNbXZ_HyXICM8zMW4RRC32k5SDb9UbXQj8,45614
|
51
51
|
hpcflow/sdk/core/environment.py,sha256=DGUz1NvliKh6opP0IueGHD69rn_8wFLhDsq6kAmEgM4,4849
|
52
52
|
hpcflow/sdk/core/errors.py,sha256=AaJWGyKUuHlAAP2LcVIg7D7aw2noL06G4OzP89sUcxU,8712
|
53
53
|
hpcflow/sdk/core/json_like.py,sha256=LRZsUd1tn8zXC8fESeiXs7Eko-VdnB8zcXiqixKVcZM,18874
|
@@ -79,20 +79,20 @@ hpcflow/sdk/helper/helper.py,sha256=MkjYKHox1F4XOpy-20sCCDUTWUbQY84QpWZkcpSq9n8,
|
|
79
79
|
hpcflow/sdk/helper/watcher.py,sha256=hLqgwXtZw-6ihNUUcWYnZw8TCyD_AdhYE7abOrO2r_0,4003
|
80
80
|
hpcflow/sdk/log.py,sha256=VVxBnV0B_mcCTK3WrpEICAe-gnZsxoomafuOEGgO0TI,5735
|
81
81
|
hpcflow/sdk/persistence/__init__.py,sha256=IzWycfiO6rDn_7Kocw4Df5ETe9BSoaqqxG7Yp4FW_ls,900
|
82
|
-
hpcflow/sdk/persistence/base.py,sha256=
|
83
|
-
hpcflow/sdk/persistence/json.py,sha256=
|
84
|
-
hpcflow/sdk/persistence/pending.py,sha256=
|
82
|
+
hpcflow/sdk/persistence/base.py,sha256=XkvxWLhy1Oo12sjtZbLHTMM_DLaWzOknnuEiinyp_nk,56473
|
83
|
+
hpcflow/sdk/persistence/json.py,sha256=e6LgaDdHg3SsBfgip315FFJqqr0r2JL6eJFJX4qsTGQ,20358
|
84
|
+
hpcflow/sdk/persistence/pending.py,sha256=FBKaPnD97iOjVQxMBMKmNapmRfMc02wEW5x55AWQXm8,23491
|
85
85
|
hpcflow/sdk/persistence/store_resource.py,sha256=oEyocRqa8Uym-57UFosrwate-Xw9O7i2FM82TxHc4m0,4307
|
86
86
|
hpcflow/sdk/persistence/utils.py,sha256=woLFUXYkdZQqXeBcoDjVuPEq2xdaWVhGO0YP6Qvc2Ww,1517
|
87
|
-
hpcflow/sdk/persistence/zarr.py,sha256=
|
87
|
+
hpcflow/sdk/persistence/zarr.py,sha256=fz4vvGE2AOXvAjbe-FjIQfRxNBZNRqcGMkq4EQ9sMw0,43579
|
88
88
|
hpcflow/sdk/runtime.py,sha256=-n8OHcbhSVCGGlyWcJvadpsUAIJzzuWVXkZav1RQSio,9555
|
89
89
|
hpcflow/sdk/submission/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
90
90
|
hpcflow/sdk/submission/jobscript.py,sha256=XoFiD6qbWOVG30bRtiAfys-erTbv4g6PWGRxSux0kP4,44170
|
91
91
|
hpcflow/sdk/submission/jobscript_info.py,sha256=PsaOENLpp2OUKTQO3wRO64TPOgvzdFh9gfNu56X-uBw,1164
|
92
|
-
hpcflow/sdk/submission/schedulers/__init__.py,sha256=
|
92
|
+
hpcflow/sdk/submission/schedulers/__init__.py,sha256=sLhK3Usr0gMrKMlbwthIwhT3aSSRwciJFDAMrNWLMLk,2636
|
93
93
|
hpcflow/sdk/submission/schedulers/direct.py,sha256=J4naNvWJ_4UfjiXu46cdM4qI19p2mKSGngLaD2wKU3s,5539
|
94
|
-
hpcflow/sdk/submission/schedulers/sge.py,sha256=
|
95
|
-
hpcflow/sdk/submission/schedulers/slurm.py,sha256=
|
94
|
+
hpcflow/sdk/submission/schedulers/sge.py,sha256=ZciDi9YcGcQhGrEZeKMfVaDQEK70Sthz9DNc1XDRqXA,10900
|
95
|
+
hpcflow/sdk/submission/schedulers/slurm.py,sha256=epZDlKhtEafFmE4BPRag7UwwyjIcaYmblYfMX7qioWA,22404
|
96
96
|
hpcflow/sdk/submission/schedulers/utils.py,sha256=Ar3DYO6pmS9S-gZWBCsB6afHvgaReqgAaQ719NWGd2U,364
|
97
97
|
hpcflow/sdk/submission/shells/__init__.py,sha256=dN5pg-5OoeTlqOMtK-0N4ZxbLUgzjIm__dnPnKxAA1k,1169
|
98
98
|
hpcflow/sdk/submission/shells/base.py,sha256=AszYb14J7QMHlttRFdM9GJkzf6USERhfWJ10jwppAb8,2302
|
@@ -136,7 +136,7 @@ hpcflow/tests/unit/test_runtime.py,sha256=HjHPTS3UkX1LcwheFgpp4px_VlRis8KAE2Hoeq
|
|
136
136
|
hpcflow/tests/unit/test_schema_input.py,sha256=spkTtvNuheh-y29Tsx7YRX6y3dV80vXx0hcg0jVfMp4,12084
|
137
137
|
hpcflow/tests/unit/test_shell.py,sha256=FDtQ9fHRhSKiVtxMJ8BRisoeSvvk8zmJndTB4LlhqGc,3442
|
138
138
|
hpcflow/tests/unit/test_slurm.py,sha256=ewfNuXXUEEelAxcd7MBbAQ-RCvU8xBenHTAyfXYF-R0,1064
|
139
|
-
hpcflow/tests/unit/test_submission.py,sha256=
|
139
|
+
hpcflow/tests/unit/test_submission.py,sha256=fPemvWs7rMelKW_2ctEUUjnckGQFXgDzlFRYVY19eJs,16659
|
140
140
|
hpcflow/tests/unit/test_task.py,sha256=94TwyjlhKMRRXTQjys2a1PiK7A-rCzhnvrkk4vRz39I,70000
|
141
141
|
hpcflow/tests/unit/test_task_schema.py,sha256=7a7o42gQhrZPMXfH0a6sGzFCJnuFrbDEl9u3u_bFsgw,3624
|
142
142
|
hpcflow/tests/unit/test_utils.py,sha256=aWfhGDJWGlBfk7yi0hcrPlcd159MX0V0MwsndureeP8,13466
|
@@ -146,7 +146,7 @@ hpcflow/tests/unit/test_workflow_template.py,sha256=EItRqUyXpU2z_z1rvpRqa848YOkX
|
|
146
146
|
hpcflow/tests/workflows/test_jobscript.py,sha256=9sp1o0g72JZbv2QlOl5v7wCZEFjotxiIKGNUxVaFgaA,724
|
147
147
|
hpcflow/tests/workflows/test_workflows.py,sha256=xai6FRtGqG4lStJk6KmsqPUSuvqs9FrsBOxMVALshIs,13400
|
148
148
|
hpcflow/viz_demo.ipynb,sha256=1QdnVsk72vihv2L6hOGyk318uEa22ZSgGxQCa7hW2oo,6238
|
149
|
-
hpcflow_new2-0.2.
|
150
|
-
hpcflow_new2-0.2.
|
151
|
-
hpcflow_new2-0.2.
|
152
|
-
hpcflow_new2-0.2.
|
149
|
+
hpcflow_new2-0.2.0a158.dist-info/METADATA,sha256=wxcx45hPRHvCWTzK0ngk9acWCwIuSkheHwf0A3VEcBI,2516
|
150
|
+
hpcflow_new2-0.2.0a158.dist-info/WHEEL,sha256=kLuE8m1WYU0Ig0_YEGrXyTtiJvKPpLpDEiChiNyei5Y,88
|
151
|
+
hpcflow_new2-0.2.0a158.dist-info/entry_points.txt,sha256=aoGtCnFdfPcXfBdu2zZyMOJoz6fPgdR0elqsgrE-USU,106
|
152
|
+
hpcflow_new2-0.2.0a158.dist-info/RECORD,,
|
File without changes
|
File without changes
|