hpcflow-new2 0.2.0a207__py3-none-any.whl → 0.2.0a208__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.0a207"
1
+ __version__ = "0.2.0a208"
@@ -0,0 +1,12 @@
1
+ import h5py # type: ignore[import-untyped]
2
+
3
+
4
+ def main_script_test_hdf5_in_obj_group(_input_files):
5
+ # read inputs
6
+ with h5py.File(_input_files["hdf5"], mode="r") as fh:
7
+ all_a = [p1c_dat.attrs["a"].item() for p1c_dat in fh["p1c"].values()]
8
+
9
+ # process
10
+ p2 = sum(all_a) + 100
11
+
12
+ return {"p2": p2}
@@ -988,7 +988,7 @@ class ElementActionRun(AppAware):
988
988
  try:
989
989
  assert isinstance(v, ParameterValue)
990
990
  v.dump_to_HDF5_group(grp_k)
991
- except AttributeError:
991
+ except AssertionError:
992
992
  # probably an element group (i.e. v is a list of `ParameterValue`
993
993
  # objects):
994
994
  assert isinstance(v, list)
@@ -66,10 +66,11 @@ class _ElementPrefixedParameter(AppAware):
66
66
 
67
67
  def __getattr__(self, name: str) -> ElementParameter | Mapping[str, ElementParameter]:
68
68
  if name not in self.prefixed_names_unlabelled:
69
- raise ValueError(
70
- f"No {self._prefix} named {name!r}. Available {self._prefix} are: "
71
- f"{self.prefixed_names_unlabelled_str}."
72
- )
69
+ if names_str := self.prefixed_names_unlabelled_str:
70
+ msg_info = f"Available {self._prefix} are: {names_str}."
71
+ else:
72
+ msg_info = f"There are no {self._prefix} available."
73
+ raise ValueError(f"No {self._prefix} named {name!r}. {msg_info}")
73
74
 
74
75
  if labels := self.prefixed_names_unlabelled.get(name):
75
76
  # is multiple; return a dict of `ElementParameter`s
@@ -14,7 +14,7 @@ if TYPE_CHECKING:
14
14
  from .object_list import WorkflowLoopList
15
15
  from .parameters import InputSource, ValueSequence, SchemaInput
16
16
  from .types import ScriptData
17
- from .task import WorkflowTask
17
+ from .task import WorkflowTask, Task
18
18
 
19
19
 
20
20
  class InputValueDuplicateSequenceAddress(ValueError):
@@ -94,10 +94,12 @@ class MissingInputs(Exception):
94
94
 
95
95
  # TODO: add links to doc pages for common user-exceptions?
96
96
 
97
- def __init__(self, missing_inputs: Iterable[str]) -> None:
97
+ def __init__(self, task: Task, missing_inputs: Iterable[str]) -> None:
98
98
  self.missing_inputs = tuple(missing_inputs)
99
99
  missing_str = ", ".join(map(repr, missing_inputs))
100
- super().__init__(f"The following inputs have no sources: {missing_str}.")
100
+ super().__init__(
101
+ f"Task {task.name}: the following inputs have no sources: {missing_str}."
102
+ )
101
103
 
102
104
 
103
105
  class UnrequiredInputSources(ValueError):
@@ -43,7 +43,7 @@ if TYPE_CHECKING:
43
43
  from collections.abc import Iterable, Iterator, Mapping
44
44
  from typing import Any, ClassVar, Literal
45
45
  from typing_extensions import Self, TypeAlias
46
- from h5py import Group # type: ignore
46
+ from h5py import Group as HDF5Group # type: ignore
47
47
  from numpy.typing import NDArray
48
48
  from ..app import BaseApp
49
49
  from ..typing import ParamSource
@@ -116,21 +116,21 @@ class ParameterValue:
116
116
  """
117
117
  raise NotImplementedError
118
118
 
119
- def dump_to_HDF5_group(self, group: Group):
119
+ def dump_to_HDF5_group(self, group: HDF5Group):
120
120
  """
121
121
  Write this parameter value to an HDF5 group.
