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
@@ -1,243 +0,0 @@
|
|
1
|
-
# Copyright 2020 John Harwell, All rights reserved.
|
2
|
-
#
|
3
|
-
# SPDX-License-Identifier: MIT
|
4
|
-
|
5
|
-
"""Classes for specifying ARGoS cameras.
|
6
|
-
|
7
|
-
Positions, timeline, and interpolation, for manipulating the frame
|
8
|
-
capture/rendering perspective.
|
9
|
-
|
10
|
-
"""
|
11
|
-
|
12
|
-
# Core packages
|
13
|
-
import typing as tp
|
14
|
-
import math
|
15
|
-
|
16
|
-
# 3rd party packages
|
17
|
-
import implements
|
18
|
-
|
19
|
-
# Project packages
|
20
|
-
from sierra.core.variables.base_variable import IBaseVariable
|
21
|
-
from sierra.core.utils import ArenaExtent
|
22
|
-
from sierra.core.experiment import xml
|
23
|
-
from sierra.core import types, config
|
24
|
-
from sierra.core.vector import Vector3D
|
25
|
-
import sierra.plugins.platform.argos.variables.exp_setup as exp
|
26
|
-
|
27
|
-
|
28
|
-
@implements.implements(IBaseVariable)
|
29
|
-
class QTCameraTimeline():
|
30
|
-
"""Defines when/how to switch between camera perspectives within ARGoS.
|
31
|
-
|
32
|
-
Attributes:
|
33
|
-
|
34
|
-
interpolate: Should we interpolate between camera positions on our
|
35
|
-
timeline ?
|
36
|
-
|
37
|
-
setup: Simulation experiment definitions.
|
38
|
-
|
39
|
-
extents: List of (X,Y,Zs) tuple of dimensions of arena areas to generate
|
40
|
-
camera definitions for.
|
41
|
-
|
42
|
-
"""
|
43
|
-
|
44
|
-
# If this default changes in ARGoS, it will need to be updated here too.
|
45
|
-
kARGOS_N_CAMERAS = 12
|
46
|
-
|
47
|
-
def __init__(self,
|
48
|
-
setup: exp.ExpSetup,
|
49
|
-
cmdline: str,
|
50
|
-
extents: tp.List[ArenaExtent]) -> None:
|
51
|
-
self.cmdline = cmdline
|
52
|
-
self.extents = extents
|
53
|
-
self.setup = setup
|
54
|
-
self.tag_adds = [] # type: tp.List[xml.TagAddList]
|
55
|
-
|
56
|
-
def gen_attr_changelist(self) -> tp.List[xml.AttrChangeSet]:
|
57
|
-
"""
|
58
|
-
No effect.
|
59
|
-
|
60
|
-
All tags/attributes are either deleted or added.
|
61
|
-
"""
|
62
|
-
return []
|
63
|
-
|
64
|
-
def gen_tag_rmlist(self) -> tp.List[xml.TagRmList]:
|
65
|
-
"""Remove the ``<camera>`` tag if it exists.
|
66
|
-
|
67
|
-
Obviously you *must* call this function BEFORE adding new definitions.
|
68
|
-
|
69
|
-
"""
|
70
|
-
return [xml.TagRmList(xml.TagRm("./visualization/qt-opengl", "camera"))]
|
71
|
-
|
72
|
-
def gen_tag_addlist(self) -> tp.List[xml.TagAddList]:
|
73
|
-
if not self.tag_adds:
|
74
|
-
adds = xml.TagAddList(xml.TagAdd('./visualization/qt-opengl',
|
75
|
-
'camera',
|
76
|
-
{},
|
77
|
-
False),
|
78
|
-
xml.TagAdd("./visualization/qt-opengl/camera",
|
79
|
-
"placements",
|
80
|
-
{},
|
81
|
-
False))
|
82
|
-
|
83
|
-
in_ticks = self.setup.n_secs_per_run * self.setup.n_ticks_per_sec
|
84
|
-
adds.append(xml.TagAdd('.//qt-opengl/camera',
|
85
|
-
'timeline',
|
86
|
-
{
|
87
|
-
'loop': str(in_ticks)
|
88
|
-
},
|
89
|
-
False))
|
90
|
-
|
91
|
-
for ext in self.extents:
|
92
|
-
# generate keyframes for switching between camera perspectives
|
93
|
-
self._gen_keyframes(adds, self.kARGOS_N_CAMERAS, in_ticks)
|
94
|
-
|
95
|
-
info = []
|
96
|
-
for c in range(0, self.kARGOS_N_CAMERAS):
|
97
|
-
info.append(self._gen_camera_config(ext,
|
98
|
-
c,
|
99
|
-
self.kARGOS_N_CAMERAS))
|
100
|
-
|
101
|
-
for index, up, look_at, pos in info:
|
102
|
-
camera = xml.TagAdd('.//camera/placements',
|
103
|
-
'placement',
|
104
|
-
{
|
105
|
-
'index': f"{index}",
|
106
|
-
'up': f"{up.x},{up.y},{up.z}",
|
107
|
-
'position': f"{pos.x},{pos.y},{pos.z}",
|
108
|
-
'look_at': f"{look_at.x},{look_at.y},{look_at.z}",
|
109
|
-
},
|
110
|
-
True)
|
111
|
-
adds.append(camera)
|
112
|
-
|
113
|
-
self.tag_adds = [adds]
|
114
|
-
|
115
|
-
return self.tag_adds
|
116
|
-
|
117
|
-
def gen_files(self) -> None:
|
118
|
-
pass
|
119
|
-
|
120
|
-
def _gen_keyframes(self,
|
121
|
-
adds: xml.TagAddList,
|
122
|
-
n_cameras: int,
|
123
|
-
cycle_length: int) -> None:
|
124
|
-
for c in range(0, n_cameras):
|
125
|
-
index = c % n_cameras
|
126
|
-
adds.append(xml.TagAdd('.//qt-opengl/camera/timeline',
|
127
|
-
'keyframe',
|
128
|
-
{
|
129
|
-
'placement': str(index),
|
130
|
-
'step': str(int(cycle_length / n_cameras * c))
|
131
|
-
},
|
132
|
-
True
|
133
|
-
))
|
134
|
-
if 'interp' in self.cmdline and c < n_cameras:
|
135
|
-
adds.append(xml.TagAdd('.//qt-opengl/camera/timeline',
|
136
|
-
'interpolate',
|
137
|
-
{},
|
138
|
-
True))
|
139
|
-
|
140
|
-
def _gen_camera_config(self,
|
141
|
-
ext: ArenaExtent,
|
142
|
-
index: int,
|
143
|
-
n_cameras) -> tuple:
|
144
|
-
angle = (index % n_cameras) * (2.0 * math.pi / n_cameras)
|
145
|
-
look_at = Vector3D(ext.xsize() / 2.0,
|
146
|
-
ext.ysize() / 2.0,
|
147
|
-
0.0)
|
148
|
-
hyp = math.sqrt(2 * max(look_at.x, look_at.y) ** 2)
|
149
|
-
|
150
|
-
pos_x = (hyp * math.cos(angle) + look_at.x)
|
151
|
-
pos_y = (hyp * math.sin(angle) + look_at.y)
|
152
|
-
pos_z = (max(ext.xsize(), ext.ysize()) * 0.50)
|
153
|
-
pos = Vector3D(pos_x, pos_y, pos_z)
|
154
|
-
|
155
|
-
# This is what the ARGoS source does for the up vector for the default
|
156
|
-
# camera configuration
|
157
|
-
up = Vector3D(0, 0, 1)
|
158
|
-
|
159
|
-
return index, up, look_at, pos
|
160
|
-
|
161
|
-
|
162
|
-
@implements.implements(IBaseVariable)
|
163
|
-
class QTCameraOverhead():
|
164
|
-
"""Defines a single overhead camera perspective within ARGoS.
|
165
|
-
|
166
|
-
Attributes:
|
167
|
-
|
168
|
-
extents: List of (X,Y,Z) tuple of dimensions of arena areas to generate
|
169
|
-
camera definitions for.
|
170
|
-
|
171
|
-
"""
|
172
|
-
|
173
|
-
def __init__(self,
|
174
|
-
extents: tp.List[ArenaExtent]) -> None:
|
175
|
-
self.extents = extents
|
176
|
-
self.tag_adds = [] # type: tp.List[xml.TagAddList]
|
177
|
-
|
178
|
-
def gen_attr_changelist(self) -> tp.List[xml.AttrChangeSet]:
|
179
|
-
"""No effect.
|
180
|
-
|
181
|
-
All tags/attributes are either deleted or added.
|
182
|
-
|
183
|
-
"""
|
184
|
-
return []
|
185
|
-
|
186
|
-
def gen_tag_rmlist(self) -> tp.List[xml.TagRmList]:
|
187
|
-
"""Remove the ``<camera>`` tag if it exists.
|
188
|
-
|
189
|
-
Obviously you *must* call this function BEFORE adding new definitions.
|
190
|
-
|
191
|
-
"""
|
192
|
-
return [xml.TagRmList(xml.TagRm("./visualization/qt-opengl", "camera"))]
|
193
|
-
|
194
|
-
def gen_tag_addlist(self) -> tp.List[xml.TagAddList]:
|
195
|
-
if not self.tag_adds:
|
196
|
-
adds = xml.TagAddList(xml.TagAdd('./visualization/qt-opengl',
|
197
|
-
'camera',
|
198
|
-
{},
|
199
|
-
False),
|
200
|
-
xml.TagAdd("./visualization/qt-opengl/camera",
|
201
|
-
"placements",
|
202
|
-
{},
|
203
|
-
False))
|
204
|
-
|
205
|
-
for ext in self.extents:
|
206
|
-
height = max(ext.xsize(), ext.ysize()) * 0.75
|
207
|
-
camera = xml.TagAdd('.//camera/placements',
|
208
|
-
'placement',
|
209
|
-
{
|
210
|
-
'index': '0',
|
211
|
-
'position': "{0}, {1}, {2}".format(ext.xsize() / 2.0,
|
212
|
-
ext.ysize() / 2.0,
|
213
|
-
height),
|
214
|
-
'look_at': "{0}, {1}, 0".format(ext.xsize() / 2.0,
|
215
|
-
ext.ysize() / 2.0),
|
216
|
-
},
|
217
|
-
True)
|
218
|
-
adds.append(camera)
|
219
|
-
self.tag_adds = [adds]
|
220
|
-
|
221
|
-
return self.tag_adds
|
222
|
-
|
223
|
-
def gen_files(self) -> None:
|
224
|
-
pass
|
225
|
-
|
226
|
-
|
227
|
-
def factory(cmdopts: types.Cmdopts, extents: tp.List[ArenaExtent]):
|
228
|
-
"""Create cameras for a list of arena extents.
|
229
|
-
|
230
|
-
"""
|
231
|
-
if cmdopts['camera_config'] == 'overhead':
|
232
|
-
return QTCameraOverhead(extents)
|
233
|
-
else:
|
234
|
-
return QTCameraTimeline(exp.factory(cmdopts["exp_setup"])(), # type: ignore
|
235
|
-
cmdopts['camera_config'],
|
236
|
-
extents)
|
237
|
-
|
238
|
-
|
239
|
-
__api__ = [
|
240
|
-
'QTCameraTimeline', 'QTCameraOverhead',
|
241
|
-
|
242
|
-
|
243
|
-
]
|
@@ -1,136 +0,0 @@
|
|
1
|
-
# Copyright 2018 John Harwell, All rights reserved.
|
2
|
-
#
|
3
|
-
# SPDX-License-Identifier: MIT
|
4
|
-
#
|
5
|
-
|
6
|
-
# Core packages
|
7
|
-
import re
|
8
|
-
import typing as tp
|
9
|
-
import pathlib
|
10
|
-
|
11
|
-
# 3rd party packages
|
12
|
-
|
13
|
-
# Project packages
|
14
|
-
from sierra.core.variables import batch_criteria as bc
|
15
|
-
from sierra.core.utils import ArenaExtent
|
16
|
-
from sierra.plugins.platform.argos.variables.arena_shape import ArenaShape
|
17
|
-
from sierra.core import types
|
18
|
-
|
19
|
-
|
20
|
-
class ConstantDensity(bc.UnivarBatchCriteria):
|
21
|
-
"""Defines common functionality for all constant-density classes.
|
22
|
-
|
23
|
-
Constant density = SOMETHING/arena size is held constant as arena size is
|
24
|
-
increased. This class is a base class which should NEVER be used on its own.
|
25
|
-
|
26
|
-
Attributes:
|
27
|
-
|
28
|
-
target_density: The target density.
|
29
|
-
|
30
|
-
dimensions: List of (X,Y) dimensions to use (creates rectangular
|
31
|
-
arenas).
|
32
|
-
|
33
|
-
scenario_tag: A scenario tag (presumably part of `--scenario`) to use to
|
34
|
-
generate scenario names.
|
35
|
-
|
36
|
-
changes: List of sets of changes to apply to generate the specified
|
37
|
-
arena sizes.
|
38
|
-
|
39
|
-
"""
|
40
|
-
|
41
|
-
def __init__(self,
|
42
|
-
cli_arg: str,
|
43
|
-
main_config: types.YAMLDict,
|
44
|
-
batch_input_root: pathlib.Path,
|
45
|
-
target_density: float,
|
46
|
-
dimensions: tp.List[ArenaExtent],
|
47
|
-
scenario_tag: str) -> None:
|
48
|
-
bc.UnivarBatchCriteria.__init__(self,
|
49
|
-
cli_arg,
|
50
|
-
main_config,
|
51
|
-
batch_input_root)
|
52
|
-
self.target_density = target_density
|
53
|
-
self.dimensions = dimensions
|
54
|
-
self.scenario_tag = scenario_tag
|
55
|
-
self.attr_changes = ArenaShape(dimensions).gen_attr_changelist()
|
56
|
-
|
57
|
-
def exp_scenario_name(self, exp_num: int) -> str:
|
58
|
-
"""Given the exp number in the batch, compute a parsable scenario name.
|
59
|
-
|
60
|
-
It is necessary to query this criteria after generating the changelist
|
61
|
-
in order to create generator classes for each experiment in the batch
|
62
|
-
with the correct name and definition in some cases.
|
63
|
-
|
64
|
-
Normally controller+scenario are used to look up all necessary changes
|
65
|
-
for the specified arena size, but for this criteria the specified
|
66
|
-
scenario is the base scenario (i.e., the starting arena dimensions), and
|
67
|
-
the correct arena dimensions for a given exp must be found via lookup
|
68
|
-
with THIS function).
|
69
|
-
|
70
|
-
"""
|
71
|
-
dims = self.dimensions[exp_num]
|
72
|
-
return self.scenario_tag + '.' + 'x'.join([str(dims.xsize()),
|
73
|
-
str(dims.ysize()),
|
74
|
-
str(dims.zsize())])
|
75
|
-
|
76
|
-
|
77
|
-
class Parser():
|
78
|
-
"""Enforces specification of a :class:`ConstantDensity` derived batch criteria.
|
79
|
-
|
80
|
-
"""
|
81
|
-
|
82
|
-
def __call__(self, arg: str) -> types.CLIArgSpec:
|
83
|
-
"""
|
84
|
-
Parse the cmdline argument.
|
85
|
-
|
86
|
-
Returns:
|
87
|
-
|
88
|
-
Dict:
|
89
|
-
target_density: Floating point value of parsed target density
|
90
|
-
arena_size_inc: Integer increment for arena size
|
91
|
-
|
92
|
-
"""
|
93
|
-
ret = {}
|
94
|
-
|
95
|
-
sections = arg.split('.')
|
96
|
-
# remove variable name, leaving only the spec
|
97
|
-
sections = sections[1:]
|
98
|
-
|
99
|
-
# Need to have 2 dot/3 parts
|
100
|
-
assert len(sections) == 3, \
|
101
|
-
(f"Spec must have 3 sections separated by '.'; have "
|
102
|
-
f"{len(sections)} sections from '{arg}'")
|
103
|
-
|
104
|
-
# Parse density
|
105
|
-
res = re.search('[0-9]+', sections[0])
|
106
|
-
assert res is not None, \
|
107
|
-
f"Bad density characteristic spec in section '{sections[0]}'"
|
108
|
-
|
109
|
-
characteristic = float(res.group(0))
|
110
|
-
|
111
|
-
res = re.search('p[0-9]+', sections[0])
|
112
|
-
assert res is not None, \
|
113
|
-
f"Bad density mantissa spec in section '{sections[0]}'"
|
114
|
-
mantissa = float("0." + res.group(0)[1:])
|
115
|
-
|
116
|
-
ret['target_density'] = characteristic + mantissa
|
117
|
-
|
118
|
-
# Parse arena size increment
|
119
|
-
res = re.search('I[0-9]+', sections[1])
|
120
|
-
assert res is not None, \
|
121
|
-
f"Bad arena increment spec in section '{sections[1]}'"
|
122
|
-
ret['arena_size_inc'] = int(res.group(0)[1:])
|
123
|
-
|
124
|
-
# Parse cardinality
|
125
|
-
res = re.search('C[0-9]+', sections[2])
|
126
|
-
assert res is not None, \
|
127
|
-
f"Bad cardinality spec in section '{sections[2]}'"
|
128
|
-
|
129
|
-
ret['cardinality'] = int(res.group(0)[1:])
|
130
|
-
|
131
|
-
return ret
|
132
|
-
|
133
|
-
|
134
|
-
__api__ = [
|
135
|
-
'ConstantDensity'
|
136
|
-
]
|
@@ -1,113 +0,0 @@
|
|
1
|
-
# Copyright 2021 John Harwell, All rights reserved.
|
2
|
-
#
|
3
|
-
# SPDX-License-Identifier: MIT
|
4
|
-
|
5
|
-
"""Classes for the ``--exp-setup`` cmdline option.
|
6
|
-
|
7
|
-
See :ref:`ln-sierra-vars-expsetup` for usage documentation.
|
8
|
-
|
9
|
-
"""
|
10
|
-
|
11
|
-
# Core packages
|
12
|
-
import typing as tp
|
13
|
-
|
14
|
-
# 3rd party packages
|
15
|
-
import implements
|
16
|
-
|
17
|
-
# Project packages
|
18
|
-
from sierra.core.variables.base_variable import IBaseVariable
|
19
|
-
from sierra.core.experiment import xml
|
20
|
-
from sierra.core import config, types
|
21
|
-
from sierra.core.variables.exp_setup import Parser
|
22
|
-
|
23
|
-
|
24
|
-
@implements.implements(IBaseVariable)
|
25
|
-
class ExpSetup():
|
26
|
-
"""
|
27
|
-
Defines the simulation duration.
|
28
|
-
|
29
|
-
Attributes:
|
30
|
-
|
31
|
-
duration: The simulation duration in seconds, NOT timesteps.
|
32
|
-
"""
|
33
|
-
@staticmethod
|
34
|
-
def extract_time_params(exp_def: xml.AttrChangeSet) -> types.IntDict:
|
35
|
-
"""
|
36
|
-
Extract and return time parameters for the experiment.
|
37
|
-
|
38
|
-
Returns:
|
39
|
-
|
40
|
-
length (in seconds), ticks_per_second
|
41
|
-
"""
|
42
|
-
ret = {
|
43
|
-
'T_in_secs': int(),
|
44
|
-
'n_ticks_per_sec': int()
|
45
|
-
}
|
46
|
-
|
47
|
-
for path, attr, value in exp_def:
|
48
|
-
if 'experiment' in path:
|
49
|
-
if 'length' in attr:
|
50
|
-
ret['T_in_secs'] = int(value)
|
51
|
-
if 'ticks_per_second' in attr:
|
52
|
-
ret['n_ticks_per_sec'] = int(value)
|
53
|
-
|
54
|
-
return ret
|
55
|
-
|
56
|
-
def __init__(self,
|
57
|
-
n_secs_per_run: int,
|
58
|
-
n_datapoints: int,
|
59
|
-
n_ticks_per_sec: int) -> None:
|
60
|
-
self.n_secs_per_run = n_secs_per_run
|
61
|
-
self.n_datapoints = n_datapoints
|
62
|
-
self.n_ticks_per_sec = n_ticks_per_sec
|
63
|
-
self.attr_changes = [] # type: tp.List[xml.AttrChangeSet]
|
64
|
-
|
65
|
-
def gen_attr_changelist(self) -> tp.List[xml.AttrChangeSet]:
|
66
|
-
if not self.attr_changes:
|
67
|
-
chgs = xml.AttrChangeSet(xml.AttrChange(".//experiment",
|
68
|
-
"length",
|
69
|
-
"{0}".format(self.n_secs_per_run)),
|
70
|
-
xml.AttrChange(".//experiment",
|
71
|
-
"ticks_per_second",
|
72
|
-
"{0}".format(self.n_ticks_per_sec)),
|
73
|
-
)
|
74
|
-
self.attr_changes = [chgs]
|
75
|
-
return self.attr_changes
|
76
|
-
|
77
|
-
def gen_tag_rmlist(self) -> tp.List[xml.TagRmList]:
|
78
|
-
return []
|
79
|
-
|
80
|
-
def gen_tag_addlist(self) -> tp.List[xml.TagAddList]:
|
81
|
-
return []
|
82
|
-
|
83
|
-
def gen_files(self) -> None:
|
84
|
-
pass
|
85
|
-
|
86
|
-
|
87
|
-
def factory(arg: str) -> ExpSetup:
|
88
|
-
"""Create an :class:`ExpSetup` derived class from the command line definition.
|
89
|
-
|
90
|
-
Arguments:
|
91
|
-
|
92
|
-
arg: The value of ``--exp-setup``.
|
93
|
-
|
94
|
-
"""
|
95
|
-
parser = Parser({'n_secs_per_run': config.kARGoS['n_secs_per_run'],
|
96
|
-
'n_ticks_per_sec': config.kARGoS['n_ticks_per_sec'],
|
97
|
-
'n_datapoints': config.kExperimentalRunData['n_datapoints_1D']})
|
98
|
-
attr = parser(arg)
|
99
|
-
|
100
|
-
def __init__(self: ExpSetup) -> None:
|
101
|
-
ExpSetup.__init__(self,
|
102
|
-
attr["n_secs_per_run"],
|
103
|
-
attr['n_datapoints'],
|
104
|
-
attr['n_ticks_per_sec'])
|
105
|
-
|
106
|
-
return type(attr['pretty_name'],
|
107
|
-
(ExpSetup,),
|
108
|
-
{"__init__": __init__}) # type: ignore
|
109
|
-
|
110
|
-
|
111
|
-
__api__ = [
|
112
|
-
'ExpSetup',
|
113
|
-
]
|
@@ -1,175 +0,0 @@
|
|
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:`ln-sierra-platform-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
|
-
|
17
|
-
# 3rd party packages
|
18
|
-
import implements
|
19
|
-
|
20
|
-
# Project packages
|
21
|
-
from sierra.plugins.platform.argos.variables import constant_density as cd
|
22
|
-
from sierra.core import utils, types
|
23
|
-
import sierra.core.variables.batch_criteria as bc
|
24
|
-
from sierra.core.vector import Vector3D
|
25
|
-
from sierra.core.experiment import xml
|
26
|
-
|
27
|
-
|
28
|
-
@implements.implements(bc.IConcreteBatchCriteria)
|
29
|
-
class PopulationConstantDensity(cd.ConstantDensity):
|
30
|
-
"""Defines XML changes for maintain population density across arena sizes.
|
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.
|
35
|
-
|
36
|
-
Does not change the # blocks/block manifest.
|
37
|
-
|
38
|
-
"""
|
39
|
-
|
40
|
-
def __init__(self, *args, **kwargs) -> None:
|
41
|
-
cd.ConstantDensity.__init__(self, *args, **kwargs)
|
42
|
-
self.already_added = False
|
43
|
-
self.logger = logging.getLogger(__name__)
|
44
|
-
|
45
|
-
def gen_attr_changelist(self) -> tp.List[xml.AttrChangeSet]:
|
46
|
-
"""Generate XML modifications to to maintain constant population density.
|
47
|
-
|
48
|
-
Robots are approximated as point masses.
|
49
|
-
|
50
|
-
"""
|
51
|
-
if not self.already_added:
|
52
|
-
for changeset in self.attr_changes:
|
53
|
-
for path, attr, value in changeset:
|
54
|
-
|
55
|
-
if path == ".//arena" and attr == "size":
|
56
|
-
x, y, z = [int(float(_)) for _ in value.split(",")]
|
57
|
-
extent = utils.ArenaExtent(
|
58
|
-
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_robots = int(extent.area() *
|
62
|
-
(self.target_density / 100.0))
|
63
|
-
if n_robots == 0:
|
64
|
-
n_robots = 1
|
65
|
-
self.logger.warning(("n_robots set to 1 even though "
|
66
|
-
"calculated as 0 for area=%s,"
|
67
|
-
"density=%s"),
|
68
|
-
str(extent.area()),
|
69
|
-
self.target_density / 100.0)
|
70
|
-
|
71
|
-
changeset.add(xml.AttrChange(".//arena/distribute/entity",
|
72
|
-
"quantity",
|
73
|
-
str(n_robots)))
|
74
|
-
self.logger.debug("Calculated population size=%d for extent=%s,density=%s",
|
75
|
-
n_robots,
|
76
|
-
str(extent), self.target_density)
|
77
|
-
break
|
78
|
-
|
79
|
-
self.already_added = True
|
80
|
-
|
81
|
-
return self.attr_changes
|
82
|
-
|
83
|
-
def gen_exp_names(self, cmdopts: types.Cmdopts) -> tp.List[str]:
|
84
|
-
changes = self.gen_attr_changelist()
|
85
|
-
return ['exp' + str(x) for x in range(0, len(changes))]
|
86
|
-
|
87
|
-
def graph_xticks(self,
|
88
|
-
cmdopts: types.Cmdopts,
|
89
|
-
exp_names: tp.Optional[tp.List[str]] = None) -> tp.List[float]:
|
90
|
-
|
91
|
-
if exp_names is None:
|
92
|
-
exp_names = self.gen_exp_names(cmdopts)
|
93
|
-
|
94
|
-
ret = list(map(float, self.populations(cmdopts, exp_names)))
|
95
|
-
|
96
|
-
if cmdopts['plot_log_xscale']:
|
97
|
-
return [int(math.log2(x)) for x in ret]
|
98
|
-
elif cmdopts['plot_enumerated_xscale']:
|
99
|
-
return list(range(0, len(ret)))
|
100
|
-
else:
|
101
|
-
return ret
|
102
|
-
|
103
|
-
def graph_xticklabels(self,
|
104
|
-
cmdopts: types.Cmdopts,
|
105
|
-
exp_names: tp.Optional[tp.List[str]] = None) -> tp.List[str]:
|
106
|
-
if exp_names is None:
|
107
|
-
exp_names = self.gen_exp_names(cmdopts)
|
108
|
-
|
109
|
-
ret = map(float, self.populations(cmdopts, exp_names))
|
110
|
-
|
111
|
-
return list(map(lambda x: str(int(round(x, 4))), ret))
|
112
|
-
|
113
|
-
def graph_xlabel(self, cmdopts: types.Cmdopts) -> str:
|
114
|
-
if cmdopts['plot_log_xscale']:
|
115
|
-
return r"$\log_{2}$(Population Size)"
|
116
|
-
|
117
|
-
return r"Population Size"
|
118
|
-
|
119
|
-
def n_robots(self, exp_num: int) -> int:
|
120
|
-
return int(self.target_density / 100.0 * self.dimensions[exp_num].area())
|
121
|
-
|
122
|
-
|
123
|
-
def calc_dims(cmdopts: types.Cmdopts,
|
124
|
-
attr: types.CLIArgSpec,
|
125
|
-
**kwargs) -> tp.List[utils.ArenaExtent]:
|
126
|
-
|
127
|
-
kw = utils.gen_scenario_spec(cmdopts, **kwargs)
|
128
|
-
|
129
|
-
is_2x1 = kw['arena_x'] == 2 * kw['arena_y']
|
130
|
-
is_1x1 = kw['arena_x'] == kw['arena_y']
|
131
|
-
|
132
|
-
if is_2x1:
|
133
|
-
r = range(kw['arena_x'],
|
134
|
-
kw['arena_x'] + attr['cardinality'] * attr['arena_size_inc'],
|
135
|
-
attr['arena_size_inc'])
|
136
|
-
return list(utils.ArenaExtent(Vector3D(x, int(x / 2), kw['arena_z'])) for x in r)
|
137
|
-
elif is_1x1:
|
138
|
-
r = range(kw['arena_x'],
|
139
|
-
kw['arena_x'] + attr['cardinality'] * attr['arena_size_inc'],
|
140
|
-
attr['arena_size_inc'])
|
141
|
-
|
142
|
-
return list(utils.ArenaExtent(Vector3D(x, x, kw['arena_z'])) for x in r)
|
143
|
-
else:
|
144
|
-
raise NotImplementedError(
|
145
|
-
"Unsupported arena X,Y scaling '{0}': Must be [2x1,1x1]")
|
146
|
-
|
147
|
-
|
148
|
-
def factory(cli_arg: str,
|
149
|
-
main_config: types.YAMLDict,
|
150
|
-
cmdopts: types.Cmdopts,
|
151
|
-
**kwargs) -> PopulationConstantDensity:
|
152
|
-
"""Create a :class:`PopulationConstantDensity` derived class.
|
153
|
-
|
154
|
-
"""
|
155
|
-
attr = cd.Parser()(cli_arg)
|
156
|
-
kw = utils.gen_scenario_spec(cmdopts, **kwargs)
|
157
|
-
dims = calc_dims(cmdopts, attr, **kwargs)
|
158
|
-
|
159
|
-
def __init__(self) -> None:
|
160
|
-
PopulationConstantDensity.__init__(self,
|
161
|
-
cli_arg,
|
162
|
-
main_config,
|
163
|
-
cmdopts['batch_input_root'],
|
164
|
-
attr["target_density"],
|
165
|
-
dims,
|
166
|
-
kw['scenario_tag'])
|
167
|
-
|
168
|
-
return type(cli_arg, # type: ignore
|
169
|
-
(PopulationConstantDensity,),
|
170
|
-
{"__init__": __init__})
|
171
|
-
|
172
|
-
|
173
|
-
__api__ = [
|
174
|
-
'PopulationConstantDensity'
|
175
|
-
]
|