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 CHANGED
@@ -1 +1 @@
1
- __version__ = "0.2.0a156"
1
+ __version__ = "0.2.0a158"
@@ -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
- self.scheduler_args = {**cfg_sched.get("defaults", {}), **self.scheduler_args}
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
@@ -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 None
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 is None:
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 = dict(sorted({**self.source, **src}.items()))
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
  )
@@ -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 _update_parameter_source(self, param_id: int, src: Dict):
281
- """Update the source of a persistent parameter."""
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
- param = self._get_persistent_parameters([param_id])[param_id]
284
- param = param.update_source(src)
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
- params["sources"][str(param_id)] = param.source
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
- for param_id, (value, is_file) in self.set_parameters.items():
353
- # TODO: could be batched up?
354
- self.logger.debug(f"commit: setting value of parameter ID {param_id!r}.")
355
- self.store._set_parameter_value(param_id, value, is_file)
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
- for param_id, src in self.update_param_sources.items():
377
- # TODO: could be batched up?
378
- self.logger.debug(f"commit: updating source of parameter ID {param_id!r}.")
379
- self.store._update_parameter_source(param_id, src)
380
- self.clear_update_param_sources()
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:
@@ -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=self._get_parameter_user_array_group(mode="r+"),
677
+ root_group=param_encode_root_group,
667
678
  arr_path=self._param_data_arr_grp_name(param_i.id_),
668
679
  )
669
- base_arr.append([dat_i])
670
- src_arr.append([dict(sorted(param_i.source.items()))])
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 _update_parameter_source(self, param_id: int, src: Dict):
691
- """Update the source of a persistent parameter."""
707
+ def _set_parameter_values(self, set_parameters: Dict[int, Tuple[Any, bool]]):
708
+ """Set multiple unset persistent parameters."""
692
709
 
693
- param_i = self._get_persistent_parameters([param_id])[param_id]
694
- param_i = param_i.update_source(src)
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
- # no need to update base array:
737
+ param_ids = list(sources.keys())
697
738
  src_arr = self._get_parameter_sources_array(mode="r+")
698
- src_arr[param_id] = param_i.source
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
- return self._get_parameter_group(mode=mode).get(self._param_base_arr_name)
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
- opts.extend([f"{self.js_cmd} {opt}" for opt in self.options])
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
- opts.extend([f"{self.js_cmd} {opt}" for opt in self.options])
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,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: hpcflow-new2
3
- Version: 0.2.0a156
3
+ Version: 0.2.0a158
4
4
  Summary: Computational workflow management
5
5
  License: MIT
6
6
  Author: aplowman
@@ -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=hIoMm5ojG_YRRzcmbye_3NpTvZ051KBnJaOd1DAInzU,26
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=nKKvUDP-rLECq-1nP4Fv0OfUA7GKmE3df37ku0ZyKzQ,45408
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=MN-ZlQLZ_q6WGlUz0JiDYGG4x3gvUV_2MfOvQ3sMecE,56283
83
- hpcflow/sdk/persistence/json.py,sha256=aWj5R9PsGzudkD5N85W3vQF2tifekgnAbAtw-OK6ixg,19465
84
- hpcflow/sdk/persistence/pending.py,sha256=Ub4m4ng2x9oDTR2h6PoBJiUZKLwmMYprJ5hdI3FQ2r0,23498
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=FIuufyaQJ6guGonmbc5a6-gGGXvalaLSbzPNolLDv3U,41592
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=4DJBmYNXC9GWuQXC3Ank64V6TBURLqtngb_okLuI9GY,2636
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=k9K8Ai5IIXj8-nZn75jj7a3Hv7bklSLTETbfE4MLvi0,10612
95
- hpcflow/sdk/submission/schedulers/slurm.py,sha256=tN3-92Nh0DjDnEEhWN8iu6eBrA0t8Gs_IfQlR8rYRgw,22116
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=E8ku48TeCpAQlYDci30D-hf0YvzbT3jpm-emAaS02Is,15764
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.0a156.dist-info/METADATA,sha256=whrUKGf2XT9ab-U9YZVs4-iKE6HVoFuqBhsVOmOOKkU,2516
150
- hpcflow_new2-0.2.0a156.dist-info/WHEEL,sha256=kLuE8m1WYU0Ig0_YEGrXyTtiJvKPpLpDEiChiNyei5Y,88
151
- hpcflow_new2-0.2.0a156.dist-info/entry_points.txt,sha256=aoGtCnFdfPcXfBdu2zZyMOJoz6fPgdR0elqsgrE-USU,106
152
- hpcflow_new2-0.2.0a156.dist-info/RECORD,,
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,,