122
122
  """
123
123
  raise NotImplementedError
124
124
 
125
125
  @classmethod
126
- def dump_element_group_to_HDF5_group(cls, objs: list[ParameterValue], group: Group):
126
+ def dump_element_group_to_HDF5_group(cls, objs: list[Self], group: HDF5Group):
127
127
  """
128
128
  Write a list (from an element group) of parameter values to an HDF5 group.
129
129
  """
130
130
  raise NotImplementedError
131
131
 
132
132
  @classmethod
133
- def save_from_HDF5_group(cls, group: Group, param_id: int, workflow: Workflow):
133
+ def save_from_HDF5_group(cls, group: HDF5Group, param_id: int, workflow: Workflow):
134
134
  """
135
135
  Extract a parameter value from an HDF5 group.
136
136
  """
hpcflow/sdk/core/task.py CHANGED
@@ -2217,7 +2217,7 @@ class WorkflowTask(AppAware):
2217
2217
  self.__enforce_some_sanity(sources_by_task, element_set)
2218
2218
 
2219
2219
  if missing:
2220
- raise MissingInputs(missing)
2220
+ raise MissingInputs(self.template, missing)
2221
2221
  return padded_elem_iters
2222
2222
 
2223
2223
  def __enforce_some_sanity(
@@ -13,8 +13,8 @@ from hpcflow.sdk.typing import hydrate
13
13
 
14
14
  if TYPE_CHECKING:
15
15
  from collections.abc import Iterable, Mapping
16
- from typing_extensions import TypeAlias
17
- from h5py import Group as HDFSGroup # type: ignore
16
+ from typing_extensions import TypeAlias, Self
17
+ from h5py import Group as HDF5Group # type: ignore
18
18
  from .actions import Action
19
19
  from .element import ElementGroup
20
20
  from .loop import Loop
@@ -272,7 +272,7 @@ class P1_sub_parameter_cls(ParameterValue):
272
272
  def prepare_JSON_dump(self) -> dict[str, Any]:
273
273
  return {"e": self.e}
274
274
 
275
- def dump_to_HDF5_group(self, group: HDFSGroup):
275
+ def dump_to_HDF5_group(self, group: HDF5Group):
276
276
  group.attrs["e"] = self.e
277
277
 
278
278
 
@@ -376,7 +376,7 @@ class P1_parameter_cls(ParameterValue):
376
376
  sub_param_js = self.sub_param.prepare_JSON_dump() if self.sub_param else None
377
377
  return {"a": self.a, "d": self.d, "sub_param": sub_param_js}
378
378
 
379
- def dump_to_HDF5_group(self, group: HDFSGroup):
379
+ def dump_to_HDF5_group(self, group: HDF5Group):
380
380
  group.attrs["a"] = self.a
381
381
  if self.d is not None:
382
382
  group.attrs["d"] = self.d
@@ -384,13 +384,28 @@ class P1_parameter_cls(ParameterValue):
384
384
  sub_group = group.create_group("sub_param")
385
385
  self.sub_param.dump_to_HDF5_group(sub_group)
386
386
 
387
+ @classmethod
388
+ def dump_element_group_to_HDF5_group(self, objs: list[Self], group: HDF5Group):
389
+ """
390
+ Write a list (from an element group) of parameter values to an HDF5 group.
391
+ """
392
+
393
+ for obj_idx, p1_obj in enumerate(objs):
394
+ grp_i = group.create_group(f"{obj_idx}")
395
+ grp_i.attrs["a"] = p1_obj.a
396
+ if p1_obj.d is not None:
397
+ group.attrs["d"] = p1_obj.d
398
+ if p1_obj.sub_param:
399
+ sub_group = grp_i.create_group("sub_param")
400
+ p1_obj.sub_param.dump_to_HDF5_group(sub_group)
401
+
387
402
  @classmethod
388
403
  def save_from_JSON(cls, data: dict, param_id: int | list[int], workflow: Workflow):
389
404
  obj = cls(**data) # TODO: pass sub-param
390
405
  workflow.set_parameter_value(param_id=param_id, value=obj, commit=True)
391
406
 
392
407
  @classmethod
393
- def save_from_HDF5_group(cls, group: HDFSGroup, param_id: int, workflow: Workflow):
408
+ def save_from_HDF5_group(cls, group: HDF5Group, param_id: int, workflow: Workflow):
394
409
  a = group.attrs["a"].item()
395
410
  if "d" in group.attrs:
396
411
  d = group.attrs["d"].item()
@@ -458,6 +458,50 @@ def test_script_hdf5_in_obj(null_config, tmp_path: Path, combine_scripts: bool):
458
458
  assert p2.value == a_val + 100
459
459
 
460
460
 
461
+ @pytest.mark.integration
462
+ @pytest.mark.skipif("hf.run_time_info.is_frozen")
463
+ @pytest.mark.parametrize("combine_scripts", [False, True])
464
+ def test_script_hdf5_in_obj_group(null_config, tmp_path: Path, combine_scripts: bool):
465
+ s0 = hf.TaskSchema(
466
+ objective="define_p1c",
467
+ inputs=[hf.SchemaInput(parameter=hf.Parameter("p1c"))],
468
+ )
469
+ s1 = hf.TaskSchema(
470
+ objective="t1",
471
+ inputs=[hf.SchemaInput(parameter=hf.Parameter("p1c"), group="my_group")],
472
+ outputs=[hf.SchemaOutput(parameter=hf.Parameter("p2"))],
473
+ actions=[
474
+ hf.Action(
475
+ script="<<script:main_script_test_hdf5_in_obj_group.py>>",
476
+ script_data_in="hdf5",
477
+ script_data_out="direct",
478
+ script_exe="python_script",
479
+ environments=[hf.ActionEnvironment(environment="python_env")],
480
+ requires_dir=True,
481
+ )
482
+ ],
483
+ parameter_class_modules=["hpcflow.sdk.core.test_utils"],
484
+ )
485
+ a_vals = (1, 2)
486
+ t0 = hf.Task(
487
+ schema=s0,
488
+ sequences=[hf.ValueSequence(path="inputs.p1c", values=[P1(a=i) for i in a_vals])],
489
+ groups=[hf.ElementGroup("my_group")],
490
+ )
491
+ t1 = hf.Task(schema=s1)
492
+ wk = hf.Workflow.from_template_data(
493
+ tasks=[t0, t1],
494
+ template_name="main_script_test",
495
+ path=tmp_path,
496
+ resources={"any": {"combine_scripts": combine_scripts}},
497
+ )
498
+ wk.submit(wait=True, add_to_known=False, status=False)
499
+
500
+ p2 = wk.tasks[1].elements[0].outputs.p2
501
+ assert isinstance(p2, hf.ElementParameter)
502
+ assert p2.value == sum(a_vals) + 100
503
+
504
+
461
505
  @pytest.mark.integration
462
506
  @pytest.mark.skipif("hf.run_time_info.is_frozen")
463
507
  @pytest.mark.parametrize("combine_scripts", [False, True])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: hpcflow-new2
3
- Version: 0.2.0a207
3
+ Version: 0.2.0a208
4
4
  Summary: Computational workflow management
5
5
  License: MPL-2.0
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=P2b-8QdQqkSS7cJB6CB3CudUuJ9iZzTh2fQF4hNdCa4,1118
4
- hpcflow/_version.py,sha256=KznvFP2-RqfaLYFjGRIq-cjLHrJRFJuxyroYBl__DWs,26
4
+ hpcflow/_version.py,sha256=vL0IzortUjskEsZDLgY-9fJufiwBTmivGzqqjcD05aw,26
5
5
  hpcflow/app.py,sha256=gl2viVS65PbpDhUp2DARaYHFDqDWQjuoyB3ikrCNRW4,1367
6
6
  hpcflow/cli.py,sha256=G2J3D9v6MnMWOWMMWK6UEKLn_6wnV9lT_qygEBBxg-I,66
7
7
  hpcflow/data/demo_data_manifest/__init__.py,sha256=Hsq0jT8EXM13wu1MpGy5FQgyuz56ygep4VWOnulFn50,41
@@ -37,6 +37,7 @@ hpcflow/data/scripts/main_script_test_direct_in_group_one_fail_direct_out_3.py,s
37
37
  hpcflow/data/scripts/main_script_test_direct_sub_param_in_direct_out.py,sha256=pQ-BD1FmqTIHeCaAakCr1M61cWb1Fjinzr1qA3HX3ik,131
38
38
  hpcflow/data/scripts/main_script_test_hdf5_in_obj.py,sha256=WMRuzwkU4WFLrmUGD0999IowHY1y7cLeS2iuR2R7Dqo,265
39
39
  hpcflow/data/scripts/main_script_test_hdf5_in_obj_2.py,sha256=SCDkTctGAaHAOWxijVNs59SVsL6YiaIttNN43noPpis,255
40
+ hpcflow/data/scripts/main_script_test_hdf5_in_obj_group.py,sha256=ACIHdsp6Q7-TsE2P0uiaFhSy9E92PGoRqDE8mnpbmOQ,318
40
41
  hpcflow/data/scripts/main_script_test_hdf5_out_obj.py,sha256=nV_U5DA2xAeV1z9TLyIOUu3rfI2AZSFteFSbGVHQnFE,299
41
42
  hpcflow/data/scripts/main_script_test_json_and_direct_in_json_out.py,sha256=Y1kpKu59DbjqKW2i4QcmfHzdXYmiAEvNzqIqBU_Z4fg,336
42
43
  hpcflow/data/scripts/main_script_test_json_in_json_and_direct_out.py,sha256=jjiceG1d6saMWOYZIHfK1pJIWhwyNRAQeZgy49NC5LU,374
@@ -73,27 +74,27 @@ hpcflow/sdk/config/config_file.py,sha256=wfDjozV9lXTnaxQoe-z-1Y7dtO0N4o1kgEwKtrL
73
74
  hpcflow/sdk/config/errors.py,sha256=Ft0e0rqIh9NoxWu3R8RSHel2fLONrXrgmFdNGZ_nOac,8341
74
75
  hpcflow/sdk/config/types.py,sha256=hw8latN2PqgGB_cOcD2pmgf5hSE7Dl94xLGKosydpCo,3935
75
76
  hpcflow/sdk/core/__init__.py,sha256=uxvGIUmzvFvylxFL4OGoKHs8GABHHPFaki-Xyc7Nquk,861
76
- hpcflow/sdk/core/actions.py,sha256=jSnOCJFe9_gL0JFE73Q6tLJnQeqfkit9526xry4fFLY,118219
77
+ hpcflow/sdk/core/actions.py,sha256=379uJT_fScwa-n_aEGd-DlXzZpFLFWkctxnMa-u4Y0U,118219
77
78
  hpcflow/sdk/core/app_aware.py,sha256=A5L9U_wcf9eleuDj1vxZMai1Fk7FLNdMjzA-ay1hHeE,568
78
79
  hpcflow/sdk/core/cache.py,sha256=FNOaZzZmtcoFwByR39kI65XdbO6i6qpYup9qrwUN-YM,8172
79
80
  hpcflow/sdk/core/command_files.py,sha256=9YbQuOfa0HrAZcAtgH8_k3oJRfRVRpv5QtZ9Uag9W2I,24961
80
81
  hpcflow/sdk/core/commands.py,sha256=vFyZ9Cv_tvGqSGtVEnAHAeXA-HAxWoF0nmf1e0bFCvs,15993
81
- hpcflow/sdk/core/element.py,sha256=n2_val24HFwIGiVm1xikVOXbTQ69neO8YzRWZ48VYaQ,68295
82
+ hpcflow/sdk/core/element.py,sha256=VVk-lt03kN-vk38jhuzTV8GcPKWKyziXS2gbDA9mTBQ,68412
82
83
  hpcflow/sdk/core/enums.py,sha256=b0Zd35AdEEfQYWIO0IHc---hqcWyQ3HC35vGWbzB7sA,4386
83
84
  hpcflow/sdk/core/environment.py,sha256=vvHJhdI8Jeae20AGvbp0DY-Wm7efNFlAkkcLESKljFQ,7955
84
- hpcflow/sdk/core/errors.py,sha256=E5UZrarHi5_adxGs7v_MfKugu8blXdRSHK71WbdzCUE,28724
85
+ hpcflow/sdk/core/errors.py,sha256=5Bjk1w8FdVP4X7oFCNtzxJ_q4uaSZfQausZkWvYMkS4,28782
85
86
  hpcflow/sdk/core/execute.py,sha256=Gc2SauA4QNA1W4Gi2FYoKoqkoJtGg57cgn1p87WNCIs,7221
86
87
  hpcflow/sdk/core/json_like.py,sha256=f3Q1lxebn79nHIIQ2iRw9MbIDByGmdnlGp4yW39p-9g,29479
87
88
  hpcflow/sdk/core/loop.py,sha256=1GRUerSIAQ30KDi1-0M5gNiwzslSnmTTshLYUHwIMn0,50083
88
89
  hpcflow/sdk/core/loop_cache.py,sha256=C0t9UpvHFdTmw3bViZ2wccjZWtkbSbN9APvcwzBSREg,10801
89
90
  hpcflow/sdk/core/object_list.py,sha256=eX6jcJNlXcbiu3LMnU6kGOkBeUB9WUh9vrGsv97DInk,29906
90
- hpcflow/sdk/core/parameters.py,sha256=qN_Lg8nleKOJutt3JiifNCnT5TvALi8D9eWFbRVz3r4,97812
91
+ hpcflow/sdk/core/parameters.py,sha256=fljEF6pfzPcLqTonDPC5q7OWPS31ib8Fc9DWQMK1rhw,97827
91
92
  hpcflow/sdk/core/rule.py,sha256=LiNyKp09a6TRGJvtiB1CcNqgyAIuPhuSW2RVfDWf5FE,6274
92
93
  hpcflow/sdk/core/run_dir_files.py,sha256=yh49BSlswqqyr97x5nDT87qu2MlOLMu7Arzl_B-fxy0,2061
93
94
  hpcflow/sdk/core/skip_reason.py,sha256=xPm8bd8sbPpiZ3sx9ZeW0jxgRQ0TBokSv0XIJKrEW2Y,113
94
- hpcflow/sdk/core/task.py,sha256=irMSVwfqUJYq6dYtoozGoKK3TKyic4im5XQb2N9i4Zw,142577
95
+ hpcflow/sdk/core/task.py,sha256=0aqkwP-idjD5OYU-TLzVtjTdIVotb6ayAEzGGjM6sm0,142592
95
96
  hpcflow/sdk/core/task_schema.py,sha256=Aw13WNLutU_nIJknC9noJyEFkpxMLz3cN7ojIMgwZqI,38843
96
- hpcflow/sdk/core/test_utils.py,sha256=7AWsJhJScYVzgx2edUkn1jTog1fKL54S6w_BERTEDpE,13172
97
+ hpcflow/sdk/core/test_utils.py,sha256=UXe8P-1b_6Pn6vdgJfMVsTGJdVI65TZ2mSUgWHlVnnc,13766
97
98
  hpcflow/sdk/core/types.py,sha256=y07Z6xbagPy45P4FfSu-Sv6q2Caeo9886L5JjWYaEOg,13030
98
99
  hpcflow/sdk/core/utils.py,sha256=P3JBrPS9ZM0sKrrihxaQScdFVX6ePSYQB5Rfbboo8CM,36316
99
100
  hpcflow/sdk/core/validation.py,sha256=PtM-3j5_mzp79DObgsWeJOZjOOJPKqkwWgeyDAVuAf0,1926
@@ -161,7 +162,7 @@ hpcflow/tests/schedulers/direct_linux/test_direct_linux_submission.py,sha256=pgH
161
162
  hpcflow/tests/schedulers/sge/test_sge_submission.py,sha256=NKO2wBR9AOW8chEBW2nZ9OyDMa_8xZWDw16gtg5g-C8,1107
162
163
  hpcflow/tests/schedulers/slurm/test_slurm_submission.py,sha256=Hcok40_hWb68T0hFzODcmzXr10M6WavLD3qiyzjcNOI,493
163
164
  hpcflow/tests/scripts/test_input_file_generators.py,sha256=zyM_0AXFDCHMO75GC3we__z4KeqcF5s7MFw2MJfeDec,9960
164
- hpcflow/tests/scripts/test_main_scripts.py,sha256=T_jKsD323RJJ1x8OaCr2XH_Y4cALX229yAybnDHZa9U,46295
165
+ hpcflow/tests/scripts/test_main_scripts.py,sha256=qj4tg5s9Ii-n9b0bbWHAAGeXIoCPBZDhEMYH9LoAmbk,47911
165
166
  hpcflow/tests/scripts/test_non_snippet_script.py,sha256=XFn34lLxd8iL03a4OIY9pbT5NWbjswDcjp2jaQF2ICU,1304
166
167
  hpcflow/tests/scripts/test_ouput_file_parsers.py,sha256=gB6W1stp5TdoRjupbvt6_Ufs1TsOQwTUS5oHif4P3c8,12092
167
168
  hpcflow/tests/shells/wsl/test_wsl_submission.py,sha256=L9TChOSwLKGIcHrfNno843SNpNWopgHY7Ptc_HzMEtA,1069
@@ -215,8 +216,8 @@ hpcflow/tests/workflows/test_submission.py,sha256=SUbBUbD8C8LSulrI7aETkzP9RqED48
215
216
  hpcflow/tests/workflows/test_workflows.py,sha256=9z3rtXjA5iMOp4C0q4TkD_9kLzwourCY-obpeOtnNt0,18927
216
217
  hpcflow/tests/workflows/test_zip.py,sha256=MzEwsIAYV_1A3bD0XRo23zUwUKVzkkmNd8_cil6YdWQ,578
217
218
  hpcflow/viz_demo.ipynb,sha256=6D9uBbWK3oMfbaf93Tnv5riFPtW-2miUTWNr9kGcnd4,228913
218
- hpcflow_new2-0.2.0a207.dist-info/LICENSE,sha256=Xhxf_KsrJNJFGMogumZhXSTPhUOVHCWf7nU-TDzqg0E,16763
219
- hpcflow_new2-0.2.0a207.dist-info/METADATA,sha256=zhJ-9B36m2gRh-tUh8wCKfHzerHXdc3v_reUMAH0q1g,2671
220
- hpcflow_new2-0.2.0a207.dist-info/WHEEL,sha256=kLuE8m1WYU0Ig0_YEGrXyTtiJvKPpLpDEiChiNyei5Y,88
221
- hpcflow_new2-0.2.0a207.dist-info/entry_points.txt,sha256=aoGtCnFdfPcXfBdu2zZyMOJoz6fPgdR0elqsgrE-USU,106
222
- hpcflow_new2-0.2.0a207.dist-info/RECORD,,
219
+ hpcflow_new2-0.2.0a208.dist-info/LICENSE,sha256=Xhxf_KsrJNJFGMogumZhXSTPhUOVHCWf7nU-TDzqg0E,16763
220
+ hpcflow_new2-0.2.0a208.dist-info/METADATA,sha256=bFA3B3L4JMaPEyabyXQgyxcoOmt7Wp9qZEN2gwmFva0,2671
221
+ hpcflow_new2-0.2.0a208.dist-info/WHEEL,sha256=kLuE8m1WYU0Ig0_YEGrXyTtiJvKPpLpDEiChiNyei5Y,88
222
+ hpcflow_new2-0.2.0a208.dist-info/entry_points.txt,sha256=aoGtCnFdfPcXfBdu2zZyMOJoz6fPgdR0elqsgrE-USU,106
223
+ hpcflow_new2-0.2.0a208.dist-info/RECORD,,