sierra-research 1.3.6__py3-none-any.whl → 1.5.0__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 (254) hide show
  1. sierra/__init__.py +3 -3
  2. sierra/core/__init__.py +3 -3
  3. sierra/core/batchroot.py +223 -0
  4. sierra/core/cmdline.py +681 -1057
  5. sierra/core/compare.py +11 -0
  6. sierra/core/config.py +96 -88
  7. sierra/core/engine.py +306 -0
  8. sierra/core/execenv.py +380 -0
  9. sierra/core/expdef.py +11 -0
  10. sierra/core/experiment/__init__.py +1 -0
  11. sierra/core/experiment/bindings.py +150 -101
  12. sierra/core/experiment/definition.py +414 -245
  13. sierra/core/experiment/spec.py +83 -85
  14. sierra/core/exproot.py +44 -0
  15. sierra/core/generators/__init__.py +10 -0
  16. sierra/core/generators/experiment.py +528 -0
  17. sierra/core/generators/generator_factory.py +138 -137
  18. sierra/core/graphs/__init__.py +23 -0
  19. sierra/core/graphs/bcbridge.py +94 -0
  20. sierra/core/graphs/heatmap.py +245 -324
  21. sierra/core/graphs/pathset.py +27 -0
  22. sierra/core/graphs/schema.py +77 -0
  23. sierra/core/graphs/stacked_line.py +341 -0
  24. sierra/core/graphs/summary_line.py +506 -0
  25. sierra/core/logging.py +3 -2
  26. sierra/core/models/__init__.py +3 -1
  27. sierra/core/models/info.py +19 -0
  28. sierra/core/models/interface.py +52 -122
  29. sierra/core/pipeline/__init__.py +2 -5
  30. sierra/core/pipeline/pipeline.py +228 -126
  31. sierra/core/pipeline/stage1/__init__.py +10 -0
  32. sierra/core/pipeline/stage1/pipeline_stage1.py +45 -31
  33. sierra/core/pipeline/stage2/__init__.py +10 -0
  34. sierra/core/pipeline/stage2/pipeline_stage2.py +8 -11
  35. sierra/core/pipeline/stage2/runner.py +401 -0
  36. sierra/core/pipeline/stage3/__init__.py +12 -0
  37. sierra/core/pipeline/stage3/gather.py +321 -0
  38. sierra/core/pipeline/stage3/pipeline_stage3.py +37 -84
  39. sierra/core/pipeline/stage4/__init__.py +12 -2
  40. sierra/core/pipeline/stage4/pipeline_stage4.py +36 -354
  41. sierra/core/pipeline/stage5/__init__.py +12 -0
  42. sierra/core/pipeline/stage5/pipeline_stage5.py +33 -208
  43. sierra/core/pipeline/yaml.py +48 -0
  44. sierra/core/plugin.py +529 -62
  45. sierra/core/proc.py +11 -0
  46. sierra/core/prod.py +11 -0
  47. sierra/core/ros1/__init__.py +5 -1
  48. sierra/core/ros1/callbacks.py +22 -21
  49. sierra/core/ros1/cmdline.py +59 -88
  50. sierra/core/ros1/generators.py +159 -175
  51. sierra/core/ros1/variables/__init__.py +3 -0
  52. sierra/core/ros1/variables/exp_setup.py +122 -116
  53. sierra/core/startup.py +106 -76
  54. sierra/core/stat_kernels.py +4 -5
  55. sierra/core/storage.py +13 -32
  56. sierra/core/trampoline.py +30 -0
  57. sierra/core/types.py +116 -71
  58. sierra/core/utils.py +103 -106
  59. sierra/core/variables/__init__.py +1 -1
  60. sierra/core/variables/base_variable.py +12 -17
  61. sierra/core/variables/batch_criteria.py +387 -481
  62. sierra/core/variables/builtin.py +135 -0
  63. sierra/core/variables/exp_setup.py +19 -39
  64. sierra/core/variables/population_size.py +72 -76
  65. sierra/core/variables/variable_density.py +44 -68
  66. sierra/core/vector.py +1 -1
  67. sierra/main.py +256 -88
  68. sierra/plugins/__init__.py +119 -0
  69. sierra/plugins/compare/__init__.py +14 -0
  70. sierra/plugins/compare/graphs/__init__.py +19 -0
  71. sierra/plugins/compare/graphs/cmdline.py +120 -0
  72. sierra/plugins/compare/graphs/comparator.py +291 -0
  73. sierra/plugins/compare/graphs/inter_controller.py +531 -0
  74. sierra/plugins/compare/graphs/inter_scenario.py +297 -0
  75. sierra/plugins/compare/graphs/namecalc.py +53 -0
  76. sierra/plugins/compare/graphs/outputroot.py +73 -0
  77. sierra/plugins/compare/graphs/plugin.py +147 -0
  78. sierra/plugins/compare/graphs/preprocess.py +172 -0
  79. sierra/plugins/compare/graphs/schema.py +37 -0
  80. sierra/plugins/engine/__init__.py +14 -0
  81. sierra/plugins/engine/argos/__init__.py +18 -0
  82. sierra/plugins/{platform → engine}/argos/cmdline.py +144 -151
  83. sierra/plugins/{platform/argos/variables → engine/argos/generators}/__init__.py +5 -0
  84. sierra/plugins/engine/argos/generators/engine.py +394 -0
  85. sierra/plugins/engine/argos/plugin.py +393 -0
  86. sierra/plugins/{platform/argos/generators → engine/argos/variables}/__init__.py +5 -0
  87. sierra/plugins/engine/argos/variables/arena_shape.py +183 -0
  88. sierra/plugins/engine/argos/variables/cameras.py +240 -0
  89. sierra/plugins/engine/argos/variables/constant_density.py +112 -0
  90. sierra/plugins/engine/argos/variables/exp_setup.py +82 -0
  91. sierra/plugins/{platform → engine}/argos/variables/physics_engines.py +83 -87
  92. sierra/plugins/engine/argos/variables/population_constant_density.py +178 -0
  93. sierra/plugins/engine/argos/variables/population_size.py +115 -0
  94. sierra/plugins/engine/argos/variables/population_variable_density.py +123 -0
  95. sierra/plugins/engine/argos/variables/rendering.py +108 -0
  96. sierra/plugins/engine/ros1gazebo/__init__.py +18 -0
  97. sierra/plugins/engine/ros1gazebo/cmdline.py +175 -0
  98. sierra/plugins/{platform/ros1robot → engine/ros1gazebo}/generators/__init__.py +5 -0
  99. sierra/plugins/engine/ros1gazebo/generators/engine.py +125 -0
  100. sierra/plugins/engine/ros1gazebo/plugin.py +404 -0
  101. sierra/plugins/engine/ros1gazebo/variables/__init__.py +15 -0
  102. sierra/plugins/engine/ros1gazebo/variables/population_size.py +214 -0
  103. sierra/plugins/engine/ros1robot/__init__.py +18 -0
  104. sierra/plugins/engine/ros1robot/cmdline.py +159 -0
  105. sierra/plugins/{platform/ros1gazebo → engine/ros1robot}/generators/__init__.py +4 -0
  106. sierra/plugins/engine/ros1robot/generators/engine.py +95 -0
  107. sierra/plugins/engine/ros1robot/plugin.py +410 -0
  108. sierra/plugins/{hpc/local → engine/ros1robot/variables}/__init__.py +5 -0
  109. sierra/plugins/engine/ros1robot/variables/population_size.py +146 -0
  110. sierra/plugins/execenv/__init__.py +11 -0
  111. sierra/plugins/execenv/hpc/__init__.py +18 -0
  112. sierra/plugins/execenv/hpc/adhoc/__init__.py +18 -0
  113. sierra/plugins/execenv/hpc/adhoc/cmdline.py +30 -0
  114. sierra/plugins/execenv/hpc/adhoc/plugin.py +131 -0
  115. sierra/plugins/execenv/hpc/cmdline.py +137 -0
  116. sierra/plugins/execenv/hpc/local/__init__.py +18 -0
  117. sierra/plugins/execenv/hpc/local/cmdline.py +31 -0
  118. sierra/plugins/execenv/hpc/local/plugin.py +145 -0
  119. sierra/plugins/execenv/hpc/pbs/__init__.py +18 -0
  120. sierra/plugins/execenv/hpc/pbs/cmdline.py +30 -0
  121. sierra/plugins/execenv/hpc/pbs/plugin.py +121 -0
  122. sierra/plugins/execenv/hpc/slurm/__init__.py +18 -0
  123. sierra/plugins/execenv/hpc/slurm/cmdline.py +30 -0
  124. sierra/plugins/execenv/hpc/slurm/plugin.py +133 -0
  125. sierra/plugins/execenv/prefectserver/__init__.py +18 -0
  126. sierra/plugins/execenv/prefectserver/cmdline.py +66 -0
  127. sierra/plugins/execenv/prefectserver/dockerremote/__init__.py +18 -0
  128. sierra/plugins/execenv/prefectserver/dockerremote/cmdline.py +66 -0
  129. sierra/plugins/execenv/prefectserver/dockerremote/plugin.py +132 -0
  130. sierra/plugins/execenv/prefectserver/flow.py +66 -0
  131. sierra/plugins/execenv/prefectserver/local/__init__.py +18 -0
  132. sierra/plugins/execenv/prefectserver/local/cmdline.py +29 -0
  133. sierra/plugins/execenv/prefectserver/local/plugin.py +133 -0
  134. sierra/plugins/{hpc/adhoc → execenv/robot}/__init__.py +1 -0
  135. sierra/plugins/execenv/robot/turtlebot3/__init__.py +18 -0
  136. sierra/plugins/execenv/robot/turtlebot3/plugin.py +204 -0
  137. sierra/plugins/expdef/__init__.py +14 -0
  138. sierra/plugins/expdef/json/__init__.py +14 -0
  139. sierra/plugins/expdef/json/plugin.py +504 -0
  140. sierra/plugins/expdef/xml/__init__.py +14 -0
  141. sierra/plugins/expdef/xml/plugin.py +386 -0
  142. sierra/{core/hpc → plugins/proc}/__init__.py +1 -1
  143. sierra/plugins/proc/collate/__init__.py +15 -0
  144. sierra/plugins/proc/collate/cmdline.py +47 -0
  145. sierra/plugins/proc/collate/plugin.py +271 -0
  146. sierra/plugins/proc/compress/__init__.py +18 -0
  147. sierra/plugins/proc/compress/cmdline.py +47 -0
  148. sierra/plugins/proc/compress/plugin.py +123 -0
  149. sierra/plugins/proc/decompress/__init__.py +18 -0
  150. sierra/plugins/proc/decompress/plugin.py +96 -0
  151. sierra/plugins/proc/imagize/__init__.py +15 -0
  152. sierra/plugins/proc/imagize/cmdline.py +49 -0
  153. sierra/plugins/proc/imagize/plugin.py +270 -0
  154. sierra/plugins/proc/modelrunner/__init__.py +16 -0
  155. sierra/plugins/proc/modelrunner/plugin.py +250 -0
  156. sierra/plugins/proc/statistics/__init__.py +15 -0
  157. sierra/plugins/proc/statistics/cmdline.py +64 -0
  158. sierra/plugins/proc/statistics/plugin.py +390 -0
  159. sierra/plugins/{hpc → prod}/__init__.py +1 -0
  160. sierra/plugins/prod/graphs/__init__.py +18 -0
  161. sierra/plugins/prod/graphs/cmdline.py +269 -0
  162. sierra/plugins/prod/graphs/collate.py +279 -0
  163. sierra/plugins/prod/graphs/inter/__init__.py +13 -0
  164. sierra/plugins/prod/graphs/inter/generate.py +83 -0
  165. sierra/plugins/prod/graphs/inter/heatmap.py +86 -0
  166. sierra/plugins/prod/graphs/inter/line.py +134 -0
  167. sierra/plugins/prod/graphs/intra/__init__.py +15 -0
  168. sierra/plugins/prod/graphs/intra/generate.py +202 -0
  169. sierra/plugins/prod/graphs/intra/heatmap.py +74 -0
  170. sierra/plugins/prod/graphs/intra/line.py +114 -0
  171. sierra/plugins/prod/graphs/plugin.py +103 -0
  172. sierra/plugins/prod/graphs/targets.py +63 -0
  173. sierra/plugins/prod/render/__init__.py +18 -0
  174. sierra/plugins/prod/render/cmdline.py +72 -0
  175. sierra/plugins/prod/render/plugin.py +282 -0
  176. sierra/plugins/storage/__init__.py +5 -0
  177. sierra/plugins/storage/arrow/__init__.py +18 -0
  178. sierra/plugins/storage/arrow/plugin.py +38 -0
  179. sierra/plugins/storage/csv/__init__.py +9 -0
  180. sierra/plugins/storage/csv/plugin.py +12 -5
  181. sierra/version.py +3 -2
  182. sierra_research-1.5.0.dist-info/METADATA +238 -0
  183. sierra_research-1.5.0.dist-info/RECORD +186 -0
  184. {sierra_research-1.3.6.dist-info → sierra_research-1.5.0.dist-info}/WHEEL +1 -2
  185. sierra/core/experiment/xml.py +0 -454
  186. sierra/core/generators/controller_generator_parser.py +0 -34
  187. sierra/core/generators/exp_creator.py +0 -351
  188. sierra/core/generators/exp_generators.py +0 -142
  189. sierra/core/graphs/scatterplot2D.py +0 -109
  190. sierra/core/graphs/stacked_line_graph.py +0 -249
  191. sierra/core/graphs/stacked_surface_graph.py +0 -220
  192. sierra/core/graphs/summary_line_graph.py +0 -369
  193. sierra/core/hpc/cmdline.py +0 -142
  194. sierra/core/models/graphs.py +0 -87
  195. sierra/core/pipeline/stage2/exp_runner.py +0 -286
  196. sierra/core/pipeline/stage3/imagizer.py +0 -149
  197. sierra/core/pipeline/stage3/run_collator.py +0 -317
  198. sierra/core/pipeline/stage3/statistics_calculator.py +0 -478
  199. sierra/core/pipeline/stage4/graph_collator.py +0 -319
  200. sierra/core/pipeline/stage4/inter_exp_graph_generator.py +0 -240
  201. sierra/core/pipeline/stage4/intra_exp_graph_generator.py +0 -317
  202. sierra/core/pipeline/stage4/model_runner.py +0 -168
  203. sierra/core/pipeline/stage4/rendering.py +0 -283
  204. sierra/core/pipeline/stage4/yaml_config_loader.py +0 -103
  205. sierra/core/pipeline/stage5/inter_scenario_comparator.py +0 -328
  206. sierra/core/pipeline/stage5/intra_scenario_comparator.py +0 -989
  207. sierra/core/platform.py +0 -493
  208. sierra/core/plugin_manager.py +0 -369
  209. sierra/core/root_dirpath_generator.py +0 -241
  210. sierra/plugins/hpc/adhoc/plugin.py +0 -125
  211. sierra/plugins/hpc/local/plugin.py +0 -81
  212. sierra/plugins/hpc/pbs/__init__.py +0 -9
  213. sierra/plugins/hpc/pbs/plugin.py +0 -126
  214. sierra/plugins/hpc/slurm/__init__.py +0 -9
  215. sierra/plugins/hpc/slurm/plugin.py +0 -130
  216. sierra/plugins/platform/__init__.py +0 -9
  217. sierra/plugins/platform/argos/__init__.py +0 -9
  218. sierra/plugins/platform/argos/generators/platform_generators.py +0 -383
  219. sierra/plugins/platform/argos/plugin.py +0 -337
  220. sierra/plugins/platform/argos/variables/arena_shape.py +0 -145
  221. sierra/plugins/platform/argos/variables/cameras.py +0 -243
  222. sierra/plugins/platform/argos/variables/constant_density.py +0 -136
  223. sierra/plugins/platform/argos/variables/exp_setup.py +0 -113
  224. sierra/plugins/platform/argos/variables/population_constant_density.py +0 -175
  225. sierra/plugins/platform/argos/variables/population_size.py +0 -102
  226. sierra/plugins/platform/argos/variables/population_variable_density.py +0 -132
  227. sierra/plugins/platform/argos/variables/rendering.py +0 -104
  228. sierra/plugins/platform/ros1gazebo/__init__.py +0 -9
  229. sierra/plugins/platform/ros1gazebo/cmdline.py +0 -213
  230. sierra/plugins/platform/ros1gazebo/generators/platform_generators.py +0 -137
  231. sierra/plugins/platform/ros1gazebo/plugin.py +0 -335
  232. sierra/plugins/platform/ros1gazebo/variables/__init__.py +0 -10
  233. sierra/plugins/platform/ros1gazebo/variables/population_size.py +0 -204
  234. sierra/plugins/platform/ros1robot/__init__.py +0 -9
  235. sierra/plugins/platform/ros1robot/cmdline.py +0 -175
  236. sierra/plugins/platform/ros1robot/generators/platform_generators.py +0 -112
  237. sierra/plugins/platform/ros1robot/plugin.py +0 -373
  238. sierra/plugins/platform/ros1robot/variables/__init__.py +0 -10
  239. sierra/plugins/platform/ros1robot/variables/population_size.py +0 -146
  240. sierra/plugins/robot/__init__.py +0 -9
  241. sierra/plugins/robot/turtlebot3/__init__.py +0 -9
  242. sierra/plugins/robot/turtlebot3/plugin.py +0 -194
  243. sierra_research-1.3.6.data/data/share/man/man1/sierra-cli.1 +0 -2349
  244. sierra_research-1.3.6.data/data/share/man/man7/sierra-examples.7 +0 -488
  245. sierra_research-1.3.6.data/data/share/man/man7/sierra-exec-envs.7 +0 -331
  246. sierra_research-1.3.6.data/data/share/man/man7/sierra-glossary.7 +0 -285
  247. sierra_research-1.3.6.data/data/share/man/man7/sierra-platforms.7 +0 -358
  248. sierra_research-1.3.6.data/data/share/man/man7/sierra-usage.7 +0 -725
  249. sierra_research-1.3.6.data/data/share/man/man7/sierra.7 +0 -78
  250. sierra_research-1.3.6.dist-info/METADATA +0 -500
  251. sierra_research-1.3.6.dist-info/RECORD +0 -133
  252. sierra_research-1.3.6.dist-info/top_level.txt +0 -1
  253. {sierra_research-1.3.6.dist-info → sierra_research-1.5.0.dist-info}/entry_points.txt +0 -0
  254. {sierra_research-1.3.6.dist-info → sierra_research-1.5.0.dist-info/licenses}/LICENSE +0 -0
