hpcflow 0.1.9__py3-none-any.whl → 0.2.0a271__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.
Files changed (275) hide show
  1. hpcflow/__init__.py +2 -11
  2. hpcflow/__pyinstaller/__init__.py +5 -0
  3. hpcflow/__pyinstaller/hook-hpcflow.py +40 -0
  4. hpcflow/_version.py +1 -1
  5. hpcflow/app.py +43 -0
  6. hpcflow/cli.py +2 -462
  7. hpcflow/data/demo_data_manifest/__init__.py +3 -0
  8. hpcflow/data/demo_data_manifest/demo_data_manifest.json +6 -0
  9. hpcflow/data/jinja_templates/test/test_template.txt +8 -0
  10. hpcflow/data/programs/hello_world/README.md +1 -0
  11. hpcflow/data/programs/hello_world/hello_world.c +87 -0
  12. hpcflow/data/programs/hello_world/linux/hello_world +0 -0
  13. hpcflow/data/programs/hello_world/macos/hello_world +0 -0
  14. hpcflow/data/programs/hello_world/win/hello_world.exe +0 -0
  15. hpcflow/data/scripts/__init__.py +1 -0
  16. hpcflow/data/scripts/bad_script.py +2 -0
  17. hpcflow/data/scripts/demo_task_1_generate_t1_infile_1.py +8 -0
  18. hpcflow/data/scripts/demo_task_1_generate_t1_infile_2.py +8 -0
  19. hpcflow/data/scripts/demo_task_1_parse_p3.py +7 -0
  20. hpcflow/data/scripts/do_nothing.py +2 -0
  21. hpcflow/data/scripts/env_specifier_test/input_file_generator_pass_env_spec.py +4 -0
  22. hpcflow/data/scripts/env_specifier_test/main_script_test_pass_env_spec.py +8 -0
  23. hpcflow/data/scripts/env_specifier_test/output_file_parser_pass_env_spec.py +4 -0
  24. hpcflow/data/scripts/env_specifier_test/v1/input_file_generator_basic.py +4 -0
  25. hpcflow/data/scripts/env_specifier_test/v1/main_script_test_direct_in_direct_out.py +7 -0
  26. hpcflow/data/scripts/env_specifier_test/v1/output_file_parser_basic.py +4 -0
  27. hpcflow/data/scripts/env_specifier_test/v2/main_script_test_direct_in_direct_out.py +7 -0
  28. hpcflow/data/scripts/generate_t1_file_01.py +7 -0
  29. hpcflow/data/scripts/import_future_script.py +7 -0
  30. hpcflow/data/scripts/input_file_generator_basic.py +3 -0
  31. hpcflow/data/scripts/input_file_generator_basic_FAIL.py +3 -0
  32. hpcflow/data/scripts/input_file_generator_test_stdout_stderr.py +8 -0
  33. hpcflow/data/scripts/main_script_test_direct_in.py +3 -0
  34. hpcflow/data/scripts/main_script_test_direct_in_direct_out.py +6 -0
  35. hpcflow/data/scripts/main_script_test_direct_in_direct_out_2.py +6 -0
  36. hpcflow/data/scripts/main_script_test_direct_in_direct_out_2_fail_allowed.py +6 -0
  37. hpcflow/data/scripts/main_script_test_direct_in_direct_out_2_fail_allowed_group.py +7 -0
  38. hpcflow/data/scripts/main_script_test_direct_in_direct_out_3.py +6 -0
  39. hpcflow/data/scripts/main_script_test_direct_in_direct_out_all_iters_test.py +15 -0
  40. hpcflow/data/scripts/main_script_test_direct_in_direct_out_env_spec.py +7 -0
  41. hpcflow/data/scripts/main_script_test_direct_in_direct_out_labels.py +8 -0
  42. hpcflow/data/scripts/main_script_test_direct_in_group_direct_out_3.py +6 -0
  43. hpcflow/data/scripts/main_script_test_direct_in_group_one_fail_direct_out_3.py +6 -0
  44. hpcflow/data/scripts/main_script_test_direct_sub_param_in_direct_out.py +6 -0
  45. hpcflow/data/scripts/main_script_test_hdf5_in_obj.py +12 -0
  46. hpcflow/data/scripts/main_script_test_hdf5_in_obj_2.py +12 -0
  47. hpcflow/data/scripts/main_script_test_hdf5_in_obj_group.py +12 -0
  48. hpcflow/data/scripts/main_script_test_hdf5_out_obj.py +11 -0
  49. hpcflow/data/scripts/main_script_test_json_and_direct_in_json_out.py +14 -0
  50. hpcflow/data/scripts/main_script_test_json_in_json_and_direct_out.py +17 -0
  51. hpcflow/data/scripts/main_script_test_json_in_json_out.py +14 -0
  52. hpcflow/data/scripts/main_script_test_json_in_json_out_labels.py +16 -0
  53. hpcflow/data/scripts/main_script_test_json_in_obj.py +12 -0
  54. hpcflow/data/scripts/main_script_test_json_out_FAIL.py +3 -0
  55. hpcflow/data/scripts/main_script_test_json_out_obj.py +10 -0
  56. hpcflow/data/scripts/main_script_test_json_sub_param_in_json_out_labels.py +16 -0
  57. hpcflow/data/scripts/main_script_test_shell_env_vars.py +12 -0
  58. hpcflow/data/scripts/main_script_test_std_out_std_err.py +6 -0
  59. hpcflow/data/scripts/output_file_parser_basic.py +3 -0
  60. hpcflow/data/scripts/output_file_parser_basic_FAIL.py +7 -0
  61. hpcflow/data/scripts/output_file_parser_test_stdout_stderr.py +8 -0
  62. hpcflow/data/scripts/parse_t1_file_01.py +4 -0
  63. hpcflow/data/scripts/script_exit_test.py +5 -0
  64. hpcflow/data/template_components/__init__.py +1 -0
  65. hpcflow/data/template_components/command_files.yaml +26 -0
  66. hpcflow/data/template_components/environments.yaml +13 -0
  67. hpcflow/data/template_components/parameters.yaml +14 -0
  68. hpcflow/data/template_components/task_schemas.yaml +139 -0
  69. hpcflow/data/workflows/workflow_1.yaml +5 -0
  70. hpcflow/examples.ipynb +1037 -0
  71. hpcflow/sdk/__init__.py +149 -0
  72. hpcflow/sdk/app.py +4266 -0
  73. hpcflow/sdk/cli.py +1479 -0
  74. hpcflow/sdk/cli_common.py +385 -0
  75. hpcflow/sdk/config/__init__.py +5 -0
  76. hpcflow/sdk/config/callbacks.py +246 -0
  77. hpcflow/sdk/config/cli.py +388 -0
  78. hpcflow/sdk/config/config.py +1410 -0
  79. hpcflow/sdk/config/config_file.py +501 -0
  80. hpcflow/sdk/config/errors.py +272 -0
  81. hpcflow/sdk/config/types.py +150 -0
  82. hpcflow/sdk/core/__init__.py +38 -0
  83. hpcflow/sdk/core/actions.py +3857 -0
  84. hpcflow/sdk/core/app_aware.py +25 -0
  85. hpcflow/sdk/core/cache.py +224 -0
  86. hpcflow/sdk/core/command_files.py +814 -0
  87. hpcflow/sdk/core/commands.py +424 -0
  88. hpcflow/sdk/core/element.py +2071 -0
  89. hpcflow/sdk/core/enums.py +221 -0
  90. hpcflow/sdk/core/environment.py +256 -0
  91. hpcflow/sdk/core/errors.py +1043 -0
  92. hpcflow/sdk/core/execute.py +207 -0
  93. hpcflow/sdk/core/json_like.py +809 -0
  94. hpcflow/sdk/core/loop.py +1320 -0
  95. hpcflow/sdk/core/loop_cache.py +282 -0
  96. hpcflow/sdk/core/object_list.py +933 -0
  97. hpcflow/sdk/core/parameters.py +3371 -0
  98. hpcflow/sdk/core/rule.py +196 -0
  99. hpcflow/sdk/core/run_dir_files.py +57 -0
  100. hpcflow/sdk/core/skip_reason.py +7 -0
  101. hpcflow/sdk/core/task.py +3792 -0
  102. hpcflow/sdk/core/task_schema.py +993 -0
  103. hpcflow/sdk/core/test_utils.py +538 -0
  104. hpcflow/sdk/core/types.py +447 -0
  105. hpcflow/sdk/core/utils.py +1207 -0
  106. hpcflow/sdk/core/validation.py +87 -0
  107. hpcflow/sdk/core/values.py +477 -0
  108. hpcflow/sdk/core/workflow.py +4820 -0
  109. hpcflow/sdk/core/zarr_io.py +206 -0
  110. hpcflow/sdk/data/__init__.py +13 -0
  111. hpcflow/sdk/data/config_file_schema.yaml +34 -0
  112. hpcflow/sdk/data/config_schema.yaml +260 -0
  113. hpcflow/sdk/data/environments_spec_schema.yaml +21 -0
  114. hpcflow/sdk/data/files_spec_schema.yaml +5 -0
  115. hpcflow/sdk/data/parameters_spec_schema.yaml +7 -0
  116. hpcflow/sdk/data/task_schema_spec_schema.yaml +3 -0
  117. hpcflow/sdk/data/workflow_spec_schema.yaml +22 -0
  118. hpcflow/sdk/demo/__init__.py +3 -0
  119. hpcflow/sdk/demo/cli.py +242 -0
  120. hpcflow/sdk/helper/__init__.py +3 -0
  121. hpcflow/sdk/helper/cli.py +137 -0
  122. hpcflow/sdk/helper/helper.py +300 -0
  123. hpcflow/sdk/helper/watcher.py +192 -0
  124. hpcflow/sdk/log.py +288 -0
  125. hpcflow/sdk/persistence/__init__.py +18 -0
  126. hpcflow/sdk/persistence/base.py +2817 -0
  127. hpcflow/sdk/persistence/defaults.py +6 -0
  128. hpcflow/sdk/persistence/discovery.py +39 -0
  129. hpcflow/sdk/persistence/json.py +954 -0
  130. hpcflow/sdk/persistence/pending.py +948 -0
  131. hpcflow/sdk/persistence/store_resource.py +203 -0
  132. hpcflow/sdk/persistence/types.py +309 -0
  133. hpcflow/sdk/persistence/utils.py +73 -0
  134. hpcflow/sdk/persistence/zarr.py +2388 -0
  135. hpcflow/sdk/runtime.py +320 -0
  136. hpcflow/sdk/submission/__init__.py +3 -0
  137. hpcflow/sdk/submission/enums.py +70 -0
  138. hpcflow/sdk/submission/jobscript.py +2379 -0
  139. hpcflow/sdk/submission/schedulers/__init__.py +281 -0
  140. hpcflow/sdk/submission/schedulers/direct.py +233 -0
  141. hpcflow/sdk/submission/schedulers/sge.py +376 -0
  142. hpcflow/sdk/submission/schedulers/slurm.py +598 -0
  143. hpcflow/sdk/submission/schedulers/utils.py +25 -0
  144. hpcflow/sdk/submission/shells/__init__.py +52 -0
  145. hpcflow/sdk/submission/shells/base.py +229 -0
  146. hpcflow/sdk/submission/shells/bash.py +504 -0
  147. hpcflow/sdk/submission/shells/os_version.py +115 -0
  148. hpcflow/sdk/submission/shells/powershell.py +352 -0
  149. hpcflow/sdk/submission/submission.py +1402 -0
  150. hpcflow/sdk/submission/types.py +140 -0
  151. hpcflow/sdk/typing.py +194 -0
  152. hpcflow/sdk/utils/arrays.py +69 -0
  153. hpcflow/sdk/utils/deferred_file.py +55 -0
  154. hpcflow/sdk/utils/hashing.py +16 -0
  155. hpcflow/sdk/utils/patches.py +31 -0
  156. hpcflow/sdk/utils/strings.py +69 -0
  157. hpcflow/tests/api/test_api.py +32 -0
  158. hpcflow/tests/conftest.py +123 -0
  159. hpcflow/tests/data/__init__.py +0 -0
  160. hpcflow/tests/data/benchmark_N_elements.yaml +6 -0
  161. hpcflow/tests/data/benchmark_script_runner.yaml +26 -0
  162. hpcflow/tests/data/multi_path_sequences.yaml +29 -0
  163. hpcflow/tests/data/workflow_1.json +10 -0
  164. hpcflow/tests/data/workflow_1.yaml +5 -0
  165. hpcflow/tests/data/workflow_1_slurm.yaml +8 -0
  166. hpcflow/tests/data/workflow_1_wsl.yaml +8 -0
  167. hpcflow/tests/data/workflow_test_run_abort.yaml +42 -0
  168. hpcflow/tests/jinja_templates/test_jinja_templates.py +161 -0
  169. hpcflow/tests/programs/test_programs.py +180 -0
  170. hpcflow/tests/schedulers/direct_linux/test_direct_linux_submission.py +12 -0
  171. hpcflow/tests/schedulers/sge/test_sge_submission.py +36 -0
  172. hpcflow/tests/schedulers/slurm/test_slurm_submission.py +14 -0
  173. hpcflow/tests/scripts/test_input_file_generators.py +282 -0
  174. hpcflow/tests/scripts/test_main_scripts.py +1361 -0
  175. hpcflow/tests/scripts/test_non_snippet_script.py +46 -0
  176. hpcflow/tests/scripts/test_ouput_file_parsers.py +353 -0
  177. hpcflow/tests/shells/wsl/test_wsl_submission.py +14 -0
  178. hpcflow/tests/unit/test_action.py +1066 -0
  179. hpcflow/tests/unit/test_action_rule.py +24 -0
  180. hpcflow/tests/unit/test_app.py +132 -0
  181. hpcflow/tests/unit/test_cache.py +46 -0
  182. hpcflow/tests/unit/test_cli.py +172 -0
  183. hpcflow/tests/unit/test_command.py +377 -0
  184. hpcflow/tests/unit/test_config.py +195 -0
  185. hpcflow/tests/unit/test_config_file.py +162 -0
  186. hpcflow/tests/unit/test_element.py +666 -0
  187. hpcflow/tests/unit/test_element_iteration.py +88 -0
  188. hpcflow/tests/unit/test_element_set.py +158 -0
  189. hpcflow/tests/unit/test_group.py +115 -0
  190. hpcflow/tests/unit/test_input_source.py +1479 -0
  191. hpcflow/tests/unit/test_input_value.py +398 -0
  192. hpcflow/tests/unit/test_jobscript_unit.py +757 -0
  193. hpcflow/tests/unit/test_json_like.py +1247 -0
  194. hpcflow/tests/unit/test_loop.py +2674 -0
  195. hpcflow/tests/unit/test_meta_task.py +325 -0
  196. hpcflow/tests/unit/test_multi_path_sequences.py +259 -0
  197. hpcflow/tests/unit/test_object_list.py +116 -0
  198. hpcflow/tests/unit/test_parameter.py +243 -0
  199. hpcflow/tests/unit/test_persistence.py +664 -0
  200. hpcflow/tests/unit/test_resources.py +243 -0
  201. hpcflow/tests/unit/test_run.py +286 -0
  202. hpcflow/tests/unit/test_run_directories.py +29 -0
  203. hpcflow/tests/unit/test_runtime.py +9 -0
  204. hpcflow/tests/unit/test_schema_input.py +372 -0
  205. hpcflow/tests/unit/test_shell.py +129 -0
  206. hpcflow/tests/unit/test_slurm.py +39 -0
  207. hpcflow/tests/unit/test_submission.py +502 -0
  208. hpcflow/tests/unit/test_task.py +2560 -0
  209. hpcflow/tests/unit/test_task_schema.py +182 -0
  210. hpcflow/tests/unit/test_utils.py +616 -0
  211. hpcflow/tests/unit/test_value_sequence.py +549 -0
  212. hpcflow/tests/unit/test_values.py +91 -0
  213. hpcflow/tests/unit/test_workflow.py +827 -0
  214. hpcflow/tests/unit/test_workflow_template.py +186 -0
  215. hpcflow/tests/unit/utils/test_arrays.py +40 -0
  216. hpcflow/tests/unit/utils/test_deferred_file_writer.py +34 -0
  217. hpcflow/tests/unit/utils/test_hashing.py +65 -0
  218. hpcflow/tests/unit/utils/test_patches.py +5 -0
  219. hpcflow/tests/unit/utils/test_redirect_std.py +50 -0
  220. hpcflow/tests/unit/utils/test_strings.py +97 -0
  221. hpcflow/tests/workflows/__init__.py +0 -0
  222. hpcflow/tests/workflows/test_directory_structure.py +31 -0
  223. hpcflow/tests/workflows/test_jobscript.py +355 -0
  224. hpcflow/tests/workflows/test_run_status.py +198 -0
  225. hpcflow/tests/workflows/test_skip_downstream.py +696 -0
  226. hpcflow/tests/workflows/test_submission.py +140 -0
  227. hpcflow/tests/workflows/test_workflows.py +564 -0
  228. hpcflow/tests/workflows/test_zip.py +18 -0
  229. hpcflow/viz_demo.ipynb +6794 -0
  230. hpcflow-0.2.0a271.dist-info/LICENSE +375 -0
  231. hpcflow-0.2.0a271.dist-info/METADATA +65 -0
  232. hpcflow-0.2.0a271.dist-info/RECORD +237 -0
  233. {hpcflow-0.1.9.dist-info → hpcflow-0.2.0a271.dist-info}/WHEEL +4 -5
  234. hpcflow-0.2.0a271.dist-info/entry_points.txt +6 -0
  235. hpcflow/api.py +0 -458
  236. hpcflow/archive/archive.py +0 -308
  237. hpcflow/archive/cloud/cloud.py +0 -47
  238. hpcflow/archive/cloud/errors.py +0 -9
  239. hpcflow/archive/cloud/providers/dropbox.py +0 -432
  240. hpcflow/archive/errors.py +0 -5
  241. hpcflow/base_db.py +0 -4
  242. hpcflow/config.py +0 -232
  243. hpcflow/copytree.py +0 -66
  244. hpcflow/data/examples/_config.yml +0 -14
  245. hpcflow/data/examples/damask/demo/1.run.yml +0 -4
  246. hpcflow/data/examples/damask/demo/2.process.yml +0 -29
  247. hpcflow/data/examples/damask/demo/geom.geom +0 -2052
  248. hpcflow/data/examples/damask/demo/load.load +0 -1
  249. hpcflow/data/examples/damask/demo/material.config +0 -185
  250. hpcflow/data/examples/damask/inputs/geom.geom +0 -2052
  251. hpcflow/data/examples/damask/inputs/load.load +0 -1
  252. hpcflow/data/examples/damask/inputs/material.config +0 -185
  253. hpcflow/data/examples/damask/profiles/_variable_lookup.yml +0 -21
  254. hpcflow/data/examples/damask/profiles/damask.yml +0 -4
  255. hpcflow/data/examples/damask/profiles/damask_process.yml +0 -8
  256. hpcflow/data/examples/damask/profiles/damask_run.yml +0 -5
  257. hpcflow/data/examples/damask/profiles/default.yml +0 -6
  258. hpcflow/data/examples/thinking.yml +0 -177
  259. hpcflow/errors.py +0 -2
  260. hpcflow/init_db.py +0 -37
  261. hpcflow/models.py +0 -2549
  262. hpcflow/nesting.py +0 -9
  263. hpcflow/profiles.py +0 -455
  264. hpcflow/project.py +0 -81
  265. hpcflow/scheduler.py +0 -323
  266. hpcflow/utils.py +0 -103
  267. hpcflow/validation.py +0 -167
  268. hpcflow/variables.py +0 -544
  269. hpcflow-0.1.9.dist-info/METADATA +0 -168
  270. hpcflow-0.1.9.dist-info/RECORD +0 -45
  271. hpcflow-0.1.9.dist-info/entry_points.txt +0 -8
  272. hpcflow-0.1.9.dist-info/top_level.txt +0 -1
  273. /hpcflow/{archive → data/jinja_templates}/__init__.py +0 -0
  274. /hpcflow/{archive/cloud → data/programs}/__init__.py +0 -0
  275. /hpcflow/{archive/cloud/providers → data/workflows}/__init__.py +0 -0
