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,102 +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-argos-bc-population-size` for usage documentation.
|
7
|
-
|
8
|
-
"""
|
9
|
-
|
10
|
-
# Core packages
|
11
|
-
import typing as tp
|
12
|
-
import pathlib
|
13
|
-
|
14
|
-
# 3rd party packages
|
15
|
-
import implements
|
16
|
-
|
17
|
-
# Project packages
|
18
|
-
from sierra.core.variables import batch_criteria as bc
|
19
|
-
from sierra.core.experiment import xml
|
20
|
-
from sierra.core import types
|
21
|
-
from sierra.core.variables import population_size
|
22
|
-
|
23
|
-
|
24
|
-
@implements.implements(bc.IConcreteBatchCriteria)
|
25
|
-
@implements.implements(bc.IQueryableBatchCriteria)
|
26
|
-
class PopulationSize(population_size.BasePopulationSize):
|
27
|
-
"""A univariate range of swarm sizes used to define batch experiments.
|
28
|
-
|
29
|
-
This class is a base class which should (almost) never be used on its
|
30
|
-
own. Instead, the ``factory()`` function should be used to dynamically
|
31
|
-
create derived classes expressing the user's desired size distribution.
|
32
|
-
|
33
|
-
Note: Usage of this class assumes homogeneous swarms.
|
34
|
-
|
35
|
-
Attributes:
|
36
|
-
|
37
|
-
size_list: List of integer swarm sizes defining the range of the
|
38
|
-
variable for the batch experiment.
|
39
|
-
|
40
|
-
"""
|
41
|
-
|
42
|
-
@staticmethod
|
43
|
-
def gen_attr_changelist_from_list(sizes: tp.List[int]) -> tp.List[xml.AttrChangeSet]:
|
44
|
-
return [xml.AttrChangeSet(xml.AttrChange(".//arena/distribute/entity",
|
45
|
-
"quantity",
|
46
|
-
str(s)))
|
47
|
-
for s in sizes]
|
48
|
-
|
49
|
-
def __init__(self,
|
50
|
-
cli_arg: str,
|
51
|
-
main_config: types.YAMLDict,
|
52
|
-
batch_input_root: pathlib.Path,
|
53
|
-
size_list: tp.List[int]) -> None:
|
54
|
-
population_size.BasePopulationSize.__init__(self,
|
55
|
-
cli_arg,
|
56
|
-
main_config,
|
57
|
-
batch_input_root)
|
58
|
-
self.size_list = size_list
|
59
|
-
self.attr_changes = [] # type: tp.List[xml.AttrChangeSet]
|
60
|
-
|
61
|
-
def gen_attr_changelist(self) -> tp.List[xml.AttrChangeSet]:
|
62
|
-
"""
|
63
|
-
Generate list of sets of changes for swarm sizes to define a batch experiment.
|
64
|
-
"""
|
65
|
-
if not self.attr_changes:
|
66
|
-
self.attr_changes = PopulationSize.gen_attr_changelist_from_list(
|
67
|
-
self.size_list)
|
68
|
-
return self.attr_changes
|
69
|
-
|
70
|
-
def gen_exp_names(self, cmdopts: types.Cmdopts) -> tp.List[str]:
|
71
|
-
changes = self.gen_attr_changelist()
|
72
|
-
return ['exp' + str(x) for x in range(0, len(changes))]
|
73
|
-
|
74
|
-
def n_robots(self, exp_num: int) -> int:
|
75
|
-
return self.size_list[exp_num]
|
76
|
-
|
77
|
-
|
78
|
-
def factory(cli_arg: str,
|
79
|
-
main_config: types.YAMLDict,
|
80
|
-
cmdopts: types.Cmdopts,
|
81
|
-
**kwargs) -> PopulationSize:
|
82
|
-
"""Create a :class:`PopulationSize` derived class from the cmdline definition.
|
83
|
-
|
84
|
-
"""
|
85
|
-
parser = population_size.Parser()
|
86
|
-
max_sizes = parser.to_sizes(parser(cli_arg))
|
87
|
-
|
88
|
-
def __init__(self) -> None:
|
89
|
-
PopulationSize.__init__(self,
|
90
|
-
cli_arg,
|
91
|
-
main_config,
|
92
|
-
cmdopts['batch_input_root'],
|
93
|
-
max_sizes)
|
94
|
-
|
95
|
-
return type(cli_arg, # type: ignore
|
96
|
-
(PopulationSize,),
|
97
|
-
{"__init__": __init__})
|
98
|
-
|
99
|
-
|
100
|
-
__api__ = [
|
101
|
-
'PopulationSize'
|
102
|
-
]
|
@@ -1,132 +0,0 @@
|
|
1
|
-
# Copyright 2021 John Harwell, All rights reserved.
|
2
|
-
#
|
3
|
-
# SPDX-License-Identifier: MIT
|
4
|
-
#
|
5
|
-
"""Classes for the variable population density batch criteria.
|
6
|
-
|
7
|
-
See :ref:`ln-sierra-platform-argos-bc-population-variable-density` for usage
|
8
|
-
documentation.
|
9
|
-
|
10
|
-
"""
|
11
|
-
|
12
|
-
# Core packages
|
13
|
-
import typing as tp
|
14
|
-
import logging
|
15
|
-
import numpy as np
|
16
|
-
|
17
|
-
# 3rd party packages
|
18
|
-
import implements
|
19
|
-
|
20
|
-
# Project packages
|
21
|
-
from sierra.core.variables import variable_density as vd
|
22
|
-
import sierra.core.variables.batch_criteria as bc
|
23
|
-
from sierra.core.vector import Vector3D
|
24
|
-
from sierra.core.experiment import xml
|
25
|
-
from sierra.core import types, utils
|
26
|
-
|
27
|
-
|
28
|
-
@implements.implements(bc.IConcreteBatchCriteria)
|
29
|
-
class PopulationVariableDensity(vd.VariableDensity):
|
30
|
-
"""Defines XML changes for variable population density within a single arena.
|
31
|
-
|
32
|
-
This class is a base class which should (almost) never be used on its
|
33
|
-
own. Instead, the ``factory()`` function should be used to dynamically
|
34
|
-
create derived classes expressing the user's desired density ranges.
|
35
|
-
|
36
|
-
"""
|
37
|
-
|
38
|
-
def __init__(self, *args, **kwargs) -> None:
|
39
|
-
vd.VariableDensity.__init__(self, *args, **kwargs)
|
40
|
-
self.already_added = False
|
41
|
-
self.logger = logging.getLogger(__name__)
|
42
|
-
|
43
|
-
def gen_attr_changelist(self) -> tp.List[xml.AttrChangeSet]:
|
44
|
-
"""Generate XML modifications to achieve the desired population densities.
|
45
|
-
|
46
|
-
Robots are approximated as point masses.
|
47
|
-
|
48
|
-
"""
|
49
|
-
if not self.already_added:
|
50
|
-
for density in self.densities:
|
51
|
-
# ARGoS won't start if there are 0 robots, so you always
|
52
|
-
# need to put at least 1.
|
53
|
-
n_robots = int(self.extent.area() * (density / 100.0))
|
54
|
-
if n_robots == 0:
|
55
|
-
n_robots = 1
|
56
|
-
self.logger.warning("n_robots set to 1 even though \
|
57
|
-
calculated as 0 for area=%d,density=%s",
|
58
|
-
self.extent.area(),
|
59
|
-
density)
|
60
|
-
changeset = xml.AttrChangeSet(xml.AttrChange(".//arena/distribute/entity",
|
61
|
-
"quantity",
|
62
|
-
str(n_robots)))
|
63
|
-
self.attr_changes.append(changeset)
|
64
|
-
self.logger.debug("Calculated swarm size=%d for extent=%s,density=%s",
|
65
|
-
n_robots,
|
66
|
-
str(self.extent),
|
67
|
-
density)
|
68
|
-
|
69
|
-
self.already_added = True
|
70
|
-
|
71
|
-
return self.attr_changes
|
72
|
-
|
73
|
-
def gen_exp_names(self, cmdopts: types.Cmdopts) -> tp.List[str]:
|
74
|
-
changes = self.gen_attr_changelist()
|
75
|
-
return ['exp' + str(x) for x in range(0, len(changes))]
|
76
|
-
|
77
|
-
def graph_xticks(self,
|
78
|
-
cmdopts: types.Cmdopts,
|
79
|
-
exp_names: tp.Optional[tp.List[str]] = None) -> tp.List[float]:
|
80
|
-
|
81
|
-
if exp_names is None:
|
82
|
-
exp_names = self.gen_exp_names(cmdopts)
|
83
|
-
|
84
|
-
return [p / self.extent.area() for p in self.populations(cmdopts, exp_names)]
|
85
|
-
|
86
|
-
def graph_xticklabels(self,
|
87
|
-
cmdopts: types.Cmdopts,
|
88
|
-
exp_names: tp.Optional[tp.List[str]] = None) -> tp.List[str]:
|
89
|
-
return list(map(lambda x: str(round(x, 4)),
|
90
|
-
self.graph_xticks(cmdopts, exp_names)))
|
91
|
-
|
92
|
-
def graph_xlabel(self, cmdopts: types.Cmdopts) -> str:
|
93
|
-
return r"Population Density"
|
94
|
-
|
95
|
-
def n_robots(self, exp_num: int) -> int:
|
96
|
-
return int(self.extent.area() * self.densities[exp_num] / 100.0)
|
97
|
-
|
98
|
-
|
99
|
-
def factory(cli_arg: str,
|
100
|
-
main_config: types.YAMLDict,
|
101
|
-
cmdopts: types.Cmdopts,
|
102
|
-
**kwargs) -> PopulationVariableDensity:
|
103
|
-
"""
|
104
|
-
Create a :class:`PopulationVariableDensity` derived class.
|
105
|
-
"""
|
106
|
-
attr = vd.Parser()(cli_arg)
|
107
|
-
kw = utils.gen_scenario_spec(cmdopts, **kwargs)
|
108
|
-
|
109
|
-
extent = utils.ArenaExtent(Vector3D(kw['arena_x'],
|
110
|
-
kw['arena_y'],
|
111
|
-
kw['arena_z']))
|
112
|
-
|
113
|
-
densities = list(x for x in np.linspace(attr['density_min'],
|
114
|
-
attr['density_max'],
|
115
|
-
num=attr['cardinality']))
|
116
|
-
|
117
|
-
def __init__(self) -> None:
|
118
|
-
PopulationVariableDensity.__init__(self,
|
119
|
-
cli_arg,
|
120
|
-
main_config,
|
121
|
-
cmdopts['batch_input_root'],
|
122
|
-
densities,
|
123
|
-
extent)
|
124
|
-
|
125
|
-
return type(cli_arg, # type: ignore
|
126
|
-
(PopulationVariableDensity,),
|
127
|
-
{"__init__": __init__})
|
128
|
-
|
129
|
-
|
130
|
-
__api__ = [
|
131
|
-
'PopulationVariableDensity'
|
132
|
-
]
|
@@ -1,104 +0,0 @@
|
|
1
|
-
# Copyright 2021 John Harwell, All rights reserved.
|
2
|
-
#
|
3
|
-
# SPDX-License-Identifier: MIT
|
4
|
-
|
5
|
-
"""
|
6
|
-
ARGoS headless QT rendering configuration.
|
7
|
-
"""
|
8
|
-
|
9
|
-
# Core packages
|
10
|
-
import typing as tp
|
11
|
-
|
12
|
-
# 3rd party packages
|
13
|
-
import implements
|
14
|
-
|
15
|
-
# Project packages
|
16
|
-
from sierra.core.variables.base_variable import IBaseVariable
|
17
|
-
from sierra.core.experiment import xml
|
18
|
-
import sierra.core.config
|
19
|
-
from sierra.core import types
|
20
|
-
|
21
|
-
import sierra.plugins.platform.argos.variables.exp_setup as exp
|
22
|
-
|
23
|
-
|
24
|
-
@implements.implements(IBaseVariable)
|
25
|
-
class ARGoSQTHeadlessRendering():
|
26
|
-
"""
|
27
|
-
Sets up ARGoS headless rendering with QT.
|
28
|
-
|
29
|
-
Attributes:
|
30
|
-
|
31
|
-
tsetup: Simulation time definitions.
|
32
|
-
|
33
|
-
extents: List of (X,Y,Zs) tuple of dimensions of area to assign to
|
34
|
-
engines of the specified type.
|
35
|
-
"""
|
36
|
-
|
37
|
-
kFrameSize = "1600x1200"
|
38
|
-
kQUALITY = 100
|
39
|
-
kFRAME_RATE = 10
|
40
|
-
|
41
|
-
def __init__(self, setup: exp.ExpSetup) -> None:
|
42
|
-
self.setup = setup
|
43
|
-
self.tag_adds = [] # type: tp.List[xml.TagAddList]
|
44
|
-
|
45
|
-
def gen_attr_changelist(self) -> tp.List[xml.AttrChangeSet]:
|
46
|
-
"""
|
47
|
-
No effect.
|
48
|
-
|
49
|
-
All tags/attributes are either deleted or added.
|
50
|
-
"""
|
51
|
-
return []
|
52
|
-
|
53
|
-
def gen_tag_rmlist(self) -> tp.List[xml.TagRmList]:
|
54
|
-
"""Remove the ``<qt_opengl>`` tag if it exists.
|
55
|
-
|
56
|
-
Obviously you *must* call this function BEFORE adding new definitions.
|
57
|
-
|
58
|
-
"""
|
59
|
-
return [xml.TagRmList(xml.TagRm("./visualization", "qt-opengl"))]
|
60
|
-
|
61
|
-
def gen_tag_addlist(self) -> tp.List[xml.TagAddList]:
|
62
|
-
if not self.tag_adds:
|
63
|
-
self.tag_adds = [xml.TagAddList(xml.TagAdd('.',
|
64
|
-
'visualization',
|
65
|
-
{},
|
66
|
-
False),
|
67
|
-
xml.TagAdd('./visualization',
|
68
|
-
'qt-opengl',
|
69
|
-
{'autoplay': "true"},
|
70
|
-
False
|
71
|
-
),
|
72
|
-
xml.TagAdd('./visualization/qt-opengl',
|
73
|
-
'frame_grabbing',
|
74
|
-
{
|
75
|
-
'directory': 'frames',
|
76
|
-
'base_name': 'frame_',
|
77
|
-
'format': sierra.core.config.kImageExt[1:],
|
78
|
-
'headless_grabbing': "true",
|
79
|
-
'headless_frame_size': "{0}".format(self.kFrameSize),
|
80
|
-
'headless_frame_rate': "{0}".format(self.kFRAME_RATE),
|
81
|
-
},
|
82
|
-
False),
|
83
|
-
xml.TagAdd('visualization/qt-opengl',
|
84
|
-
'user_functions',
|
85
|
-
{'label': '__EMPTY__'},
|
86
|
-
False))]
|
87
|
-
|
88
|
-
return self.tag_adds
|
89
|
-
|
90
|
-
def gen_files(self) -> None:
|
91
|
-
pass
|
92
|
-
|
93
|
-
|
94
|
-
def factory(cmdopts: types.Cmdopts) -> ARGoSQTHeadlessRendering:
|
95
|
-
"""Set up QT headless rendering for the specified experimental setup.
|
96
|
-
|
97
|
-
"""
|
98
|
-
|
99
|
-
return ARGoSQTHeadlessRendering(exp.factory(cmdopts["exp_setup"]))
|
100
|
-
|
101
|
-
|
102
|
-
__api__ = [
|
103
|
-
'ARGoSQTHeadlessRendering',
|
104
|
-
]
|
@@ -1,213 +0,0 @@
|
|
1
|
-
# Copyright 2021 John Harwell, All rights reserved.
|
2
|
-
#
|
3
|
-
# SPDX-License-Identifier: MIT
|
4
|
-
#
|
5
|
-
"""
|
6
|
-
Command line parsing and validation for the :term:`ROS1+Gazebo` platform.
|
7
|
-
"""
|
8
|
-
|
9
|
-
# Core packages
|
10
|
-
import typing as tp
|
11
|
-
import argparse
|
12
|
-
|
13
|
-
# 3rd party packages
|
14
|
-
|
15
|
-
# Project packages
|
16
|
-
from sierra.core import types
|
17
|
-
from sierra.core import config
|
18
|
-
import sierra.core.cmdline as corecmd
|
19
|
-
from sierra.core import hpc, ros1
|
20
|
-
|
21
|
-
|
22
|
-
class PlatformCmdline(corecmd.BaseCmdline):
|
23
|
-
"""Defines :term:`ROS1+Gazebo` extensions to :class:`~sierra.core.cmdline.CoreCmdline`.
|
24
|
-
|
25
|
-
"""
|
26
|
-
|
27
|
-
def __init__(self,
|
28
|
-
parents: tp.Optional[tp.List[argparse.ArgumentParser]],
|
29
|
-
stages: tp.List[int]) -> None:
|
30
|
-
|
31
|
-
if parents is not None:
|
32
|
-
self.parser = argparse.ArgumentParser(parents=parents,
|
33
|
-
add_help=False,
|
34
|
-
allow_abbrev=False)
|
35
|
-
else:
|
36
|
-
self.parser = argparse.ArgumentParser(add_help=False,
|
37
|
-
allow_abbrev=False)
|
38
|
-
|
39
|
-
self.scaffold_cli()
|
40
|
-
self.init_cli(stages)
|
41
|
-
|
42
|
-
def scaffold_cli(self) -> None:
|
43
|
-
self.stage1_exp = self.parser.add_argument_group('Stage1: Experiment setup')
|
44
|
-
self.stage1_physics = self.parser.add_argument_group(
|
45
|
-
'Stage1: Configuring Gazebo physics engines')
|
46
|
-
|
47
|
-
def init_cli(self, stages: tp.List[int]) -> None:
|
48
|
-
if 1 in stages:
|
49
|
-
self.init_stage1()
|
50
|
-
|
51
|
-
def init_stage1(self) -> None:
|
52
|
-
# Experiment options
|
53
|
-
positions_omitted_doc = ("If omitted: effective arena dimensions must "
|
54
|
-
"be given as part of ``--scenario``.")
|
55
|
-
|
56
|
-
self.stage1_exp.add_argument("--robot-positions",
|
57
|
-
|
58
|
-
help="""
|
59
|
-
|
60
|
-
A list of space-separated "X,Y,Z" tuples
|
61
|
-
(no quotes) passed on the command line as
|
62
|
-
valid starting positions for the robots
|
63
|
-
within the world.
|
64
|
-
|
65
|
-
""" + self.stage_usage_doc([1],
|
66
|
-
positions_omitted_doc),
|
67
|
-
nargs='+',
|
68
|
-
default=[])
|
69
|
-
|
70
|
-
# Physics engines options
|
71
|
-
self.stage1_physics.add_argument("--physics-engine-type",
|
72
|
-
choices=['ode', 'bullet',
|
73
|
-
'dart', 'simbody'],
|
74
|
-
help="""
|
75
|
-
|
76
|
-
The type of 3D physics engine to use
|
77
|
-
for managing spatial extents within the
|
78
|
-
arena, choosing one of the types that
|
79
|
-
:term:`Gazebo` supports. A single
|
80
|
-
engine instance is used to manage all
|
81
|
-
physics in the arena.
|
82
|
-
|
83
|
-
""" + self.stage_usage_doc([1]),
|
84
|
-
default='ode')
|
85
|
-
|
86
|
-
self.stage1_physics.add_argument("--physics-iter-per-tick",
|
87
|
-
type=int,
|
88
|
-
help="""
|
89
|
-
|
90
|
-
The # of iterations all physics engines
|
91
|
-
should perform per tick each time the
|
92
|
-
controller loops are run (the # of
|
93
|
-
ticks per second for controller control
|
94
|
-
loops is set via ``--exp-setup``).
|
95
|
-
|
96
|
-
""" + self.stage_usage_doc([1]),
|
97
|
-
default=config.kGazebo['physics_iter_per_tick'])
|
98
|
-
|
99
|
-
self.stage1_physics.add_argument("--physics-n-threads",
|
100
|
-
type=int,
|
101
|
-
help="""
|
102
|
-
|
103
|
-
Gazebo can group non-interacting
|
104
|
-
entities into computational "islands"
|
105
|
-
and do the physics updates for those
|
106
|
-
islands in parallel each timestep
|
107
|
-
(islands) are recomputed after each
|
108
|
-
timestep). Gazebo can also parallelize
|
109
|
-
the computation of velocity/position
|
110
|
-
updates with the computation of
|
111
|
-
resolving collisions (i.e., the
|
112
|
-
timestep impulse results in one entity
|
113
|
-
"inside" another). You can assign
|
114
|
-
multiple threads to a pool for
|
115
|
-
cumulative use for these two
|
116
|
-
parallelization methods (threads will
|
117
|
-
be allocated evenly between them). The
|
118
|
-
point at which adding more threads will
|
119
|
-
start to DECREASE performance depends
|
120
|
-
on the complexity of your world, the
|
121
|
-
number and type of robots in it, etc.,
|
122
|
-
so don't just set this parameter to the
|
123
|
-
# of cores for your machine as a
|
124
|
-
default.
|
125
|
-
|
126
|
-
From the Gazebo Parallel Physics
|
127
|
-
Report, setting the pool size to the #
|
128
|
-
robots/# joint trees in your simulation
|
129
|
-
usually gives good results, as long as
|
130
|
-
you have more cores available than you
|
131
|
-
allocate to this pool (Gazebo has other
|
132
|
-
threads too).
|
133
|
-
|
134
|
-
This only applies if
|
135
|
-
``--physics-engine-type``\\=ode.
|
136
|
-
|
137
|
-
A value of 0=no threads.
|
138
|
-
|
139
|
-
""" + self.stage_usage_doc([1]),
|
140
|
-
default=0)
|
141
|
-
|
142
|
-
self.stage1_physics.add_argument("--physics-ec-threadpool",
|
143
|
-
type=int,
|
144
|
-
help="""
|
145
|
-
|
146
|
-
Gazebo can parallelize the computation
|
147
|
-
of velocity/position updates with the
|
148
|
-
computation of resolving collisions
|
149
|
-
(i.e., the timestep impulse results in
|
150
|
-
one entity "inside" another). You can
|
151
|
-
assign multiple threads to a pool for
|
152
|
-
cumulative use for this purpose. The
|
153
|
-
point at which adding more threads will
|
154
|
-
start to DECREASE performance depends
|
155
|
-
on the complexity of your world, the
|
156
|
-
number and type of robots in it, etc.,
|
157
|
-
so don't just set this parameter to the
|
158
|
-
# of cores for your machine as a
|
159
|
-
default.
|
160
|
-
|
161
|
-
From the Gazebo Parallel Physics
|
162
|
-
Report, setting the pool size to the #
|
163
|
-
robots/#joint trees in your simulation
|
164
|
-
usually gives good results, as long as
|
165
|
-
you have more cores than than you
|
166
|
-
allocate to physics (Gazebo has other
|
167
|
-
threads too).
|
168
|
-
|
169
|
-
This only applies if ``--physics-engine-type``\\=ode.
|
170
|
-
|
171
|
-
A value of 0=no threads.
|
172
|
-
|
173
|
-
""" + self.stage_usage_doc([1]),
|
174
|
-
default=0)
|
175
|
-
|
176
|
-
@staticmethod
|
177
|
-
def cmdopts_update(cli_args: argparse.Namespace,
|
178
|
-
cmdopts: types.Cmdopts) -> None:
|
179
|
-
"""Update cmdopts with ROS1+Gazebo-specific cmdline options.
|
180
|
-
|
181
|
-
"""
|
182
|
-
hpc.cmdline.HPCCmdline.cmdopts_update(cli_args, cmdopts)
|
183
|
-
ros1.cmdline.ROSCmdline.cmdopts_update(cli_args, cmdopts)
|
184
|
-
|
185
|
-
updates = {
|
186
|
-
# stage 1
|
187
|
-
'robot_positions': cli_args.robot_positions,
|
188
|
-
|
189
|
-
'physics_n_engines': 1, # Always 1 for gazebo...
|
190
|
-
'physics_n_threads': cli_args.physics_n_threads,
|
191
|
-
'physics_engine_type': cli_args.physics_engine_type,
|
192
|
-
'physics_iter_per_tick': cli_args.physics_iter_per_tick,
|
193
|
-
}
|
194
|
-
|
195
|
-
cmdopts.update(updates)
|
196
|
-
|
197
|
-
|
198
|
-
class CmdlineValidator(corecmd.CoreCmdlineValidator):
|
199
|
-
"""
|
200
|
-
Stub implementation.
|
201
|
-
"""
|
202
|
-
|
203
|
-
|
204
|
-
def sphinx_cmdline_stage1():
|
205
|
-
parent1 = hpc.cmdline.HPCCmdline([1]).parser
|
206
|
-
parent2 = ros1.cmdline.ROSCmdline([1]).parser
|
207
|
-
return PlatformCmdline([parent1, parent2], [1]).parser
|
208
|
-
|
209
|
-
|
210
|
-
def sphinx_cmdline_stage2():
|
211
|
-
parent1 = hpc.cmdline.HPCCmdline([2]).parser
|
212
|
-
parent2 = ros1.cmdline.ROSCmdline([2]).parser
|
213
|
-
return PlatformCmdline([parent1, parent2], [2]).parser
|