@@ -1,125 +0,0 @@
1
- # Copyright 2020 John Harwell, All rights reserved.
2
- #
3
- # SPDX-License-Identifier: MIT
4
- """HPC plugin for running experiments with an ad-hoc set of compute nodes.
5
-
6
- E.g., whatever computers you happen to have laying around in the lab.
7
-
8
- """
9
-
10
- # Core packages
11
- import os
12
- import typing as tp
13
- import argparse
14
- import shutil
15
- import pathlib
16
-
17
- # 3rd party packages
18
- import implements
19
-
20
- # Project packages
21
- from sierra.core import types, utils
22
- from sierra.core.experiment import bindings
23
-
24
-
25
- @implements.implements(bindings.IParsedCmdlineConfigurer)
26
- class ParsedCmdlineConfigurer():
27
- """Configure SIERRA for ad-hoc HPC.
28
-
29
- May use the following environment variables:
30
-
31
- - ``SIERRA_NODEFILE`` - If this is not defined ``--nodefile`` must be
32
- passed.
33
-
34
- """
35
-
36
- def __init__(self, exec_env: str) -> None:
37
- pass
38
-
39
- def __call__(self, args: argparse.Namespace) -> None:
40
- if args.nodefile is None:
41
- assert 'SIERRA_NODEFILE' in os.environ,\
42
- ("Non-hpc.adhoc environment detected: --nodefile not "
43
- "passed and 'SIERRA_NODEFILE' not found")
44
- args.nodefile = os.environ['SIERRA_NODEFILE']
45
-
46
- assert utils.path_exists(args.nodefile), \
47
- f"SIERRA_NODEFILE '{args.nodefile}' does not exist"
48
-
49
- assert not args.platform_vc,\
50
- "Platform visual capture not supported on Adhoc"
51
-
52
-
53
- @implements.implements(bindings.IExpShellCmdsGenerator)
54
- class ExpShellCmdsGenerator():
55
- """Generate the cmd to invoke GNU Parallel in the ad-hoc HPC environment.
56
- """
57
-
58
- def __init__(self,
59
- cmdopts: types.Cmdopts,
60
- exp_num: int) -> None:
61
- self.cmdopts = cmdopts
62
-
63
- def pre_exp_cmds(self) -> tp.List[types.ShellCmdSpec]:
64
- return []
65
-
66
- def post_exp_cmds(self) -> tp.List[types.ShellCmdSpec]:
67
- return []
68
-
69
- def exec_exp_cmds(self, exec_opts: types.StrDict) -> tp.List[types.ShellCmdSpec]:
70
- jobid = os.getpid()
71
-
72
- # Even if we are passed --nodelist, we still make our own copy of it, so
73
- # that the user can safely modify it (if they want to) after running
74
- # stage 1.
75
- nodelist = pathlib.Path(exec_opts['exp_input_root'],
76
- f"{jobid}-nodelist.txt")
77
-
78
- resume = ''
79
- # This can't be --resume, because then GNU parallel looks at the results
80
- # directory, and if there is stuff in it, (apparently) assumes that the
81
- # job finished...
82
- if exec_opts['exec_resume']:
83
- resume = '--resume-failed'
84
-
85
- # Make sure there are no duplicate nodes
86
- unique_nodes = types.ShellCmdSpec(
87
- cmd='sort -u {0} > {1}'.format(exec_opts["nodefile"], nodelist),
88
- shell=True,
89
- wait=True)
90
- # Make sure GNU parallel uses the right shell, because it seems to
91
- # defaults to /bin/sh since all cmds are run in a python shell which
92
- # does not have $SHELL set.
93
- use_bash = types.ShellCmdSpec(
94
- cmd='export PARALLEL_SHELL={0}'.format(shutil.which('bash')),
95
- shell=True,
96
- wait=True,
97
- env=True)
98
-
99
- # GNU parallel cmd
100
- parallel = 'parallel {2} ' \
101
- '--jobs {1} ' \
102
- '--results {4} ' \
103
- '--joblog {3} ' \
104
- '--sshloginfile {0} ' \
105
- '--workdir {4} < "{5}"'
106
-
107
- log = pathlib.Path(exec_opts['scratch_dir'], "parallel.log")
108
- parallel = parallel.format(nodelist,
109
- exec_opts['n_jobs'],
110
- resume,
111
- log,
112
- exec_opts['scratch_dir'],
113
- exec_opts['cmdfile_stem_path'] + exec_opts['cmdfile_ext'])
114
-
115
- parallel_spec = types.ShellCmdSpec(cmd=parallel,
116
- shell=True,
117
- wait=True)
118
-
119
- return [unique_nodes, use_bash, parallel_spec]
120
-
121
-
122
- __api__ = [
123
- 'ParsedCmdlineConfigurer',
124
- 'ExpShellCmdsGenerator',
125
- ]
@@ -1,81 +0,0 @@
1
- # Copyright 2020 John Harwell, All rights reserved.
2
- #
3
- # SPDX-License-Identifier: MIT
4
- """HPC plugin for running SIERRA locally.
5
-
6
- Not necessarily HPC, but it fits well enough under that semantic umbrella.
7
-
8
- """
9
-
10
- # Core packages
11
- import typing as tp
12
- import shutil
13
- import pathlib
14
-
15
- # 3rd party packages
16
- import implements
17
-
18
- # Project packages
19
- from sierra.core import types
20
- from sierra.core.experiment import bindings
21
-
22
-
23
- @implements.implements(bindings.IExpShellCmdsGenerator)
24
- class ExpShellCmdsGenerator():
25
- """
26
- Generate the command to invoke GNU parallel for local HPC.
27
- """
28
-
29
- def __init__(self,
30
- cmdopts: types.Cmdopts,
31
- exp_num: int) -> None:
32
- self.cmdopts = cmdopts
33
-
34
- def pre_exp_cmds(self) -> tp.List[types.ShellCmdSpec]:
35
- return []
36
-
37
- def post_exp_cmds(self) -> tp.List[types.ShellCmdSpec]:
38
- return []
39
-
40
- def exec_exp_cmds(self, exec_opts: types.StrDict) -> tp.List[types.ShellCmdSpec]:
41
- resume = ''
42
-
43
- # This can't be --resume, because then GNU parallel looks at the results
44
- # directory, and if there is stuff in it, (apparently) assumes that the
45
- # job finished...
46
- if exec_opts['exec_resume']:
47
- resume = '--resume-failed'
48
-
49
- # Make sure GNU parallel uses the right shell, because it seems to
50
- # defaults to /bin/sh since all cmds are run in a python shell which
51
- # does not have $SHELL set.
52
- shell = shutil.which('bash')
53
- use_bash = types.ShellCmdSpec(cmd=f'export PARALLEL_SHELL={shell}',
54
- shell=True,
55
- wait=True,
56
- env=True)
57
-
58
- parallel = 'parallel {1} ' \
59
- '--jobs {2} ' \
60
- '--results {0} '\
61
- '--joblog {3} '\
62
- '--no-notice < "{4}"'
63
-
64
- log = pathlib.Path(exec_opts['scratch_dir'], "parallel.log")
65
- parallel = parallel.format(exec_opts['scratch_dir'],
66
- resume,
67
- exec_opts['n_jobs'],
68
- log,
69
- exec_opts['cmdfile_stem_path'] +
70
- exec_opts['cmdfile_ext'])
71
-
72
- parallel_spec = types.ShellCmdSpec(cmd=parallel,
73
- shell=True,
74
- wait=True)
75
-
76
- return [use_bash, parallel_spec]
77
-
78
-
79
- __api__ = [
80
- 'ExpShellCmdsGenerator'
81
- ]
@@ -1,9 +0,0 @@
1
- # Copyright 2021 John Harwell, All rights reserved.
2
- #
3
- # SPDX-License-Identifier: MIT
4
-
5
- # Core packages
6
-
7
- # 3rd party packages
8
-
9
- # Project packages
@@ -1,126 +0,0 @@
1
- # Copyright 2020 John Harwell, All rights reserved.
2
- #
3
- # SPDX-License-Identifier: MIT
4
- """
5
- HPC plugin for running SIERRA on HPC clusters using the TORQUE-PBS scheduler.
6
- """
7
-
8
- # Core packages
9
- import os
10
- import typing as tp
11
- import argparse
12
- import shutil
13
- import pathlib
14
-
15
- # 3rd party packages
16
- import implements
17
-
18
- # Project packages
19
- from sierra.core import types
20
- from sierra.core.experiment import bindings
21
-
22
-
23
- @implements.implements(bindings.IParsedCmdlineConfigurer)
24
- class ParsedCmdlineConfigurer():
25
- """Configure SIERRA for PBS HPC.
26
-
27
- Uses the following environment variables (if any of them are not defined an
28
- assertion will be triggered):
29
-
30
- - ``PBS_NUM_PPN``
31
- - ``PBS_NODEFILE``
32
- - ``PBS_JOBID``
33
-
34
- """
35
-
36
- def __init__(self, exec_env: str) -> None:
37
- pass
38
-
39
- def __call__(self, args: argparse.Namespace) -> None:
40
- keys = ['PBS_NUM_PPN',
41
- 'PBS_NODEFILE',
42
- 'PBS_JOBID'
43
- ]
44
-
45
- for k in keys:
46
- assert k in os.environ,\
47
- f"Non-PBS environment detected: '{k}' not found"
48
-
49
- assert args.exec_jobs_per_node is not None, \
50
- "--exec-jobs-per-node is required (can't be computed from PBS)"
51
-
52
- assert not args.platform_vc,\
53
- "Platform visual capture not supported on PBS"
54
-
55
-
56
- @implements.implements(bindings.IExpShellCmdsGenerator)
57
- class ExpShellCmdsGenerator():
58
- """Generate the cmd to invoke GNU Parallel on PBS HPC.
59
-
60
- """
61
-
62
- def __init__(self,
63
- cmdopts: types.Cmdopts,
64
- exp_num: int) -> None:
65
- self.cmdopts = cmdopts
66
-
67
- def pre_exp_cmds(self) -> tp.List[types.ShellCmdSpec]:
68
- return []
69
-
70
- def post_exp_cmds(self) -> tp.List[types.ShellCmdSpec]:
71
- return []
72
-
73
- def exec_exp_cmds(self, exec_opts: types.StrDict) -> tp.List[types.ShellCmdSpec]:
74
- resume = ''
75
- jobid = os.environ['PBS_JOBID']
76
- nodelist = pathlib.Path(exec_opts['exp_input_root'],
77
- f"{jobid}-nodelist.txt")
78
-
79
- resume = ''
80
- # This can't be --resume, because then GNU parallel looks at the results
81
- # directory, and if there is stuff in it, (apparently) assumes that the
82
- # job finished...
83
- if exec_opts['exec_resume']:
84
- resume = '--resume-failed'
85
-
86
- unique_nodes = types.ShellCmdSpec(cmd=f'sort -u $PBS_NODEFILE > {nodelist}',
87
- shell=True,
88
- wait=True)
89
-
90
- # Make sure GNU parallel uses the right shell, because it seems to
91
- # defaults to /bin/sh since all cmds are run in a python shell which
92
- # does not have $SHELL set.
93
- shell = shutil.which('bash')
94
- use_bash = types.ShellCmdSpec(cmd=f'export PARALLEL_SHELL={shell}',
95
- shell=True,
96
- wait=True,
97
- env=True)
98
-
99
- parallel = 'parallel {2} ' \
100
- '--jobs {1} ' \
101
- '--results {4} ' \
102
- '--joblog {3} ' \
103
- '--sshloginfile {0} ' \
104
- '--workdir {4} < "{5}"'
105
-
106
- log = pathlib.Path(exec_opts['scratch_dir'], "parallel.log")
107
- parallel = parallel.format(nodelist,
108
- exec_opts['n_jobs'],
109
- resume,
110
- log,
111
- exec_opts['scratch_dir'],
112
- exec_opts['cmdfile_stem_path'] +
113
- exec_opts['cmdfile_ext'])
114
-
115
- parallel_spec = types.ShellCmdSpec(cmd=parallel,
116
- shell=True,
117
- wait=True)
118
-
119
- return [unique_nodes, use_bash, parallel_spec]
120
-
121
-
122
- __api__ = [
123
- 'ParsedCmdlineConfigurer',
124
-
125
-
126
- ]
@@ -1,9 +0,0 @@
1
- # Copyright 2021 John Harwell, All rights reserved.
2
- #
3
- # SPDX-License-Identifier: MIT
4
-
5
- # Core packages
6
-
7
- # 3rd party packages
8
-
9
- # Project packages
@@ -1,130 +0,0 @@
1
- # Copyright 2020 John Harwell, All rights reserved.
2
- #
3
- # SPDX-License-Identifier: MIT
4
- """
5
- HPC plugin for running SIERRA on HPC clusters using the SLURM scheduler.
6
- """
7
-
8
- # Core packages
9
- import typing as tp
10
- import argparse
11
- import shutil
12
- import pathlib
13
- import os
14
-
15
- # 3rd party packages
16
- import implements
17
-
18
- # Project packages
19
- from sierra.core import types
20
- from sierra.core.experiment import bindings
21
-
22
-
23
- @implements.implements(bindings.IParsedCmdlineConfigurer)
24
- class ParsedCmdlineConfigurer():
25
- """Configure SIERRA for SLURM HPC.
26
-
27
- Uses the following environment variables (if any of them are not defined an
28
- assertion will be triggered):
29
-
30
- - ``SLURM_CPUS_PER_TASK``
31
- - ``SLURM_TASKS_PER_NODE``
32
- - ``SLURM_JOB_NODELIST``
33
- - ``SLURM_JOB_ID``
34
-
35
- """
36
-
37
- def __init__(self, exec_env: str) -> None:
38
- pass
39
-
40
- def __call__(self, args: argparse.Namespace) -> None:
41
- keys = ['SLURM_CPUS_PER_TASK',
42
- 'SLURM_TASKS_PER_NODE',
43
- 'SLURM_JOB_NODELIST',
44
- 'SLURM_JOB_ID']
45
-
46
- for k in keys:
47
- assert k in os.environ,\
48
- f"Non-SLURM environment detected: '{k}' not found"
49
-
50
- assert not args.platform_vc,\
51
- "Platform visual capture not supported on SLURM"
52
-
53
- # SLURM_TASKS_PER_NODE can be set to things like '1(x32),3', indicating
54
- # that not all nodes will run the same # of tasks. SIERRA expects all
55
- # nodes to have the same # tasks allocated to each (i.e., a homogeneous
56
- # allocation), so we check for this.
57
- assert "," not in os.environ['SLURM_TASKS_PER_NODE'], \
58
- "SLURM_TASKS_PER_NODE not homogeneous"
59
-
60
-
61
- @implements.implements(bindings.IExpShellCmdsGenerator)
62
- class ExpShellCmdsGenerator():
63
- """Generate the cmd to correctly invoke GNU Parallel on SLURM HPC.
64
-
65
- """
66
-
67
- def __init__(self,
68
- cmdopts: types.Cmdopts,
69
- exp_num: int) -> None:
70
- self.cmdopts = cmdopts
71
-
72
- def pre_exp_cmds(self) -> tp.List[types.ShellCmdSpec]:
73
- return []
74
-
75
- def post_exp_cmds(self) -> tp.List[types.ShellCmdSpec]:
76
- return []
77
-
78
- def exec_exp_cmds(self, exec_opts: types.StrDict) -> tp.List[types.ShellCmdSpec]:
79
- jobid = os.environ['SLURM_JOB_ID']
80
- nodelist = pathlib.Path(exec_opts['exp_input_root'],
81
- f"{jobid}-nodelist.txt")
82
-
83
- resume = ''
84
- # This can't be --resume, because then GNU parallel looks at the results
85
- # directory, and if there is stuff in it, (apparently) assumes that the
86
- # job finished...
87
- if exec_opts['exec_resume']:
88
- resume = '--resume-failed'
89
-
90
- unique_nodes = types.ShellCmdSpec(
91
- cmd=f'scontrol show hostnames $SLURM_JOB_NODELIST > {nodelist}',
92
- shell=True,
93
- wait=True)
94
-
95
- # Make sure GNU parallel uses the right shell, because it seems to
96
- # defaults to /bin/sh since all cmds are run in a python shell which
97
- # does not have $SHELL set.
98
- shell = shutil.which('bash')
99
- use_bash = types.ShellCmdSpec(cmd=f'export PARALLEL_SHELL={shell}',
100
- shell=True,
101
- wait=True)
102
-
103
- parallel = 'parallel {2} ' \
104
- '--jobs {1} ' \
105
- '--results {4} ' \
106
- '--joblog {3} ' \
107
- '--sshloginfile {0} ' \
108
- '--workdir {4} < "{5}"'
109
-
110
- log = pathlib.Path(exec_opts['scratch_dir'], "parallel.log")
111
- parallel = parallel.format(nodelist,
112
- exec_opts['n_jobs'],
113
- resume,
114
- log,
115
- exec_opts['scratch_dir'],
116
- exec_opts['cmdfile_stem_path'] +
117
- exec_opts['cmdfile_ext'])
118
- parallel_spec = types.ShellCmdSpec(cmd=parallel,
119
- shell=True,
120
- wait=True)
121
-
122
- return [unique_nodes, use_bash, parallel_spec]
123
-
124
-
125
- __api__ = [
126
- 'ParsedCmdlineConfigurer',
127
- 'ExpShellCmdsGenerator'
128
-
129
-
130
- ]
@@ -1,9 +0,0 @@
1
- # Copyright 2021 John Harwell, All rights reserved.
2
- #
3
- # SPDX-License-Identifier: MIT
4
-
5
- # Core packages
6
-
7
- # 3rd party packages
8
-
9
- # Project packages
@@ -1,9 +0,0 @@
1
- # Copyright 2021 John Harwell, All rights reserved.
2
- #
3
- # SPDX-License-Identifier: MIT
4
-
5
- # Core packages
6
-
7
- # 3rd party packages
8
-
9
- # Project packages