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.
- 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.6.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 -249
- sierra/core/graphs/stacked_surface_graph.py +0 -220
- sierra/core/graphs/summary_line_graph.py +0 -369
- 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 -319
- 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.6.data/data/share/man/man1/sierra-cli.1 +0 -2349
- sierra_research-1.3.6.data/data/share/man/man7/sierra-examples.7 +0 -488
- sierra_research-1.3.6.data/data/share/man/man7/sierra-exec-envs.7 +0 -331
- sierra_research-1.3.6.data/data/share/man/man7/sierra-glossary.7 +0 -285
- sierra_research-1.3.6.data/data/share/man/man7/sierra-platforms.7 +0 -358
- sierra_research-1.3.6.data/data/share/man/man7/sierra-usage.7 +0 -725
- sierra_research-1.3.6.data/data/share/man/man7/sierra.7 +0 -78
- sierra_research-1.3.6.dist-info/METADATA +0 -500
- sierra_research-1.3.6.dist-info/RECORD +0 -133
- sierra_research-1.3.6.dist-info/top_level.txt +0 -1
- {sierra_research-1.3.6.dist-info → sierra_research-1.5.0.dist-info}/entry_points.txt +0 -0
- {sierra_research-1.3.6.dist-info → sierra_research-1.5.0.dist-info/licenses}/LICENSE +0 -0
@@ -18,7 +18,7 @@ import implements
|
|
18
18
|
# Project packages
|
19
19
|
from sierra.core.variables.base_variable import IBaseVariable
|
20
20
|
from sierra.core.utils import ArenaExtent
|
21
|
-
from sierra.core.experiment import
|
21
|
+
from sierra.core.experiment import definition
|
22
22
|
from sierra.core import types, config
|
23
23
|
|
24
24
|
|
@@ -27,7 +27,6 @@ class PhysicsEngines():
|
|
27
27
|
"""Defines 2D/3D physics engines within ARGoS and how they are laid out.
|
28
28
|
|
29
29
|
Attributes:
|
30
|
-
|
31
30
|
engine_type: The type of physics engine to use (one supported by ARGoS).
|
32
31
|
|
33
32
|
n_engines: # of engines. Can be one of [1,4,8,16,24].
|
@@ -57,17 +56,17 @@ class PhysicsEngines():
|
|
57
56
|
self.iter_per_tick = iter_per_tick
|
58
57
|
self.layout = layout
|
59
58
|
self.extents = extents
|
60
|
-
self.
|
59
|
+
self.element_adds = [] # type: tp.List[definition.ElementAddList]
|
61
60
|
|
62
61
|
# If we are given multiple extents to map, we need to divide the
|
63
62
|
# specified # of engines among them.
|
64
63
|
self.n_engines = int(self.n_engines / float(len(self.extents)))
|
65
|
-
assert self.layout == 'uniform_grid2D'
|
64
|
+
assert self.layout == 'uniform_grid2D', \
|
66
65
|
"Only uniform_grid2D physics engine layout currently supported"
|
67
66
|
|
68
67
|
self.logger = logging.getLogger(__name__)
|
69
68
|
|
70
|
-
def gen_attr_changelist(self) -> tp.List[
|
69
|
+
def gen_attr_changelist(self) -> tp.List[definition.AttrChangeSet]:
|
71
70
|
"""
|
72
71
|
No effect.
|
73
72
|
|
@@ -75,41 +74,41 @@ class PhysicsEngines():
|
|
75
74
|
"""
|
76
75
|
return []
|
77
76
|
|
78
|
-
def gen_tag_rmlist(self) -> tp.List[
|
77
|
+
def gen_tag_rmlist(self) -> tp.List[definition.ElementRmList]:
|
79
78
|
"""Remove the ``<physics_engines>`` tag if it exists may be desirable.
|
80
79
|
|
81
80
|
Obviously you *must* call this function BEFORE adding new definitions.
|
82
81
|
|
83
82
|
"""
|
84
|
-
return [
|
83
|
+
return [definition.ElementRmList(definition.ElementRm(".", "./physics_engines"))]
|
85
84
|
|
86
|
-
def
|
85
|
+
def gen_element_addlist(self) -> tp.List[definition.ElementAddList]:
|
87
86
|
self.logger.debug("Mapping %s physics engines of type %s to extents=%s",
|
88
87
|
self.n_engines,
|
89
88
|
self.engine_type,
|
90
89
|
[str(s) for s in self.extents])
|
91
|
-
if not self.
|
90
|
+
if not self.element_adds:
|
92
91
|
if self.n_engines == 1:
|
93
|
-
self.
|
92
|
+
self.element_adds = [self._gen1_engines()]
|
94
93
|
elif self.n_engines == 2:
|
95
|
-
self.
|
94
|
+
self.element_adds = [self._gen2_engines(s) for s in self.extents]
|
96
95
|
elif self.n_engines == 4:
|
97
|
-
self.
|
96
|
+
self.element_adds = [self._gen4_engines(s) for s in self.extents]
|
98
97
|
elif self.n_engines == 6:
|
99
|
-
self.
|
98
|
+
self.element_adds = [self._gen6_engines(s) for s in self.extents]
|
100
99
|
elif self.n_engines == 8:
|
101
|
-
self.
|
100
|
+
self.element_adds = [self._gen8_engines(s) for s in self.extents]
|
102
101
|
elif self.n_engines == 12:
|
103
|
-
self.
|
102
|
+
self.element_adds = [self._gen12_engines(s) for s in self.extents]
|
104
103
|
elif self.n_engines == 16:
|
105
|
-
self.
|
104
|
+
self.element_adds = [self._gen16_engines(s) for s in self.extents]
|
106
105
|
elif self.n_engines == 24:
|
107
|
-
self.
|
106
|
+
self.element_adds = [self._gen24_engines(s) for s in self.extents]
|
108
107
|
else:
|
109
108
|
raise RuntimeError(
|
110
|
-
"Bad # of physics engines specified: {
|
109
|
+
f"Bad # of physics engines specified: {self.n_engines}")
|
111
110
|
|
112
|
-
return self.
|
111
|
+
return self.element_adds
|
113
112
|
|
114
113
|
def gen_files(self) -> None:
|
115
114
|
pass
|
@@ -118,11 +117,12 @@ class PhysicsEngines():
|
|
118
117
|
extent: ArenaExtent,
|
119
118
|
n_engines_x: int,
|
120
119
|
n_engines_y: int,
|
121
|
-
forward_engines: tp.List[int]) ->
|
120
|
+
forward_engines: tp.List[int]) -> definition.ElementAddList:
|
122
121
|
"""Generate definitions for the specified # of engines for the extent.
|
123
122
|
|
124
123
|
"""
|
125
|
-
adds =
|
124
|
+
adds = definition.ElementAddList(
|
125
|
+
definition.ElementAdd('.', 'physics_engines', {}, False))
|
126
126
|
|
127
127
|
for i in range(0, self.n_engines):
|
128
128
|
adds.extend(self.gen_single_engine(i,
|
@@ -138,7 +138,7 @@ class PhysicsEngines():
|
|
138
138
|
extent: ArenaExtent,
|
139
139
|
n_engines_x: int,
|
140
140
|
n_engines_y: int,
|
141
|
-
forward_engines: tp.List[int]) ->
|
141
|
+
forward_engines: tp.List[int]) -> definition.ElementAddList:
|
142
142
|
"""
|
143
143
|
Generate definitions for a specific 2D/3D engine.
|
144
144
|
|
@@ -152,10 +152,6 @@ class PhysicsEngines():
|
|
152
152
|
|
153
153
|
extent: The mapped extent for ALL physics engines.
|
154
154
|
|
155
|
-
exceptions: List of lists of points defining polygons which should
|
156
|
-
NOT be managed by any of the engines currently being
|
157
|
-
processed.
|
158
|
-
|
159
155
|
n_engines_x: # engines in the x direction.
|
160
156
|
|
161
157
|
n_engines_y: # engines in the y direction.
|
@@ -165,7 +161,7 @@ class PhysicsEngines():
|
|
165
161
|
|
166
162
|
"""
|
167
163
|
|
168
|
-
adds =
|
164
|
+
adds = definition.ElementAddList()
|
169
165
|
|
170
166
|
size_x = extent.xsize() / n_engines_x
|
171
167
|
size_y = extent.ysize() / n_engines_y
|
@@ -173,33 +169,33 @@ class PhysicsEngines():
|
|
173
169
|
|
174
170
|
name = self._gen_engine_name(engine_id)
|
175
171
|
|
176
|
-
adds.append(
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
adds.append(
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
adds.append(
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
adds.append(
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
adds.append(
|
200
|
-
|
201
|
-
|
202
|
-
|
172
|
+
adds.append(definition.ElementAdd('.//physics_engines',
|
173
|
+
self.engine_type,
|
174
|
+
{
|
175
|
+
'id': name,
|
176
|
+
'iterations': str(self.iter_per_tick)
|
177
|
+
},
|
178
|
+
True))
|
179
|
+
adds.append(definition.ElementAdd(f".//physics_engines/*[@id='{name}']",
|
180
|
+
"boundaries",
|
181
|
+
{},
|
182
|
+
True))
|
183
|
+
adds.append(definition.ElementAdd(f".//physics_engines/*[@id='{name}']/boundaries",
|
184
|
+
"top",
|
185
|
+
{
|
186
|
+
'height': str(size_z)
|
187
|
+
},
|
188
|
+
True))
|
189
|
+
adds.append(definition.ElementAdd(f".//physics_engines/*[@id='{name}']/boundaries",
|
190
|
+
"bottom",
|
191
|
+
{
|
192
|
+
'height': '0.0'
|
193
|
+
},
|
194
|
+
True))
|
195
|
+
adds.append(definition.ElementAdd(f".//physics_engines/*[@id='{name}']/boundaries",
|
196
|
+
"sides",
|
197
|
+
{},
|
198
|
+
True))
|
203
199
|
|
204
200
|
# Engine lower X coord increasing as engine id increases
|
205
201
|
if engine_id in forward_engines:
|
@@ -230,30 +226,30 @@ class PhysicsEngines():
|
|
230
226
|
vertices = [(ll_x, ll_y), (lr_x, lr_y), (ur_x, ur_y), (ul_x, ul_y)]
|
231
227
|
|
232
228
|
for v in vertices:
|
233
|
-
adds.append(
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
229
|
+
adds.append(definition.ElementAdd(f".//physics_engines/*[@id='{name}']/boundaries/sides",
|
230
|
+
"vertex",
|
231
|
+
{
|
232
|
+
"point": "{0}, {1}".format(v[0], v[1])
|
233
|
+
},
|
234
|
+
True))
|
239
235
|
return adds
|
240
236
|
|
241
|
-
def _gen1_engines(self) ->
|
237
|
+
def _gen1_engines(self) -> definition.ElementAddList:
|
242
238
|
"""Generate definitions for 1 physics engine for the specified extent.
|
243
239
|
|
244
240
|
"""
|
245
241
|
|
246
242
|
name = self._gen_engine_name(0)
|
247
243
|
|
248
|
-
return
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
244
|
+
return definition.ElementAddList(definition.ElementAdd('.', 'physics_engines', {}, False),
|
245
|
+
definition.ElementAdd(".//physics_engines",
|
246
|
+
self.engine_type,
|
247
|
+
{
|
248
|
+
'id': name
|
249
|
+
},
|
250
|
+
True))
|
255
251
|
|
256
|
-
def _gen2_engines(self, extent: ArenaExtent) ->
|
252
|
+
def _gen2_engines(self, extent: ArenaExtent) -> definition.ElementAddList:
|
257
253
|
"""Generate definitions for 2 physics engines for the specified extents.
|
258
254
|
|
259
255
|
Engines are layed out as follows in 2D, regardless if they are 2D or 3D
|
@@ -271,7 +267,7 @@ class PhysicsEngines():
|
|
271
267
|
n_engines_y=1,
|
272
268
|
forward_engines=[])
|
273
269
|
|
274
|
-
def _gen4_engines(self, extent: ArenaExtent) ->
|
270
|
+
def _gen4_engines(self, extent: ArenaExtent) -> definition.ElementAddList:
|
275
271
|
"""Generate definitions for 4 physics engines for the specified extent.
|
276
272
|
|
277
273
|
Engines are layed out as follows in 2D, regardless if they are 2D or 3D
|
@@ -290,7 +286,7 @@ class PhysicsEngines():
|
|
290
286
|
n_engines_y=2,
|
291
287
|
forward_engines=[0, 1])
|
292
288
|
|
293
|
-
def _gen6_engines(self, extent: ArenaExtent) ->
|
289
|
+
def _gen6_engines(self, extent: ArenaExtent) -> definition.ElementAddList:
|
294
290
|
"""Generate definitions for 6 physics engines for the specified extent.
|
295
291
|
|
296
292
|
Engines are layed out as follows in 2D, regardless if they are 2D or 3D
|
@@ -309,7 +305,7 @@ class PhysicsEngines():
|
|
309
305
|
n_engines_y=2,
|
310
306
|
forward_engines=[0, 1, 2])
|
311
307
|
|
312
|
-
def _gen8_engines(self, extent: ArenaExtent) ->
|
308
|
+
def _gen8_engines(self, extent: ArenaExtent) -> definition.ElementAddList:
|
313
309
|
"""Generate definitions for 8 physics engines for the specified extent.
|
314
310
|
|
315
311
|
The 2D layout is:
|
@@ -327,7 +323,7 @@ class PhysicsEngines():
|
|
327
323
|
n_engines_y=2,
|
328
324
|
forward_engines=[0, 1, 2, 3])
|
329
325
|
|
330
|
-
def _gen12_engines(self, extent: ArenaExtent) ->
|
326
|
+
def _gen12_engines(self, extent: ArenaExtent) -> definition.ElementAddList:
|
331
327
|
"""Generate definitions for 12 physics engines for the specified extent.
|
332
328
|
|
333
329
|
The 2D layout is:
|
@@ -346,7 +342,7 @@ class PhysicsEngines():
|
|
346
342
|
n_engines_y=3,
|
347
343
|
forward_engines=[0, 1, 2, 3, 8, 9, 10, 11])
|
348
344
|
|
349
|
-
def _gen16_engines(self, extent: ArenaExtent) ->
|
345
|
+
def _gen16_engines(self, extent: ArenaExtent) -> definition.ElementAddList:
|
350
346
|
"""Generate definitions for 16 physics engines for the specified extent.
|
351
347
|
|
352
348
|
The 2D layout is:
|
@@ -366,7 +362,7 @@ class PhysicsEngines():
|
|
366
362
|
n_engines_y=4,
|
367
363
|
forward_engines=[0, 1, 2, 3, 8, 9, 10, 11])
|
368
364
|
|
369
|
-
def _gen24_engines(self, extent: ArenaExtent) ->
|
365
|
+
def _gen24_engines(self, extent: ArenaExtent) -> definition.ElementAddList:
|
370
366
|
"""Generate definitions for 16 physics engines for the specified extent.
|
371
367
|
|
372
368
|
The 2D layout is:
|
@@ -434,7 +430,7 @@ class PhysicsEngines2D(PhysicsEngines):
|
|
434
430
|
extent: ArenaExtent,
|
435
431
|
n_engines_x: int,
|
436
432
|
n_engines_y: int,
|
437
|
-
forward_engines: tp.List[int]) ->
|
433
|
+
forward_engines: tp.List[int]) -> definition.ElementAddList:
|
438
434
|
adds = super().gen_single_engine(engine_id,
|
439
435
|
extent,
|
440
436
|
n_engines_x,
|
@@ -442,13 +438,13 @@ class PhysicsEngines2D(PhysicsEngines):
|
|
442
438
|
forward_engines)
|
443
439
|
if self.engine_type == 'dynamics2d' and self.spatial_hash_info is not None:
|
444
440
|
name = self._gen_engine_name(engine_id)
|
445
|
-
adds.append(
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
441
|
+
adds.append(definition.ElementAdd(f".//physics_engines/*[@id='{name}']",
|
442
|
+
"spatial_hash",
|
443
|
+
{
|
444
|
+
'cell_size': str(self.spatial_hash_info['cell_size']),
|
445
|
+
'cell_num': str(self.spatial_hash_info['cell_num'])
|
446
|
+
},
|
447
|
+
True))
|
452
448
|
return adds
|
453
449
|
|
454
450
|
|
@@ -473,7 +469,7 @@ class PhysicsEngines3D(PhysicsEngines):
|
|
473
469
|
|
474
470
|
def factory(engine_type: str,
|
475
471
|
n_engines: int,
|
476
|
-
|
472
|
+
n_agents: tp.Optional[int],
|
477
473
|
robot_type: str,
|
478
474
|
cmdopts: types.Cmdopts,
|
479
475
|
extents: tp.List[ArenaExtent]) -> PhysicsEngines:
|
@@ -484,11 +480,11 @@ def factory(engine_type: str,
|
|
484
480
|
# remain so in the future, so we employ a factory function to make
|
485
481
|
# implementation of diverging functionality easier later.
|
486
482
|
if '2d' in engine_type:
|
487
|
-
if
|
483
|
+
if n_agents and cmdopts['physics_spatial_hash2D']:
|
488
484
|
spatial_hash = {
|
489
485
|
# Per ARGoS documentation in 'argos3 -q dynamics2d'
|
490
486
|
'cell_size': config.kARGoS['spatial_hash2D'][robot_type],
|
491
|
-
'cell_num':
|
487
|
+
'cell_num': n_agents / float(n_engines) * 10
|
492
488
|
}
|
493
489
|
logging.debug(("Using 2D spatial hash for physics engines: "
|
494
490
|
"cell_size=%f,cell_num=%d"),
|
@@ -511,7 +507,7 @@ def factory(engine_type: str,
|
|
511
507
|
extents)
|
512
508
|
|
513
509
|
|
514
|
-
|
510
|
+
__all__ = [
|
515
511
|
'PhysicsEngines',
|
516
512
|
'PhysicsEngines2D',
|
517
513
|
'PhysicsEngines3D',
|
@@ -0,0 +1,178 @@
|
|
1
|
+
# Copyright 2021 John Harwell, All rights reserved.
|
2
|
+
#
|
3
|
+
# SPDX-License-Identifier: MIT
|
4
|
+
#
|
5
|
+
"""Classes for the constant population density batch criteria.
|
6
|
+
|
7
|
+
See :ref:`plugins/engine/argos/bc/population-constant-density` for usage
|
8
|
+
documentation.
|
9
|
+
|
10
|
+
"""
|
11
|
+
|
12
|
+
# Core packages
|
13
|
+
import typing as tp
|
14
|
+
import logging
|
15
|
+
import math
|
16
|
+
import pathlib
|
17
|
+
|
18
|
+
# 3rd party packages
|
19
|
+
import implements
|
20
|
+
|
21
|
+
# Project packages
|
22
|
+
from sierra.plugins.engine.argos.variables import constant_density as cd
|
23
|
+
from sierra.core import utils, types
|
24
|
+
from sierra.core.vector import Vector3D
|
25
|
+
from sierra.core.experiment import definition
|
26
|
+
from sierra.core.graphs import bcbridge
|
27
|
+
|
28
|
+
|
29
|
+
@implements.implements(bcbridge.IGraphable)
|
30
|
+
class PopulationConstantDensity(cd.ConstantDensity):
|
31
|
+
"""Defines XML changes for maintain population density across arena sizes.
|
32
|
+
|
33
|
+
This class is a base class which should (almost) never be used on its
|
34
|
+
own. Instead, the ``factory()`` function should be used to dynamically
|
35
|
+
create derived classes expressing the user's desired density.
|
36
|
+
|
37
|
+
Does not change the # blocks/block manifest.
|
38
|
+
|
39
|
+
"""
|
40
|
+
|
41
|
+
def __init__(self, *args, **kwargs) -> None:
|
42
|
+
cd.ConstantDensity.__init__(self, *args, **kwargs)
|
43
|
+
self.already_added = False
|
44
|
+
self.logger = logging.getLogger(__name__)
|
45
|
+
|
46
|
+
def gen_attr_changelist(self) -> tp.List[definition.AttrChangeSet]:
|
47
|
+
"""Generate XML modifications to to maintain constant population density.
|
48
|
+
|
49
|
+
Robots are approximated as point masses.
|
50
|
+
|
51
|
+
"""
|
52
|
+
if not self.already_added:
|
53
|
+
for changeset in self.attr_changes:
|
54
|
+
for path, attr, value in changeset:
|
55
|
+
|
56
|
+
if path == ".//arena" and attr == "size":
|
57
|
+
x, y, z = [int(float(_)) for _ in value.split(",")]
|
58
|
+
extent = utils.ArenaExtent(Vector3D(x, y, z))
|
59
|
+
# ARGoS won't start if there are 0 robots, so you always
|
60
|
+
# need to put at least 1.
|
61
|
+
n_agents = int(extent.area() * (self.target_density / 100.0))
|
62
|
+
if n_agents == 0:
|
63
|
+
n_agents = 1
|
64
|
+
self.logger.warning(
|
65
|
+
(
|
66
|
+
"n_agents set to 1 even though "
|
67
|
+
"calculated as 0 for area=%s,"
|
68
|
+
"density=%s"
|
69
|
+
),
|
70
|
+
str(extent.area()),
|
71
|
+
self.target_density / 100.0,
|
72
|
+
)
|
73
|
+
|
74
|
+
changeset.add(
|
75
|
+
definition.AttrChange(
|
76
|
+
".//arena/distribute/entity", "quantity", str(n_agents)
|
77
|
+
)
|
78
|
+
)
|
79
|
+
self.logger.debug(
|
80
|
+
"Calculated population size=%d for extent=%s,density=%s",
|
81
|
+
n_agents,
|
82
|
+
str(extent),
|
83
|
+
self.target_density,
|
84
|
+
)
|
85
|
+
break
|
86
|
+
|
87
|
+
self.already_added = True
|
88
|
+
|
89
|
+
return self.attr_changes
|
90
|
+
|
91
|
+
def graph_info(
|
92
|
+
self,
|
93
|
+
cmdopts: types.Cmdopts,
|
94
|
+
batch_output_root: tp.Optional[pathlib.Path] = None,
|
95
|
+
exp_names: tp.Optional[tp.List[str]] = None,
|
96
|
+
) -> bcbridge.GraphInfo:
|
97
|
+
info = bcbridge.GraphInfo(
|
98
|
+
cmdopts,
|
99
|
+
batch_output_root,
|
100
|
+
exp_names if exp_names else self.gen_exp_names(),
|
101
|
+
)
|
102
|
+
if info.cmdopts["plot_log_xscale"]:
|
103
|
+
info.xlabel = r"$\log_{2}$(Population Size)"
|
104
|
+
else:
|
105
|
+
info.xlabel = "Population Size"
|
106
|
+
|
107
|
+
tmp = map(float, self.populations(info.cmdopts, info.exp_names))
|
108
|
+
|
109
|
+
info.xticklabels = list(map(lambda x: str(int(round(x, 4))), tmp))
|
110
|
+
|
111
|
+
tmp2 = list(map(float, self.populations(info.cmdopts, info.exp_names)))
|
112
|
+
|
113
|
+
if info.cmdopts["plot_log_xscale"]:
|
114
|
+
info.xticks = [int(math.log2(x)) for x in tmp2]
|
115
|
+
elif info.cmdopts["plot_enumerated_xscale"]:
|
116
|
+
info.xticks = list(range(0, len(tmp2)))
|
117
|
+
|
118
|
+
return info
|
119
|
+
|
120
|
+
def n_agents(self, exp_num: int) -> int:
|
121
|
+
return int(self.target_density / 100.0 * self.dimensions[exp_num].area())
|
122
|
+
|
123
|
+
|
124
|
+
def calc_dims(
|
125
|
+
cmdopts: types.Cmdopts, attr: types.CLIArgSpec, **kwargs
|
126
|
+
) -> tp.List[utils.ArenaExtent]:
|
127
|
+
|
128
|
+
kw = utils.gen_scenario_spec(cmdopts, **kwargs)
|
129
|
+
|
130
|
+
is_2x1 = kw["arena_x"] == 2 * kw["arena_y"]
|
131
|
+
is_1x1 = kw["arena_x"] == kw["arena_y"]
|
132
|
+
|
133
|
+
if is_2x1:
|
134
|
+
r = range(
|
135
|
+
kw["arena_x"],
|
136
|
+
kw["arena_x"] + attr["cardinality"] * attr["arena_size_inc"],
|
137
|
+
attr["arena_size_inc"],
|
138
|
+
)
|
139
|
+
return list(
|
140
|
+
utils.ArenaExtent(Vector3D(x, int(x / 2), kw["arena_z"])) for x in r
|
141
|
+
)
|
142
|
+
elif is_1x1:
|
143
|
+
r = range(
|
144
|
+
kw["arena_x"],
|
145
|
+
kw["arena_x"] + attr["cardinality"] * attr["arena_size_inc"],
|
146
|
+
attr["arena_size_inc"],
|
147
|
+
)
|
148
|
+
|
149
|
+
return list(utils.ArenaExtent(Vector3D(x, x, kw["arena_z"])) for x in r)
|
150
|
+
else:
|
151
|
+
raise NotImplementedError(
|
152
|
+
"Unsupported arena X,Y scaling '{0}': Must be [2x1,1x1]"
|
153
|
+
)
|
154
|
+
|
155
|
+
|
156
|
+
def factory(
|
157
|
+
cli_arg: str,
|
158
|
+
main_config: types.YAMLDict,
|
159
|
+
cmdopts: types.Cmdopts,
|
160
|
+
batch_input_root: pathlib.Path,
|
161
|
+
**kwargs,
|
162
|
+
) -> PopulationConstantDensity:
|
163
|
+
"""Create a :class:`PopulationConstantDensity` derived class."""
|
164
|
+
attr = cd.parse(cli_arg)
|
165
|
+
kw = utils.gen_scenario_spec(cmdopts, **kwargs)
|
166
|
+
dims = calc_dims(cmdopts, attr, **kwargs)
|
167
|
+
|
168
|
+
return PopulationConstantDensity(
|
169
|
+
cli_arg,
|
170
|
+
main_config,
|
171
|
+
batch_input_root,
|
172
|
+
attr["target_density"],
|
173
|
+
dims,
|
174
|
+
kw["scenario_tag"],
|
175
|
+
)
|
176
|
+
|
177
|
+
|
178
|
+
__all__ = ["PopulationConstantDensity"]
|
@@ -0,0 +1,115 @@
|
|
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:`plugins/engine/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 definition
|
20
|
+
from sierra.core import types
|
21
|
+
from sierra.core.variables import population_size
|
22
|
+
from sierra.core.graphs import bcbridge
|
23
|
+
|
24
|
+
|
25
|
+
@implements.implements(bcbridge.IGraphable)
|
26
|
+
@implements.implements(bc.IQueryableBatchCriteria)
|
27
|
+
class PopulationSize(population_size.PopulationSize):
|
28
|
+
"""A univariate range of swarm sizes used to define batch experiments.
|
29
|
+
|
30
|
+
This class is a base class which should (almost) never be used on its
|
31
|
+
own. Instead, the ``factory()`` function should be used to dynamically
|
32
|
+
create derived classes expressing the user's desired size distribution.
|
33
|
+
|
34
|
+
Note: Usage of this class assumes homogeneous swarms.
|
35
|
+
|
36
|
+
Attributes:
|
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(
|
44
|
+
sizes: tp.List[int],
|
45
|
+
) -> tp.List[definition.AttrChangeSet]:
|
46
|
+
return [
|
47
|
+
definition.AttrChangeSet(
|
48
|
+
definition.AttrChange(".//arena/distribute/entity", "quantity", str(s))
|
49
|
+
)
|
50
|
+
for s in sizes
|
51
|
+
]
|
52
|
+
|
53
|
+
def __init__(
|
54
|
+
self,
|
55
|
+
cli_arg: str,
|
56
|
+
main_config: types.YAMLDict,
|
57
|
+
batch_input_root: pathlib.Path,
|
58
|
+
size_list: tp.List[int],
|
59
|
+
) -> None:
|
60
|
+
population_size.PopulationSize.__init__(
|
61
|
+
self, cli_arg, main_config, batch_input_root
|
62
|
+
)
|
63
|
+
self.size_list = size_list
|
64
|
+
self.attr_changes = [] # type: tp.List[definition.AttrChangeSet]
|
65
|
+
|
66
|
+
def gen_attr_changelist(self) -> tp.List[definition.AttrChangeSet]:
|
67
|
+
"""
|
68
|
+
Generate list of sets of changes for swarm sizes to define a batch experiment.
|
69
|
+
"""
|
70
|
+
|
71
|
+
if not self.attr_changes:
|
72
|
+
self.attr_changes = PopulationSize.gen_attr_changelist_from_list(
|
73
|
+
self.size_list
|
74
|
+
)
|
75
|
+
return self.attr_changes
|
76
|
+
|
77
|
+
def n_agents(self, exp_num: int) -> int:
|
78
|
+
return self.size_list[exp_num]
|
79
|
+
|
80
|
+
def graph_info(
|
81
|
+
self,
|
82
|
+
cmdopts: types.Cmdopts,
|
83
|
+
batch_output_root: tp.Optional[pathlib.Path] = None,
|
84
|
+
exp_names: tp.Optional[tp.List[str]] = None,
|
85
|
+
) -> bcbridge.GraphInfo:
|
86
|
+
info = bcbridge.GraphInfo(
|
87
|
+
cmdopts,
|
88
|
+
batch_output_root,
|
89
|
+
exp_names if exp_names else self.gen_exp_names(),
|
90
|
+
)
|
91
|
+
|
92
|
+
info.xlabel = super().graph_xlabel(info.cmdopts)
|
93
|
+
info.xticklabels = super().graph_xticklabels(
|
94
|
+
info.cmdopts, info.batch_output_root, info.exp_names
|
95
|
+
)
|
96
|
+
info.xticks = super().graph_xticks(
|
97
|
+
info.cmdopts, info.batch_output_root, info.exp_names
|
98
|
+
)
|
99
|
+
return info
|
100
|
+
|
101
|
+
|
102
|
+
def factory(
|
103
|
+
cli_arg: str,
|
104
|
+
main_config: types.YAMLDict,
|
105
|
+
cmdopts: types.Cmdopts,
|
106
|
+
batch_input_root: pathlib.Path,
|
107
|
+
**kwargs,
|
108
|
+
) -> PopulationSize:
|
109
|
+
"""Create a :class:`PopulationSize` derived class from the cmdline definition."""
|
110
|
+
max_sizes = population_size.parse(cli_arg)
|
111
|
+
|
112
|
+
return PopulationSize(cli_arg, main_config, batch_input_root, max_sizes)
|
113
|
+
|
114
|
+
|
115
|
+
__all__ = ["PopulationSize"]
|