sierra-research 1.3.11__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.
- sierra/__init__.py +3 -3
- sierra/core/__init__.py +3 -3
- sierra/core/batchroot.py +223 -0
- sierra/core/cmdline.py +681 -1057
- sierra/core/compare.py +11 -0
- sierra/core/config.py +96 -88
- sierra/core/engine.py +306 -0
- sierra/core/execenv.py +380 -0
- sierra/core/expdef.py +11 -0
- sierra/core/experiment/__init__.py +1 -0
- sierra/core/experiment/bindings.py +150 -101
- sierra/core/experiment/definition.py +414 -245
- sierra/core/experiment/spec.py +83 -85
- sierra/core/exproot.py +44 -0
- sierra/core/generators/__init__.py +10 -0
- sierra/core/generators/experiment.py +528 -0
- sierra/core/generators/generator_factory.py +138 -137
- sierra/core/graphs/__init__.py +23 -0
- sierra/core/graphs/bcbridge.py +94 -0
- sierra/core/graphs/heatmap.py +245 -324
- sierra/core/graphs/pathset.py +27 -0
- sierra/core/graphs/schema.py +77 -0
- sierra/core/graphs/stacked_line.py +341 -0
- sierra/core/graphs/summary_line.py +506 -0
- sierra/core/logging.py +3 -2
- sierra/core/models/__init__.py +3 -1
- sierra/core/models/info.py +19 -0
- sierra/core/models/interface.py +52 -122
- sierra/core/pipeline/__init__.py +2 -5
- sierra/core/pipeline/pipeline.py +228 -126
- sierra/core/pipeline/stage1/__init__.py +10 -0
- sierra/core/pipeline/stage1/pipeline_stage1.py +45 -31
- sierra/core/pipeline/stage2/__init__.py +10 -0
- sierra/core/pipeline/stage2/pipeline_stage2.py +8 -11
- sierra/core/pipeline/stage2/runner.py +401 -0
- sierra/core/pipeline/stage3/__init__.py +12 -0
- sierra/core/pipeline/stage3/gather.py +321 -0
- sierra/core/pipeline/stage3/pipeline_stage3.py +37 -84
- sierra/core/pipeline/stage4/__init__.py +12 -2
- sierra/core/pipeline/stage4/pipeline_stage4.py +36 -354
- sierra/core/pipeline/stage5/__init__.py +12 -0
- sierra/core/pipeline/stage5/pipeline_stage5.py +33 -208
- sierra/core/pipeline/yaml.py +48 -0
- sierra/core/plugin.py +529 -62
- sierra/core/proc.py +11 -0
- sierra/core/prod.py +11 -0
- sierra/core/ros1/__init__.py +5 -1
- sierra/core/ros1/callbacks.py +22 -21
- sierra/core/ros1/cmdline.py +59 -88
- sierra/core/ros1/generators.py +159 -175
- sierra/core/ros1/variables/__init__.py +3 -0
- sierra/core/ros1/variables/exp_setup.py +122 -116
- sierra/core/startup.py +106 -76
- sierra/core/stat_kernels.py +4 -5
- sierra/core/storage.py +13 -32
- sierra/core/trampoline.py +30 -0
- sierra/core/types.py +116 -71
- sierra/core/utils.py +103 -106
- sierra/core/variables/__init__.py +1 -1
- sierra/core/variables/base_variable.py +12 -17
- sierra/core/variables/batch_criteria.py +387 -481
- sierra/core/variables/builtin.py +135 -0
- sierra/core/variables/exp_setup.py +19 -39
- sierra/core/variables/population_size.py +72 -76
- sierra/core/variables/variable_density.py +44 -68
- sierra/core/vector.py +1 -1
- sierra/main.py +256 -88
- sierra/plugins/__init__.py +119 -0
- sierra/plugins/compare/__init__.py +14 -0
- sierra/plugins/compare/graphs/__init__.py +19 -0
- sierra/plugins/compare/graphs/cmdline.py +120 -0
- sierra/plugins/compare/graphs/comparator.py +291 -0
- sierra/plugins/compare/graphs/inter_controller.py +531 -0
- sierra/plugins/compare/graphs/inter_scenario.py +297 -0
- sierra/plugins/compare/graphs/namecalc.py +53 -0
- sierra/plugins/compare/graphs/outputroot.py +73 -0
- sierra/plugins/compare/graphs/plugin.py +147 -0
- sierra/plugins/compare/graphs/preprocess.py +172 -0
- sierra/plugins/compare/graphs/schema.py +37 -0
- sierra/plugins/engine/__init__.py +14 -0
- sierra/plugins/engine/argos/__init__.py +18 -0
- sierra/plugins/{platform → engine}/argos/cmdline.py +144 -151
- sierra/plugins/{platform/argos/variables → engine/argos/generators}/__init__.py +5 -0
- sierra/plugins/engine/argos/generators/engine.py +394 -0
- sierra/plugins/engine/argos/plugin.py +393 -0
- sierra/plugins/{platform/argos/generators → engine/argos/variables}/__init__.py +5 -0
- sierra/plugins/engine/argos/variables/arena_shape.py +183 -0
- sierra/plugins/engine/argos/variables/cameras.py +240 -0
- sierra/plugins/engine/argos/variables/constant_density.py +112 -0
- sierra/plugins/engine/argos/variables/exp_setup.py +82 -0
- sierra/plugins/{platform → engine}/argos/variables/physics_engines.py +83 -87
- sierra/plugins/engine/argos/variables/population_constant_density.py +178 -0
- sierra/plugins/engine/argos/variables/population_size.py +115 -0
- sierra/plugins/engine/argos/variables/population_variable_density.py +123 -0
- sierra/plugins/engine/argos/variables/rendering.py +108 -0
- sierra/plugins/engine/ros1gazebo/__init__.py +18 -0
- sierra/plugins/engine/ros1gazebo/cmdline.py +175 -0
- sierra/plugins/{platform/ros1robot → engine/ros1gazebo}/generators/__init__.py +5 -0
- sierra/plugins/engine/ros1gazebo/generators/engine.py +125 -0
- sierra/plugins/engine/ros1gazebo/plugin.py +404 -0
- sierra/plugins/engine/ros1gazebo/variables/__init__.py +15 -0
- sierra/plugins/engine/ros1gazebo/variables/population_size.py +214 -0
- sierra/plugins/engine/ros1robot/__init__.py +18 -0
- sierra/plugins/engine/ros1robot/cmdline.py +159 -0
- sierra/plugins/{platform/ros1gazebo → engine/ros1robot}/generators/__init__.py +4 -0
- sierra/plugins/engine/ros1robot/generators/engine.py +95 -0
- sierra/plugins/engine/ros1robot/plugin.py +410 -0
- sierra/plugins/{hpc/local → engine/ros1robot/variables}/__init__.py +5 -0
- sierra/plugins/engine/ros1robot/variables/population_size.py +146 -0
- sierra/plugins/execenv/__init__.py +11 -0
- sierra/plugins/execenv/hpc/__init__.py +18 -0
- sierra/plugins/execenv/hpc/adhoc/__init__.py +18 -0
- sierra/plugins/execenv/hpc/adhoc/cmdline.py +30 -0
- sierra/plugins/execenv/hpc/adhoc/plugin.py +131 -0
- sierra/plugins/execenv/hpc/cmdline.py +137 -0
- sierra/plugins/execenv/hpc/local/__init__.py +18 -0
- sierra/plugins/execenv/hpc/local/cmdline.py +31 -0
- sierra/plugins/execenv/hpc/local/plugin.py +145 -0
- sierra/plugins/execenv/hpc/pbs/__init__.py +18 -0
- sierra/plugins/execenv/hpc/pbs/cmdline.py +30 -0
- sierra/plugins/execenv/hpc/pbs/plugin.py +121 -0
- sierra/plugins/execenv/hpc/slurm/__init__.py +18 -0
- sierra/plugins/execenv/hpc/slurm/cmdline.py +30 -0
- sierra/plugins/execenv/hpc/slurm/plugin.py +133 -0
- sierra/plugins/execenv/prefectserver/__init__.py +18 -0
- sierra/plugins/execenv/prefectserver/cmdline.py +66 -0
- sierra/plugins/execenv/prefectserver/dockerremote/__init__.py +18 -0
- sierra/plugins/execenv/prefectserver/dockerremote/cmdline.py +66 -0
- sierra/plugins/execenv/prefectserver/dockerremote/plugin.py +132 -0
- sierra/plugins/execenv/prefectserver/flow.py +66 -0
- sierra/plugins/execenv/prefectserver/local/__init__.py +18 -0
- sierra/plugins/execenv/prefectserver/local/cmdline.py +29 -0
- sierra/plugins/execenv/prefectserver/local/plugin.py +133 -0
- sierra/plugins/{hpc/adhoc → execenv/robot}/__init__.py +1 -0
- sierra/plugins/execenv/robot/turtlebot3/__init__.py +18 -0
- sierra/plugins/execenv/robot/turtlebot3/plugin.py +204 -0
- sierra/plugins/expdef/__init__.py +14 -0
- sierra/plugins/expdef/json/__init__.py +14 -0
- sierra/plugins/expdef/json/plugin.py +504 -0
- sierra/plugins/expdef/xml/__init__.py +14 -0
- sierra/plugins/expdef/xml/plugin.py +386 -0
- sierra/{core/hpc → plugins/proc}/__init__.py +1 -1
- sierra/plugins/proc/collate/__init__.py +15 -0
- sierra/plugins/proc/collate/cmdline.py +47 -0
- sierra/plugins/proc/collate/plugin.py +271 -0
- sierra/plugins/proc/compress/__init__.py +18 -0
- sierra/plugins/proc/compress/cmdline.py +47 -0
- sierra/plugins/proc/compress/plugin.py +123 -0
- sierra/plugins/proc/decompress/__init__.py +18 -0
- sierra/plugins/proc/decompress/plugin.py +96 -0
- sierra/plugins/proc/imagize/__init__.py +15 -0
- sierra/plugins/proc/imagize/cmdline.py +49 -0
- sierra/plugins/proc/imagize/plugin.py +270 -0
- sierra/plugins/proc/modelrunner/__init__.py +16 -0
- sierra/plugins/proc/modelrunner/plugin.py +250 -0
- sierra/plugins/proc/statistics/__init__.py +15 -0
- sierra/plugins/proc/statistics/cmdline.py +64 -0
- sierra/plugins/proc/statistics/plugin.py +390 -0
- sierra/plugins/{hpc → prod}/__init__.py +1 -0
- sierra/plugins/prod/graphs/__init__.py +18 -0
- sierra/plugins/prod/graphs/cmdline.py +269 -0
- sierra/plugins/prod/graphs/collate.py +279 -0
- sierra/plugins/prod/graphs/inter/__init__.py +13 -0
- sierra/plugins/prod/graphs/inter/generate.py +83 -0
- sierra/plugins/prod/graphs/inter/heatmap.py +86 -0
- sierra/plugins/prod/graphs/inter/line.py +134 -0
- sierra/plugins/prod/graphs/intra/__init__.py +15 -0
- sierra/plugins/prod/graphs/intra/generate.py +202 -0
- sierra/plugins/prod/graphs/intra/heatmap.py +74 -0
- sierra/plugins/prod/graphs/intra/line.py +114 -0
- sierra/plugins/prod/graphs/plugin.py +103 -0
- sierra/plugins/prod/graphs/targets.py +63 -0
- sierra/plugins/prod/render/__init__.py +18 -0
- sierra/plugins/prod/render/cmdline.py +72 -0
- sierra/plugins/prod/render/plugin.py +282 -0
- sierra/plugins/storage/__init__.py +5 -0
- sierra/plugins/storage/arrow/__init__.py +18 -0
- sierra/plugins/storage/arrow/plugin.py +38 -0
- sierra/plugins/storage/csv/__init__.py +9 -0
- sierra/plugins/storage/csv/plugin.py +12 -5
- sierra/version.py +3 -2
- sierra_research-1.5.0.dist-info/METADATA +238 -0
- sierra_research-1.5.0.dist-info/RECORD +186 -0
- {sierra_research-1.3.11.dist-info → sierra_research-1.5.0.dist-info}/WHEEL +1 -2
- sierra/core/experiment/xml.py +0 -454
- sierra/core/generators/controller_generator_parser.py +0 -34
- sierra/core/generators/exp_creator.py +0 -351
- sierra/core/generators/exp_generators.py +0 -142
- sierra/core/graphs/scatterplot2D.py +0 -109
- sierra/core/graphs/stacked_line_graph.py +0 -251
- sierra/core/graphs/stacked_surface_graph.py +0 -220
- sierra/core/graphs/summary_line_graph.py +0 -371
- sierra/core/hpc/cmdline.py +0 -142
- sierra/core/models/graphs.py +0 -87
- sierra/core/pipeline/stage2/exp_runner.py +0 -286
- sierra/core/pipeline/stage3/imagizer.py +0 -149
- sierra/core/pipeline/stage3/run_collator.py +0 -317
- sierra/core/pipeline/stage3/statistics_calculator.py +0 -478
- sierra/core/pipeline/stage4/graph_collator.py +0 -320
- sierra/core/pipeline/stage4/inter_exp_graph_generator.py +0 -240
- sierra/core/pipeline/stage4/intra_exp_graph_generator.py +0 -317
- sierra/core/pipeline/stage4/model_runner.py +0 -168
- sierra/core/pipeline/stage4/rendering.py +0 -283
- sierra/core/pipeline/stage4/yaml_config_loader.py +0 -103
- sierra/core/pipeline/stage5/inter_scenario_comparator.py +0 -328
- sierra/core/pipeline/stage5/intra_scenario_comparator.py +0 -989
- sierra/core/platform.py +0 -493
- sierra/core/plugin_manager.py +0 -369
- sierra/core/root_dirpath_generator.py +0 -241
- sierra/plugins/hpc/adhoc/plugin.py +0 -125
- sierra/plugins/hpc/local/plugin.py +0 -81
- sierra/plugins/hpc/pbs/__init__.py +0 -9
- sierra/plugins/hpc/pbs/plugin.py +0 -126
- sierra/plugins/hpc/slurm/__init__.py +0 -9
- sierra/plugins/hpc/slurm/plugin.py +0 -130
- sierra/plugins/platform/__init__.py +0 -9
- sierra/plugins/platform/argos/__init__.py +0 -9
- sierra/plugins/platform/argos/generators/platform_generators.py +0 -383
- sierra/plugins/platform/argos/plugin.py +0 -337
- sierra/plugins/platform/argos/variables/arena_shape.py +0 -145
- sierra/plugins/platform/argos/variables/cameras.py +0 -243
- sierra/plugins/platform/argos/variables/constant_density.py +0 -136
- sierra/plugins/platform/argos/variables/exp_setup.py +0 -113
- sierra/plugins/platform/argos/variables/population_constant_density.py +0 -175
- sierra/plugins/platform/argos/variables/population_size.py +0 -102
- sierra/plugins/platform/argos/variables/population_variable_density.py +0 -132
- sierra/plugins/platform/argos/variables/rendering.py +0 -104
- sierra/plugins/platform/ros1gazebo/__init__.py +0 -9
- sierra/plugins/platform/ros1gazebo/cmdline.py +0 -213
- sierra/plugins/platform/ros1gazebo/generators/platform_generators.py +0 -137
- sierra/plugins/platform/ros1gazebo/plugin.py +0 -335
- sierra/plugins/platform/ros1gazebo/variables/__init__.py +0 -10
- sierra/plugins/platform/ros1gazebo/variables/population_size.py +0 -204
- sierra/plugins/platform/ros1robot/__init__.py +0 -9
- sierra/plugins/platform/ros1robot/cmdline.py +0 -175
- sierra/plugins/platform/ros1robot/generators/platform_generators.py +0 -112
- sierra/plugins/platform/ros1robot/plugin.py +0 -373
- sierra/plugins/platform/ros1robot/variables/__init__.py +0 -10
- sierra/plugins/platform/ros1robot/variables/population_size.py +0 -146
- sierra/plugins/robot/__init__.py +0 -9
- sierra/plugins/robot/turtlebot3/__init__.py +0 -9
- sierra/plugins/robot/turtlebot3/plugin.py +0 -194
- sierra_research-1.3.11.data/data/share/man/man1/sierra-cli.1 +0 -2349
- sierra_research-1.3.11.data/data/share/man/man7/sierra-examples.7 +0 -508
- sierra_research-1.3.11.data/data/share/man/man7/sierra-exec-envs.7 +0 -331
- sierra_research-1.3.11.data/data/share/man/man7/sierra-glossary.7 +0 -285
- sierra_research-1.3.11.data/data/share/man/man7/sierra-platforms.7 +0 -358
- sierra_research-1.3.11.data/data/share/man/man7/sierra-usage.7 +0 -729
- sierra_research-1.3.11.data/data/share/man/man7/sierra.7 +0 -78
- sierra_research-1.3.11.dist-info/METADATA +0 -492
- sierra_research-1.3.11.dist-info/RECORD +0 -133
- sierra_research-1.3.11.dist-info/top_level.txt +0 -1
- {sierra_research-1.3.11.dist-info → sierra_research-1.5.0.dist-info}/entry_points.txt +0 -0
- {sierra_research-1.3.11.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
|
-
]
|
sierra/plugins/robot/__init__.py
DELETED
@@ -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
|
-
]
|