@@ -0,0 +1 @@
1
+ """This is required to allow the frozen app to find the scripts resources..."""
@@ -0,0 +1,2 @@
1
+ def bad_script():
2
+ raise SyntaxError("oh no!")
@@ -0,0 +1,8 @@
1
+ from random import randint
2
+ from pathlib import Path
3
+
4
+
5
+ def demo_task_1_generate_t1_infile_1(path, p1):
6
+ with Path(path).open("w") as fp:
7
+ fp.write(f"{randint(0, 1e6)}\n")
8
+ fp.write(f"p1: {p1}\n")
@@ -0,0 +1,8 @@
1
+ from random import randint
2
+ from pathlib import Path
3
+
4
+
5
+ def demo_task_1_generate_t1_infile_2(path, p2):
6
+ with Path(path).open("w") as fp:
7
+ fp.write(f"{randint(0, 1e6)}\n")
8
+ fp.write(f"p2: {p2}\n")
@@ -0,0 +1,7 @@
1
+ from pathlib import Path
2
+
3
+
4
+ def demo_task_1_parse_p3(t1_outfile_1):
5
+ with Path(t1_outfile_1).open("r") as fp:
6
+ p3 = int(fp.readline().strip())
7
+ return p3
@@ -0,0 +1,2 @@
1
+ def do_nothing():
2
+ pass
@@ -0,0 +1,4 @@
1
+ def input_file_generator_pass_env_spec(path, p1, env_spec):
2
+ print(env_spec)
3
+ with path.open("w") as fp:
4
+ fp.write(f"{p1}\n")
@@ -0,0 +1,8 @@
1
+ def main_script_test_pass_env_spec(p1, env_spec):
2
+ # process
3
+ p2 = p1 + 100
4
+
5
+ print(env_spec)
6
+
7
+ # return outputs
8
+ return {"p2": p2}
@@ -0,0 +1,4 @@
1
+ def output_file_parser_pass_env_spec(my_output_file, env_spec):
2
+ print(env_spec)
3
+ with my_output_file.open("r") as fp:
4
+ return int(fp.read().strip())
@@ -0,0 +1,4 @@
1
+ # version: v1
2
+ def input_file_generator_basic(path, p1):
3
+ with path.open("w") as fp:
4
+ fp.write(f"{p1}\n")
@@ -0,0 +1,7 @@
1
+ # version: v1
2
+ def main_script_test_direct_in_direct_out(p1):
3
+ # process
4
+ p2 = p1 + 100
5
+
6
+ # return outputs
7
+ return {"p2": p2}
@@ -0,0 +1,4 @@
1
+ # version: v1
2
+ def output_file_parser_basic(my_output_file):
3
+ with my_output_file.open("r") as fp:
4
+ return int(fp.read().strip())
@@ -0,0 +1,7 @@
1
+ # version: v2
2
+ def main_script_test_direct_in_direct_out(p1):
3
+ # process
4
+ p2 = p1 + 200
5
+
6
+ # return outputs
7
+ return {"p2": p2}
@@ -0,0 +1,7 @@
1
+ from random import randint
2
+
3
+
4
+ def generate_t1_file_01(path, p1):
5
+ with path.open("w") as fp:
6
+ fp.write(f"{randint(0, 1e6)}\n")
7
+ fp.write(f"p1: {p1}\n")
@@ -0,0 +1,7 @@
1
+ from __future__ import annotations
2
+
3
+
4
+ def import_future_script():
5
+ """Used to test the `__future__` import is moved to the top of the file in the
6
+ generated script in the case of `resources.combine_scripts == True`"""
7
+ pass
@@ -0,0 +1,3 @@
1
+ def input_file_generator_basic(path, p1):
2
+ with path.open("w") as fp:
3
+ fp.write(f"{p1}\n")
@@ -0,0 +1,3 @@
1
+ def input_file_generator_basic_FAIL(path, p1):
2
+ # silently fail to generate the input file!
3
+ pass
@@ -0,0 +1,8 @@
1
+ import sys
2
+
3
+
4
+ def input_file_generator_test_stdout_stderr(path, p1):
5
+ print(p1)
6
+ print(p1, file=sys.stderr)
7
+ with path.open("w") as fp:
8
+ fp.write(f"{p1}\n")
@@ -0,0 +1,3 @@
1
+ def main_script_test_direct_in(p1):
2
+ # process
3
+ print(p1 + 100)
@@ -0,0 +1,6 @@
1
+ def main_script_test_direct_in_direct_out(p1):
2
+ # process
3
+ p2 = p1 + 100
4
+
5
+ # return outputs
6
+ return {"p2": p2}
@@ -0,0 +1,6 @@
1
+ def main_script_test_direct_in_direct_out_2(p2):
2
+ # process
3
+ p3 = p2 + 100
4
+
5
+ # return outputs
6
+ return {"p3": p3}
@@ -0,0 +1,6 @@
1
+ def main_script_test_direct_in_direct_out_2_fail_allowed(p2):
2
+ # process, accounting for possible unset data:
3
+ p3 = (p2 if p2 is not None else 0) + 100
4
+
5
+ # return outputs
6
+ return {"p3": p3}
@@ -0,0 +1,7 @@
1
+ def main_script_test_direct_in_direct_out_2_fail_allowed_group(p2):
2
+ # process, accounting for possible unset data:
3
+ p2_sum = sum(i for i in p2 if i is not None)
4
+ p3 = p2_sum + 100
5
+
6
+ # return outputs
7
+ return {"p3": p3}
@@ -0,0 +1,6 @@
1
+ def main_script_test_direct_in_direct_out_3(p3):
2
+ # process
3
+ p4 = p3 + 100
4
+
5
+ # return outputs
6
+ return {"p4": p4}
@@ -0,0 +1,15 @@
1
+ def main_script_test_direct_in_direct_out_all_iters_test(p1):
2
+ """Used for a simple loop test, where we pass all iterations to the script."""
3
+
4
+ # sum over all iterations:
5
+ all_p1_vals = []
6
+ for key, val in p1.items():
7
+ print(f"\nkey: {key}")
8
+ print(f"loop_idx: {val['loop_idx']}")
9
+ print(f"value: {val['value']}")
10
+ all_p1_vals.append(val["value"])
11
+
12
+ p1 = sum(all_p1_vals) + 1
13
+
14
+ # return outputs
15
+ return {"p1": p1}
@@ -0,0 +1,7 @@
1
+ def main_script_test_direct_in_direct_out_env_spec(p1, env_spec):
2
+
3
+ # process
4
+ p2 = p1 + 100
5
+
6
+ # return outputs
7
+ return {"p2": env_spec}
@@ -0,0 +1,8 @@
1
+ def main_script_test_direct_in_direct_out_labels(p1):
2
+ # process
3
+ p1_1 = p1["one"]
4
+ p1_2 = p1["two"]
5
+ p2 = p1_1 + p1_2
6
+
7
+ # return outputs
8
+ return {"p2": p2}
@@ -0,0 +1,6 @@
1
+ def main_script_test_direct_in_group_direct_out_3(p3):
2
+ # process
3
+ p4 = sum(p3) + 100
4
+
5
+ # return outputs
6
+ return {"p4": p4}
@@ -0,0 +1,6 @@
1
+ def main_script_test_direct_in_group_one_fail_direct_out_3(p3):
2
+ # process, ignore some un-set inputs:
3
+ p4 = sum([i for i in p3 if i is not None]) + 100
4
+
5
+ # return outputs
6
+ return {"p4": p4}
@@ -0,0 +1,6 @@
1
+ def main_script_test_direct_sub_param_in_direct_out(a):
2
+ # process
3
+ p2 = a + 100
4
+
5
+ # return outputs
6
+ return {"p2": p2}
@@ -0,0 +1,12 @@
1
+ import h5py # type: ignore[import-untyped]
2
+
3
+
4
+ def main_script_test_hdf5_in_obj(_input_files):
5
+ # read inputs
6
+ with h5py.File(_input_files["hdf5"], mode="r") as fh:
7
+ a = fh["p1c"].attrs["a"].item()
8
+
9
+ # process
10
+ p2 = a + 100
11
+
12
+ return {"p2": p2}
@@ -0,0 +1,12 @@
1
+ import h5py # type: ignore
2
+
3
+
4
+ def main_script_test_hdf5_in_obj_2(p2, _input_files):
5
+ # read inputs
6
+ with h5py.File(_input_files["hdf5"], mode="r") as fh:
7
+ a = fh["p1c"].attrs["a"].item()
8
+
9
+ # process
10
+ p3 = a + 100
11
+
12
+ return {"p3": p3}
@@ -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}
@@ -0,0 +1,11 @@
1
+ import h5py # type: ignore[import-untyped]
2
+
3
+
4
+ def main_script_test_hdf5_out_obj(p1, _output_files):
5
+ # process
6
+ p1c = {"a": p1 + 100}
7
+
8
+ # write outputs
9
+ with h5py.File(_output_files["hdf5"], mode="w") as fh:
10
+ p1c_grp = fh.create_group("p1c")
11
+ p1c_grp.attrs["a"] = p1c["a"]
@@ -0,0 +1,14 @@
1
+ import json
2
+
3
+
4
+ def main_script_test_json_and_direct_in_json_out(p2, _input_files, _output_files):
5
+ # read inputs
6
+ with _input_files["json"].open("rt") as fh:
7
+ p1 = int(json.load(fh)["p1"])
8
+
9
+ # process
10
+ p3 = p1 + p2
11
+
12
+ # save outputs
13
+ with _output_files["json"].open("wt") as fh:
14
+ json.dump({"p3": p3}, fh)
@@ -0,0 +1,17 @@
1
+ import json
2
+
3
+
4
+ def main_script_test_json_in_json_and_direct_out(_input_files, _output_files):
5
+ # read inputs
6
+ with _input_files["json"].open("rt") as fh:
7
+ p1 = int(json.load(fh)["p1"])
8
+
9
+ # process
10
+ p2 = p1 + 100
11
+ p3 = p1 + 200
12
+
13
+ # save outputs
14
+ with _output_files["json"].open("wt") as fh:
15
+ json.dump({"p2": p2}, fh)
16
+
17
+ return {"p3": p3}
@@ -0,0 +1,14 @@
1
+ import json
2
+
3
+
4
+ def main_script_test_json_in_json_out(_input_files, _output_files):
5
+ # read inputs
6
+ with _input_files["json"].open("rt") as fh:
7
+ p1 = int(json.load(fh)["p1"])
8
+
9
+ # process
10
+ p2 = p1 + 100
11
+
12
+ # save outputs
13
+ with _output_files["json"].open("wt") as fh:
14
+ json.dump({"p2": p2}, fh)
@@ -0,0 +1,16 @@
1
+ import json
2
+
3
+
4
+ def main_script_test_json_in_json_out_labels(_input_files, _output_files):
5
+ # read inputs
6
+ with _input_files["json"].open("rt") as fh:
7
+ inp_dat = json.load(fh)
8
+ p1_1 = int(inp_dat["p1[one]"])
9
+ p1_2 = int(inp_dat["p1[two]"])
10
+
11
+ # process
12
+ p2 = p1_1 + p1_2
13
+
14
+ # save outputs
15
+ with _output_files["json"].open("wt") as fh:
16
+ json.dump({"p2": p2}, fh)
@@ -0,0 +1,12 @@
1
+ import json
2
+
3
+
4
+ def main_script_test_json_in_obj(_input_files):
5
+ # read inputs
6
+ with _input_files["json"].open("rt") as fh:
7
+ p1c = json.load(fh)["p1c"]
8
+
9
+ # process
10
+ p2 = p1c["a"] + 100
11
+
12
+ return {"p2": p2}
@@ -0,0 +1,3 @@
1
+ def main_script_test_json_out_FAIL(_output_files):
2
+ pass
3
+ # don't generate a JSON output file!
@@ -0,0 +1,10 @@
1
+ import json
2
+
3
+
4
+ def main_script_test_json_out_obj(p1, _output_files):
5
+ # process
6
+ p1c = {"a": p1 + 100}
7
+
8
+ # write outputs
9
+ with _output_files["json"].open("wt") as fh:
10
+ json.dump({"p1c": p1c}, fh)
@@ -0,0 +1,16 @@
1
+ import json
2
+
3
+
4
+ def main_script_test_json_sub_param_in_json_out_labels(_input_files, _output_files):
5
+ # read inputs
6
+ with _input_files["json"].open("rt") as fh:
7
+ inp_dat = json.load(fh)
8
+ a = int(inp_dat["a"])
9
+ p1_2 = int(inp_dat["p1[two]"])
10
+
11
+ # process
12
+ p2 = a + p1_2
13
+
14
+ # save outputs
15
+ with _output_files["json"].open("wt") as fh:
16
+ json.dump({"p2": p2}, fh)
@@ -0,0 +1,12 @@
1
+ import json
2
+ import os
3
+
4
+
5
+ def main_script_test_shell_env_vars(p1):
6
+ with open("env_vars.json", "wt") as fp:
7
+ json.dump(
8
+ {k: v for k, v in os.environ.items() if k.startswith("HPCFLOW")},
9
+ fp,
10
+ indent=4,
11
+ )
12
+ return {"p1": p1 + 1}
@@ -0,0 +1,6 @@
1
+ import sys
2
+
3
+
4
+ def main_script_test_std_out_std_err(stdout_msg, stderr_msg):
5
+ print(stdout_msg)
6
+ print(stderr_msg, file=sys.stderr)
@@ -0,0 +1,3 @@
1
+ def output_file_parser_basic(my_output_file):
2
+ with my_output_file.open("r") as fp:
3
+ return int(fp.read().strip())
@@ -0,0 +1,7 @@
1
+ def output_file_parser_basic_FAIL(my_output_file):
2
+ # parse the output file, but then delete it, so it cannot be saved (when run with
3
+ # `OFP.save_files=True`):
4
+ with my_output_file.open("r") as fp:
5
+ out = int(fp.read().strip())
6
+ my_output_file.unlink()
7
+ return out
@@ -0,0 +1,8 @@
1
+ import sys
2
+
3
+
4
+ def output_file_parser_test_stdout_stderr(my_output_file, p1):
5
+ print(p1)
6
+ print(p1, file=sys.stderr)
7
+ with my_output_file.open("r") as fp:
8
+ return int(fp.read().strip())
@@ -0,0 +1,4 @@
1
+ def parse_t1_file_01(t1_file_01):
2
+ with t1_file_01.open("r") as fp:
3
+ p4 = int(fp.readline().strip())
4
+ return p4
@@ -0,0 +1,5 @@
1
+ import sys
2
+
3
+
4
+ def script_exit_test(exit_code):
5
+ sys.exit(exit_code)
@@ -0,0 +1 @@
1
+ """YAML files containing built-in template components, used for demonstrations."""
@@ -0,0 +1,26 @@
1
+ - label: t1_infile_1
2
+ name:
3
+ name: t1_infile_1.txt
4
+ doc: Input file for demonstration task t1.
5
+ - label: t1_infile_2
6
+ name:
7
+ name: t1_infile_2.txt
8
+ doc: Input file for demonstration task t1.
9
+ - label: t1_outfile_1
10
+ name:
11
+ name: outfile.txt
12
+ doc: Output file for demonstration task t1.
13
+ - label: lammps_atoms_file
14
+ name:
15
+ name: atoms.lammps
16
+ doc: The file of atoms processed by LAMMPS.
17
+ - label: lammps_input_script
18
+ name:
19
+ name: in.lammps
20
+ doc: The LAMMPS control file.
21
+ - label: lammps_dump_files
22
+ name:
23
+ name: (dump.\d+.txt)
24
+ is_regex: true
25
+ doc: >
26
+ A regular expression pattern that matches all the dump files generated by a LAMMPS run.
@@ -0,0 +1,13 @@
1
+ - name: null_env
2
+ doc: The default system environment.
3
+
4
+ - name: python_env
5
+ executables:
6
+ - label: python_script
7
+ instances:
8
+ - command: python <<script_path>> <<args>>
9
+ num_cores: 1
10
+ parallel_mode: null
11
+ doc: |
12
+ An environment for running Python, typically with access to hpcflow and matflow modules and their dependencies.
13
+ May be a Python virtual environment.
@@ -0,0 +1,14 @@
1
+ # These are only documented when their schemas are documented.
2
+ - type: p1
3
+ - type: p1c
4
+ - type: p2
5
+ - type: p3
6
+ - type: p4
7
+ - type: p5
8
+ - type: orientations
9
+ - type: number_atoms
10
+ - type: box
11
+ - type: atoms
12
+ - type: empirical_potential
13
+ - type: optimised_atoms
14
+ - type: test_UPPER_case