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
@@ -0,0 +1,240 @@
|
|
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 definition
|
23
|
+
from sierra.core import types
|
24
|
+
from sierra.core.vector import Vector3D
|
25
|
+
import sierra.plugins.engine.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
|
+
interpolate: Should we interpolate between camera positions on our
|
34
|
+
timeline ?
|
35
|
+
|
36
|
+
setup: Simulation experiment definitions.
|
37
|
+
|
38
|
+
extents: List of (X,Y,Zs) tuple of dimensions of arena areas to generate
|
39
|
+
camera definitions for.
|
40
|
+
|
41
|
+
"""
|
42
|
+
|
43
|
+
# If this default changes in ARGoS, it will need to be updated here too.
|
44
|
+
kARGOS_N_CAMERAS = 12
|
45
|
+
|
46
|
+
def __init__(
|
47
|
+
self, setup: exp.ExpSetup, cmdline: str, extents: tp.List[ArenaExtent]
|
48
|
+
) -> None:
|
49
|
+
self.cmdline = cmdline
|
50
|
+
self.extents = extents
|
51
|
+
self.setup = setup
|
52
|
+
self.element_adds = [] # type: tp.List[definition.ElementAddList]
|
53
|
+
|
54
|
+
def gen_attr_changelist(self) -> tp.List[definition.AttrChangeSet]:
|
55
|
+
"""
|
56
|
+
No effect.
|
57
|
+
|
58
|
+
All tags/attributes are either deleted or added.
|
59
|
+
"""
|
60
|
+
return []
|
61
|
+
|
62
|
+
def gen_tag_rmlist(self) -> tp.List[definition.ElementRmList]:
|
63
|
+
"""Remove the ``<camera>`` tag if it exists.
|
64
|
+
|
65
|
+
Obviously you *must* call this function BEFORE adding new definitions.
|
66
|
+
|
67
|
+
"""
|
68
|
+
return [
|
69
|
+
definition.ElementRmList(
|
70
|
+
definition.ElementRm("./visualization/qt-opengl", "camera")
|
71
|
+
)
|
72
|
+
]
|
73
|
+
|
74
|
+
def gen_element_addlist(self) -> tp.List[definition.ElementAddList]:
|
75
|
+
if not self.element_adds:
|
76
|
+
adds = definition.ElementAddList(
|
77
|
+
definition.ElementAdd("./visualization/qt-opengl", "camera", {}, False),
|
78
|
+
definition.ElementAdd(
|
79
|
+
"./visualization/qt-opengl/camera", "placements", {}, False
|
80
|
+
),
|
81
|
+
)
|
82
|
+
|
83
|
+
in_ticks = self.setup.n_secs_per_run * self.setup.n_ticks_per_sec
|
84
|
+
adds.append(
|
85
|
+
definition.ElementAdd(
|
86
|
+
".//qt-opengl/camera", "timeline", {"loop": str(in_ticks)}, False
|
87
|
+
)
|
88
|
+
)
|
89
|
+
|
90
|
+
for ext in self.extents:
|
91
|
+
# generate keyframes for switching between camera perspectives
|
92
|
+
self._gen_keyframes(adds, self.kARGOS_N_CAMERAS, in_ticks)
|
93
|
+
|
94
|
+
info = []
|
95
|
+
for c in range(0, self.kARGOS_N_CAMERAS):
|
96
|
+
info.append(self._gen_camera_config(ext, c, self.kARGOS_N_CAMERAS))
|
97
|
+
|
98
|
+
for index, up, look_at, pos in info:
|
99
|
+
camera = definition.ElementAdd(
|
100
|
+
".//camera/placements",
|
101
|
+
"placement",
|
102
|
+
{
|
103
|
+
"index": f"{index}",
|
104
|
+
"up": f"{up.x},{up.y},{up.z}",
|
105
|
+
"position": f"{pos.x},{pos.y},{pos.z}",
|
106
|
+
"look_at": f"{look_at.x},{look_at.y},{look_at.z}",
|
107
|
+
},
|
108
|
+
True,
|
109
|
+
)
|
110
|
+
adds.append(camera)
|
111
|
+
|
112
|
+
self.element_adds = [adds]
|
113
|
+
|
114
|
+
return self.element_adds
|
115
|
+
|
116
|
+
def gen_files(self) -> None:
|
117
|
+
pass
|
118
|
+
|
119
|
+
def _gen_keyframes(
|
120
|
+
self, adds: definition.ElementAddList, n_cameras: int, cycle_length: int
|
121
|
+
) -> None:
|
122
|
+
for c in range(0, n_cameras):
|
123
|
+
index = c % n_cameras
|
124
|
+
adds.append(
|
125
|
+
definition.ElementAdd(
|
126
|
+
".//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
|
+
)
|
135
|
+
if "interp" in self.cmdline and c < n_cameras:
|
136
|
+
adds.append(
|
137
|
+
definition.ElementAdd(
|
138
|
+
".//qt-opengl/camera/timeline", "interpolate", {}, True
|
139
|
+
)
|
140
|
+
)
|
141
|
+
|
142
|
+
def _gen_camera_config(self, ext: ArenaExtent, index: int, n_cameras) -> tuple:
|
143
|
+
angle = (index % n_cameras) * (2.0 * math.pi / n_cameras)
|
144
|
+
look_at = Vector3D(ext.xsize() / 2.0, ext.ysize() / 2.0, 0.0)
|
145
|
+
hyp = math.sqrt(2 * max(look_at.x, look_at.y) ** 2)
|
146
|
+
|
147
|
+
pos_x = hyp * math.cos(angle) + look_at.x
|
148
|
+
pos_y = hyp * math.sin(angle) + look_at.y
|
149
|
+
pos_z = max(ext.xsize(), ext.ysize()) * 0.50
|
150
|
+
pos = Vector3D(pos_x, pos_y, pos_z)
|
151
|
+
|
152
|
+
# This is what the ARGoS source does for the up vector for the default
|
153
|
+
# camera configuration
|
154
|
+
up = Vector3D(0, 0, 1)
|
155
|
+
|
156
|
+
return index, up, look_at, pos
|
157
|
+
|
158
|
+
|
159
|
+
@implements.implements(IBaseVariable)
|
160
|
+
class QTCameraOverhead:
|
161
|
+
"""Defines a single overhead camera perspective within ARGoS.
|
162
|
+
|
163
|
+
Attributes:
|
164
|
+
extents: List of (X,Y,Z) tuple of dimensions of arena areas to generate
|
165
|
+
camera definitions for.
|
166
|
+
|
167
|
+
"""
|
168
|
+
|
169
|
+
def __init__(self, extents: tp.List[ArenaExtent]) -> None:
|
170
|
+
self.extents = extents
|
171
|
+
self.element_adds = [] # type: tp.List[definition.ElementAddList]
|
172
|
+
|
173
|
+
def gen_attr_changelist(self) -> tp.List[definition.AttrChangeSet]:
|
174
|
+
"""No effect.
|
175
|
+
|
176
|
+
All tags/attributes are either deleted or added.
|
177
|
+
|
178
|
+
"""
|
179
|
+
return []
|
180
|
+
|
181
|
+
def gen_tag_rmlist(self) -> tp.List[definition.ElementRmList]:
|
182
|
+
"""Remove the ``<camera>`` tag if it exists.
|
183
|
+
|
184
|
+
Obviously you *must* call this function BEFORE adding new definitions.
|
185
|
+
|
186
|
+
"""
|
187
|
+
return [
|
188
|
+
definition.ElementRmList(
|
189
|
+
definition.ElementRm("./visualization/qt-opengl", "camera")
|
190
|
+
)
|
191
|
+
]
|
192
|
+
|
193
|
+
def gen_element_addlist(self) -> tp.List[definition.ElementAddList]:
|
194
|
+
if not self.element_adds:
|
195
|
+
adds = definition.ElementAddList(
|
196
|
+
definition.ElementAdd("./visualization/qt-opengl", "camera", {}, False),
|
197
|
+
definition.ElementAdd(
|
198
|
+
"./visualization/qt-opengl/camera", "placements", {}, False
|
199
|
+
),
|
200
|
+
)
|
201
|
+
|
202
|
+
for ext in self.extents:
|
203
|
+
height = max(ext.xsize(), ext.ysize()) * 0.75
|
204
|
+
camera = definition.ElementAdd(
|
205
|
+
".//camera/placements",
|
206
|
+
"placement",
|
207
|
+
{
|
208
|
+
"index": "0",
|
209
|
+
"position": "{0}, {1}, {2}".format(
|
210
|
+
ext.xsize() / 2.0, ext.ysize() / 2.0, height
|
211
|
+
),
|
212
|
+
"look_at": "{0}, {1}, 0".format(
|
213
|
+
ext.xsize() / 2.0, ext.ysize() / 2.0
|
214
|
+
),
|
215
|
+
},
|
216
|
+
True,
|
217
|
+
)
|
218
|
+
adds.append(camera)
|
219
|
+
self.element_adds = [adds]
|
220
|
+
|
221
|
+
return self.element_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
|
+
if cmdopts["camera_config"] == "overhead":
|
230
|
+
return QTCameraOverhead(extents)
|
231
|
+
else:
|
232
|
+
return QTCameraTimeline(
|
233
|
+
exp.factory(cmdopts["exp_setup"]), cmdopts["camera_config"], extents
|
234
|
+
)
|
235
|
+
|
236
|
+
|
237
|
+
__all__ = [
|
238
|
+
"QTCameraTimeline",
|
239
|
+
"QTCameraOverhead",
|
240
|
+
]
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# Copyright 2018 John Harwell, All rights reserved.
|
2
|
+
#
|
3
|
+
# SPDX-License-Identifier: MIT
|
4
|
+
#
|
5
|
+
"""
|
6
|
+
Functionality for mapping arena size -> swarm size to maintain a constant ratio.
|
7
|
+
"""
|
8
|
+
# Core packages
|
9
|
+
import re
|
10
|
+
import typing as tp
|
11
|
+
import pathlib
|
12
|
+
|
13
|
+
# 3rd party packages
|
14
|
+
|
15
|
+
# Project packages
|
16
|
+
from sierra.core.variables import batch_criteria as bc
|
17
|
+
from sierra.core.utils import ArenaExtent
|
18
|
+
from sierra.plugins.engine.argos.variables.arena_shape import ArenaShape
|
19
|
+
from sierra.core import types
|
20
|
+
|
21
|
+
|
22
|
+
class ConstantDensity(bc.UnivarBatchCriteria):
|
23
|
+
"""Defines common functionality for all constant-density classes.
|
24
|
+
|
25
|
+
Constant density = SOMETHING/arena size is held constant as arena size is
|
26
|
+
increased. This class is a base class which should NEVER be used on its own.
|
27
|
+
|
28
|
+
Attributes:
|
29
|
+
target_density: The target density.
|
30
|
+
|
31
|
+
dimensions: List of (X,Y) dimensions to use (creates rectangular
|
32
|
+
arenas).
|
33
|
+
|
34
|
+
scenario_tag: A scenario tag (presumably part of `--scenario`) to use to
|
35
|
+
generate scenario names.
|
36
|
+
|
37
|
+
changes: List of sets of changes to apply to generate the specified
|
38
|
+
arena sizes.
|
39
|
+
|
40
|
+
"""
|
41
|
+
|
42
|
+
def __init__(
|
43
|
+
self,
|
44
|
+
cli_arg: str,
|
45
|
+
main_config: types.YAMLDict,
|
46
|
+
batch_input_root: pathlib.Path,
|
47
|
+
target_density: float,
|
48
|
+
dimensions: tp.List[ArenaExtent],
|
49
|
+
scenario_tag: str,
|
50
|
+
) -> None:
|
51
|
+
bc.UnivarBatchCriteria.__init__(self, cli_arg, main_config, 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 computable_exp_scenario_name(self) -> bool:
|
58
|
+
return True
|
59
|
+
|
60
|
+
def exp_scenario_name(self, exp_num: int) -> str:
|
61
|
+
"""Given the exp number in the batch, compute a parsable scenario name.
|
62
|
+
|
63
|
+
It is necessary to query this criteria after generating the changelist
|
64
|
+
in order to create generator classes for each experiment in the batch
|
65
|
+
with the correct name and definition in some cases.
|
66
|
+
|
67
|
+
Normally controller+scenario are used to look up all necessary changes
|
68
|
+
for the specified arena size, but for this criteria the specified
|
69
|
+
scenario is the base scenario (i.e., the starting arena dimensions), and
|
70
|
+
the correct arena dimensions for a given exp must be found via lookup
|
71
|
+
with THIS function).
|
72
|
+
|
73
|
+
"""
|
74
|
+
dims = self.dimensions[exp_num]
|
75
|
+
return (
|
76
|
+
self.scenario_tag
|
77
|
+
+ "."
|
78
|
+
+ "x".join([str(dims.xsize()), str(dims.ysize()), str(dims.zsize())])
|
79
|
+
)
|
80
|
+
|
81
|
+
|
82
|
+
def parse(arg: str) -> types.CLIArgSpec:
|
83
|
+
"""Enforces specification of a :class:`ConstantDensity` derived batch criteria.
|
84
|
+
|
85
|
+
Returns:
|
86
|
+
Dict:
|
87
|
+
target_density: Floating point value of parsed target density
|
88
|
+
arena_size_inc: Integer increment for arena size
|
89
|
+
"""
|
90
|
+
ret = {}
|
91
|
+
|
92
|
+
sections = arg.split(".")
|
93
|
+
# remove variable name, leaving only the spec
|
94
|
+
spec = ".".join(sections[1:])
|
95
|
+
|
96
|
+
regex = r"(\d+)p(\d+)\.I(\d+)\.C(\d+)"
|
97
|
+
res = re.match(regex, spec)
|
98
|
+
|
99
|
+
assert len(res.groups()) == 4, f"Spec must match {regex}, have {spec}"
|
100
|
+
|
101
|
+
# groups(0) is always the full matched string; subsequent groups are the
|
102
|
+
# captured groups from the () expressions.
|
103
|
+
characteristic = float(res.group(1))
|
104
|
+
mantissa = float("0." + res.group(2))
|
105
|
+
ret["target_density"] = characteristic + mantissa
|
106
|
+
ret["arena_size_inc"] = int(res.group(3))
|
107
|
+
ret["cardinality"] = int(res.group(4))
|
108
|
+
|
109
|
+
return ret
|
110
|
+
|
111
|
+
|
112
|
+
__all__ = ["ConstantDensity", "parse"]
|
@@ -0,0 +1,82 @@
|
|
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:`usage/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 definition
|
20
|
+
from sierra.core import config
|
21
|
+
from sierra.core.variables import exp_setup
|
22
|
+
|
23
|
+
|
24
|
+
@implements.implements(IBaseVariable)
|
25
|
+
class ExpSetup:
|
26
|
+
"""
|
27
|
+
Defines the simulation duration.
|
28
|
+
|
29
|
+
"""
|
30
|
+
|
31
|
+
def __init__(self, n_secs_per_run: int, n_ticks_per_sec: int) -> None:
|
32
|
+
self.n_secs_per_run = n_secs_per_run
|
33
|
+
self.n_ticks_per_sec = n_ticks_per_sec
|
34
|
+
self.attr_changes = [] # type: tp.List[definition.AttrChangeSet]
|
35
|
+
|
36
|
+
def gen_attr_changelist(self) -> tp.List[definition.AttrChangeSet]:
|
37
|
+
if not self.attr_changes:
|
38
|
+
chgs = definition.AttrChangeSet(
|
39
|
+
definition.AttrChange(
|
40
|
+
".//experiment", "length", "{0}".format(self.n_secs_per_run)
|
41
|
+
),
|
42
|
+
definition.AttrChange(
|
43
|
+
".//experiment",
|
44
|
+
"ticks_per_second",
|
45
|
+
"{0}".format(self.n_ticks_per_sec),
|
46
|
+
),
|
47
|
+
)
|
48
|
+
self.attr_changes = [chgs]
|
49
|
+
return self.attr_changes
|
50
|
+
|
51
|
+
def gen_tag_rmlist(self) -> tp.List[definition.ElementRmList]:
|
52
|
+
return []
|
53
|
+
|
54
|
+
def gen_element_addlist(self) -> tp.List[definition.ElementAddList]:
|
55
|
+
return []
|
56
|
+
|
57
|
+
def gen_files(self) -> None:
|
58
|
+
pass
|
59
|
+
|
60
|
+
|
61
|
+
def factory(arg: str) -> ExpSetup:
|
62
|
+
"""Create an :class:`ExpSetup` derived class from the command line definition.
|
63
|
+
|
64
|
+
Arguments:
|
65
|
+
|
66
|
+
arg: The value of ``--exp-setup``.
|
67
|
+
|
68
|
+
"""
|
69
|
+
attr = exp_setup.parse(
|
70
|
+
arg,
|
71
|
+
{
|
72
|
+
"n_secs_per_run": config.kARGoS["n_secs_per_run"],
|
73
|
+
"n_ticks_per_sec": config.kARGoS["n_ticks_per_sec"],
|
74
|
+
},
|
75
|
+
)
|
76
|
+
|
77
|
+
return ExpSetup(attr["n_secs_per_run"], attr["n_ticks_per_sec"])
|
78
|
+
|
79
|
+
|
80
|
+
__all__ = [
|
81
|
+
"ExpSetup",
|
82
|
+
]
|