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,146 +0,0 @@
1
- # Copyright 2020 John Harwell, All rights reserved.
2
- #
3
- # SPDX-License-Identifier: MIT
4
- """Classes for the population size batch criteria.
5
-
6
- See :ref:`ln-sierra-platform-ros1robot-bc-population-size` for usage
7
- documentation.
8
-
9
- """
10
-
11
- # Core packages
12
- import typing as tp
13
- import logging
14
- import pathlib
15
-
16
- # 3rd party packages
17
- import implements
18
-
19
- # Project packages
20
- from sierra.core.variables import batch_criteria as bc
21
- from sierra.core import types
22
- from sierra.core.variables import population_size
23
- from sierra.core.experiment import xml
24
-
25
-
26
- @implements.implements(bc.IConcreteBatchCriteria)
27
- @implements.implements(bc.IQueryableBatchCriteria)
28
- class PopulationSize(population_size.BasePopulationSize):
29
- """A univariate range of system sizes used to define batch experiments.
30
-
31
- This class is a base class which should (almost) never be used on its
32
- own. Instead, the ``factory()`` function should be used to dynamically
33
- create derived classes expressing the user's desired size distribution.
34
-
35
- Note: Usage of this class assumes homogeneous systems.
36
-
37
- Attributes:
38
-
39
- size_list: List of integer system sizes defining the range of the
40
- variable for the batch experiment.
41
-
42
- """
43
-
44
- def __init__(self,
45
- cli_arg: str,
46
- main_config: types.YAMLDict,
47
- batch_input_root: pathlib.Path,
48
- robot: str,
49
- sizes: tp.List[int]) -> None:
50
- population_size.BasePopulationSize.__init__(self,
51
- cli_arg,
52
- main_config,
53
- batch_input_root)
54
- self.sizes = sizes
55
- self.robot = robot
56
- self.logger = logging.getLogger(__name__)
57
- self.tag_adds = [] # type: tp.List[xml.TagAddList]
58
-
59
- def gen_tag_addlist(self) -> tp.List[xml.TagAddList]:
60
- """
61
- Generate XML modifications to set system sizes.
62
- """
63
- if not self.tag_adds:
64
- robot_config = self.main_config['ros']['robots'][self.robot]
65
- prefix = robot_config['prefix']
66
-
67
- for s in self.sizes:
68
- per_robot = xml.TagAddList()
69
- per_robot.append(xml.TagAdd(".",
70
- "master",
71
- {},
72
- True))
73
- per_robot.append(xml.TagAdd("./master",
74
- "group",
75
- {
76
- 'ns': 'sierra'
77
- },
78
- False))
79
- per_robot.append(xml.TagAdd("./master/group/[@ns='sierra']",
80
- "param",
81
- {
82
- 'name': 'experiment/n_robots',
83
- 'value': str(s)
84
- },
85
- False))
86
-
87
- for i in range(0, s):
88
-
89
- # Note that we don't try to do any of the robot bringup
90
- # here--we can't know the exact node/package names without
91
- # using a lot of (brittle) config.
92
- ns = f'{prefix}{i}'
93
- per_robot.append(xml.TagAdd("./robot",
94
- "group",
95
- {
96
- 'ns': ns
97
- },
98
- True))
99
-
100
- per_robot.append(xml.TagAdd(f"./robot/group/[@ns='{ns}']",
101
- "param",
102
- {
103
- "name": "tf_prefix",
104
- "value": ns
105
- },
106
- True))
107
-
108
- self.tag_adds.append(per_robot)
109
-
110
- return self.tag_adds
111
-
112
- def gen_exp_names(self, cmdopts: types.Cmdopts) -> tp.List[str]:
113
- adds = self.gen_tag_addlist()
114
- return ['exp' + str(x) for x in range(0, len(adds))]
115
-
116
- def n_robots(self, exp_num: int) -> int:
117
- return self.sizes[exp_num]
118
-
119
-
120
- def factory(cli_arg: str,
121
- main_config: types.YAMLDict,
122
- cmdopts: types.Cmdopts,
123
- **kwargs) -> PopulationSize:
124
- """Create a :class:`PopulationSize` derived class from the cmdline definition.
125
-
126
- """
127
- parser = population_size.Parser()
128
- attr = parser(cli_arg)
129
- max_sizes = parser.to_sizes(attr)
130
-
131
- def __init__(self) -> None:
132
- PopulationSize.__init__(self,
133
- cli_arg,
134
- main_config,
135
- cmdopts['batch_input_root'],
136
- cmdopts['robot'],
137
- max_sizes)
138
-
139
- return type(cli_arg, # type: ignore
140
- (PopulationSize,),
141
- {"__init__": __init__})
142
-
143
-
144
- __api__ = [
145
- 'PopulationSize'
146
- ]
@@ -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
@@ -1,194 +0,0 @@
1
- # Copyright 2021 John Harwell, All rights reserved.
2
- #
3
- # SPDX-License-Identifier: MIT
4
- """
5
- Robot plugin for running SIERRA with a set of Turtlebot3 robots.
6
-
7
- """
8
-
9
- # Core packages
10
- import os
11
- import logging
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, platform, utils
22
- from sierra.core.experiment import bindings
23
-
24
-
25
- @implements.implements(bindings.IParsedCmdlineConfigurer)
26
- class ParsedCmdlineConfigurer():
27
- """Configure SIERRA for the turtlebot3 execution environment.
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
- self.logger = logging.getLogger("robot.turtlebot3")
38
-
39
- def __call__(self, args: argparse.Namespace) -> None:
40
- if args.nodefile is None:
41
- assert 'SIERRA_NODEFILE' in os.environ,\
42
- ("Non-robot.turtlebot3 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
- self.logger.info("Using '%s' as robot hostnames file", args.nodefile)
49
-
50
- assert not args.platform_vc,\
51
- "Platform visual capture not supported on robot.turtlebot3"
52
-
53
-
54
- @implements.implements(bindings.IExpShellCmdsGenerator)
55
- class ExpShellCmdsGenerator():
56
- """Generate the cmds to invoke GNU Parallel to launch ROS on the turtlebots.
57
-
58
- """
59
-
60
- def __init__(self,
61
- cmdopts: types.Cmdopts,
62
- exp_num: int) -> None:
63
- self.cmdopts = cmdopts
64
- self.exp_num = exp_num
65
-
66
- def pre_exp_cmds(self) -> tp.List[types.ShellCmdSpec]:
67
- return []
68
-
69
- def post_exp_cmds(self) -> tp.List[types.ShellCmdSpec]:
70
- return []
71
-
72
- def exec_exp_cmds(self, exec_opts: types.StrDict) -> tp.List[types.ShellCmdSpec]:
73
- jobid = os.getpid()
74
-
75
- # Even if we are passed --nodelist, we still make our own copy of it, so
76
- # that the user can safely modify it (if they want to) after running
77
- # stage 1.
78
- nodelist = pathlib.Path(exec_opts['exp_input_root'],
79
- "{0}-nodelist.txt".format(jobid))
80
-
81
- resume = ''
82
- # This can't be --resume, because then GNU parallel looks at the results
83
- # directory, and if there is stuff in it, (apparently) assumes that the
84
- # job finished...
85
- if exec_opts['exec_resume']:
86
- resume = '--resume-failed'
87
-
88
- # Make sure there are no duplicate nodes
89
- unique_nodes = types.ShellCmdSpec(
90
- cmd='sort -u {0} > {1}'.format(exec_opts["nodefile"], nodelist),
91
- shell=True,
92
- wait=True)
93
-
94
- # Make sure GNU parallel uses the right shell, because it seems to
95
- # defaults to /bin/sh since all cmds are run in a python shell which
96
- # does not have $SHELL set.
97
- use_bash = types.ShellCmdSpec(
98
- cmd='export PARALLEL_SHELL={0}'.format(shutil.which('bash')),
99
- shell=True,
100
- env=True,
101
- wait=True)
102
-
103
- ret = [use_bash, unique_nodes]
104
-
105
- # 1 GNU parallel command to launch each experimental run, because each
106
- # run might use all available nodes/robots.
107
- for i in range(self.cmdopts['n_runs']):
108
-
109
- # GNU parallel cmd for robots (slaves)
110
- robots = 'parallel {2} ' \
111
- '--jobs {1} ' \
112
- '--results {4} ' \
113
- '--joblog {3} ' \
114
- '--sshloginfile {0} ' \
115
- '--workdir {4} < "{5}"'
116
-
117
- robots_ipath = exec_opts['cmdfile_stem_path'] + \
118
- f"_run{i}_slave" + exec_opts['cmdfile_ext']
119
-
120
- robot_log = pathlib.Path(exec_opts['scratch_dir'],
121
- f"parallel-slaves-run{i}.log")
122
-
123
- robots = robots.format(nodelist,
124
- exec_opts['n_jobs'],
125
- resume,
126
- robot_log,
127
- exec_opts['scratch_dir'],
128
- robots_ipath)
129
-
130
- # If no master is spawned, then we need to wait for this GNU
131
- # parallel cmd. If the master is spawned, then we wait for THAT
132
- # command; waiting for both results in the master never starting
133
- # because that cmd is never run.
134
- robots_spec = types.ShellCmdSpec(cmd=robots,
135
- shell=True,
136
- wait=self.cmdopts['no_master_node'])
137
- ret.append(robots_spec)
138
-
139
- if not self.cmdopts['no_master_node']:
140
- ros_master = 'parallel {3} ' \
141
- '--results {1} ' \
142
- '--joblog {0} ' \
143
- '--workdir {1} < "{2}"'
144
-
145
- ros_master_ipath = exec_opts['cmdfile_stem_path'] + \
146
- f"_run{i}_master" + exec_opts['cmdfile_ext']
147
-
148
- master_log = pathlib.Path(exec_opts['scratch_dir'],
149
- f"parallel-master-run{i}.log")
150
- ros_master = ros_master.format(master_log,
151
- exec_opts['scratch_dir'],
152
- ros_master_ipath,
153
- resume)
154
-
155
- master_spec = types.ShellCmdSpec(cmd=ros_master,
156
- shell=True,
157
- wait=not self.cmdopts['no_master_node'])
158
- ret.append(master_spec)
159
-
160
- wait = ('echo "{0} seconds until launching next run!"; '
161
- 'sleep {0}s ;'.format(self.cmdopts['exec_inter_run_pause']))
162
- wait_spec = types.ShellCmdSpec(cmd=wait,
163
- shell=True,
164
- wait=True)
165
- ret.append(wait_spec)
166
- return ret
167
-
168
-
169
- class ExecEnvChecker(platform.ExecEnvChecker):
170
- def __init__(self, cmdopts: types.Cmdopts) -> None:
171
- super().__init__(cmdopts)
172
- self.cmdopts = cmdopts
173
- self.logger = logging.getLogger('robot.turtlebot3')
174
-
175
- def __call__(self) -> None:
176
- nodes = self.parse_nodefile(self.cmdopts['nodefile'])
177
- for node in nodes:
178
- if int(node.n_cores) != 1:
179
- self.logger.warning(("Nodefile %s, host %s has multiple "
180
- "cores; turtlebots are single core"),
181
- self.cmdopts['nodefile'],
182
- node.hostname)
183
- if not self.cmdopts['skip_online_check']:
184
- self.check_connectivity(node.login,
185
- node.hostname,
186
- node.port,
187
- 'turtlebot3')
188
-
189
-
190
- __api__ = [
191
- 'ParsedCmdlineConfigurer',
192
- 'ExpShellCmdsGenerator',
193
- 'ExecEnvChecker'
194
- ]