sierra-research 1.3.11__py3-none-any.whl → 1.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. sierra/__init__.py +3 -3
  2. sierra/core/__init__.py +3 -3
  3. sierra/core/batchroot.py +223 -0
  4. sierra/core/cmdline.py +681 -1057
  5. sierra/core/compare.py +11 -0
  6. sierra/core/config.py +96 -88
  7. sierra/core/engine.py +306 -0
  8. sierra/core/execenv.py +380 -0
  9. sierra/core/expdef.py +11 -0
  10. sierra/core/experiment/__init__.py +1 -0
  11. sierra/core/experiment/bindings.py +150 -101
  12. sierra/core/experiment/definition.py +414 -245
  13. sierra/core/experiment/spec.py +83 -85
  14. sierra/core/exproot.py +44 -0
  15. sierra/core/generators/__init__.py +10 -0
  16. sierra/core/generators/experiment.py +528 -0
  17. sierra/core/generators/generator_factory.py +138 -137
  18. sierra/core/graphs/__init__.py +23 -0
  19. sierra/core/graphs/bcbridge.py +94 -0
  20. sierra/core/graphs/heatmap.py +245 -324
  21. sierra/core/graphs/pathset.py +27 -0
  22. sierra/core/graphs/schema.py +77 -0
  23. sierra/core/graphs/stacked_line.py +341 -0
  24. sierra/core/graphs/summary_line.py +506 -0
  25. sierra/core/logging.py +3 -2
  26. sierra/core/models/__init__.py +3 -1
  27. sierra/core/models/info.py +19 -0
  28. sierra/core/models/interface.py +52 -122
  29. sierra/core/pipeline/__init__.py +2 -5
  30. sierra/core/pipeline/pipeline.py +228 -126
  31. sierra/core/pipeline/stage1/__init__.py +10 -0
  32. sierra/core/pipeline/stage1/pipeline_stage1.py +45 -31
  33. sierra/core/pipeline/stage2/__init__.py +10 -0
  34. sierra/core/pipeline/stage2/pipeline_stage2.py +8 -11
  35. sierra/core/pipeline/stage2/runner.py +401 -0
  36. sierra/core/pipeline/stage3/__init__.py +12 -0
  37. sierra/core/pipeline/stage3/gather.py +321 -0
  38. sierra/core/pipeline/stage3/pipeline_stage3.py +37 -84
  39. sierra/core/pipeline/stage4/__init__.py +12 -2
  40. sierra/core/pipeline/stage4/pipeline_stage4.py +36 -354
  41. sierra/core/pipeline/stage5/__init__.py +12 -0
  42. sierra/core/pipeline/stage5/pipeline_stage5.py +33 -208
  43. sierra/core/pipeline/yaml.py +48 -0
  44. sierra/core/plugin.py +529 -62
  45. sierra/core/proc.py +11 -0
  46. sierra/core/prod.py +11 -0
  47. sierra/core/ros1/__init__.py +5 -1
  48. sierra/core/ros1/callbacks.py +22 -21
  49. sierra/core/ros1/cmdline.py +59 -88
  50. sierra/core/ros1/generators.py +159 -175
  51. sierra/core/ros1/variables/__init__.py +3 -0
  52. sierra/core/ros1/variables/exp_setup.py +122 -116
  53. sierra/core/startup.py +106 -76
  54. sierra/core/stat_kernels.py +4 -5
  55. sierra/core/storage.py +13 -32
  56. sierra/core/trampoline.py +30 -0
  57. sierra/core/types.py +116 -71
  58. sierra/core/utils.py +103 -106
  59. sierra/core/variables/__init__.py +1 -1
  60. sierra/core/variables/base_variable.py +12 -17
  61. sierra/core/variables/batch_criteria.py +387 -481
  62. sierra/core/variables/builtin.py +135 -0
  63. sierra/core/variables/exp_setup.py +19 -39
  64. sierra/core/variables/population_size.py +72 -76
  65. sierra/core/variables/variable_density.py +44 -68
  66. sierra/core/vector.py +1 -1
  67. sierra/main.py +256 -88
  68. sierra/plugins/__init__.py +119 -0
  69. sierra/plugins/compare/__init__.py +14 -0
  70. sierra/plugins/compare/graphs/__init__.py +19 -0
  71. sierra/plugins/compare/graphs/cmdline.py +120 -0
  72. sierra/plugins/compare/graphs/comparator.py +291 -0
  73. sierra/plugins/compare/graphs/inter_controller.py +531 -0
  74. sierra/plugins/compare/graphs/inter_scenario.py +297 -0
  75. sierra/plugins/compare/graphs/namecalc.py +53 -0
  76. sierra/plugins/compare/graphs/outputroot.py +73 -0
  77. sierra/plugins/compare/graphs/plugin.py +147 -0
  78. sierra/plugins/compare/graphs/preprocess.py +172 -0
  79. sierra/plugins/compare/graphs/schema.py +37 -0
  80. sierra/plugins/engine/__init__.py +14 -0
  81. sierra/plugins/engine/argos/__init__.py +18 -0
  82. sierra/plugins/{platform → engine}/argos/cmdline.py +144 -151
  83. sierra/plugins/{platform/argos/variables → engine/argos/generators}/__init__.py +5 -0
  84. sierra/plugins/engine/argos/generators/engine.py +394 -0
  85. sierra/plugins/engine/argos/plugin.py +393 -0
  86. sierra/plugins/{platform/argos/generators → engine/argos/variables}/__init__.py +5 -0
  87. sierra/plugins/engine/argos/variables/arena_shape.py +183 -0
  88. sierra/plugins/engine/argos/variables/cameras.py +240 -0
  89. sierra/plugins/engine/argos/variables/constant_density.py +112 -0
  90. sierra/plugins/engine/argos/variables/exp_setup.py +82 -0
  91. sierra/plugins/{platform → engine}/argos/variables/physics_engines.py +83 -87
  92. sierra/plugins/engine/argos/variables/population_constant_density.py +178 -0
  93. sierra/plugins/engine/argos/variables/population_size.py +115 -0
  94. sierra/plugins/engine/argos/variables/population_variable_density.py +123 -0
  95. sierra/plugins/engine/argos/variables/rendering.py +108 -0
  96. sierra/plugins/engine/ros1gazebo/__init__.py +18 -0
  97. sierra/plugins/engine/ros1gazebo/cmdline.py +175 -0
  98. sierra/plugins/{platform/ros1robot → engine/ros1gazebo}/generators/__init__.py +5 -0
  99. sierra/plugins/engine/ros1gazebo/generators/engine.py +125 -0
  100. sierra/plugins/engine/ros1gazebo/plugin.py +404 -0
  101. sierra/plugins/engine/ros1gazebo/variables/__init__.py +15 -0
  102. sierra/plugins/engine/ros1gazebo/variables/population_size.py +214 -0
  103. sierra/plugins/engine/ros1robot/__init__.py +18 -0
  104. sierra/plugins/engine/ros1robot/cmdline.py +159 -0
  105. sierra/plugins/{platform/ros1gazebo → engine/ros1robot}/generators/__init__.py +4 -0
  106. sierra/plugins/engine/ros1robot/generators/engine.py +95 -0
  107. sierra/plugins/engine/ros1robot/plugin.py +410 -0
  108. sierra/plugins/{hpc/local → engine/ros1robot/variables}/__init__.py +5 -0
  109. sierra/plugins/engine/ros1robot/variables/population_size.py +146 -0
  110. sierra/plugins/execenv/__init__.py +11 -0
  111. sierra/plugins/execenv/hpc/__init__.py +18 -0
  112. sierra/plugins/execenv/hpc/adhoc/__init__.py +18 -0
  113. sierra/plugins/execenv/hpc/adhoc/cmdline.py +30 -0
  114. sierra/plugins/execenv/hpc/adhoc/plugin.py +131 -0
  115. sierra/plugins/execenv/hpc/cmdline.py +137 -0
  116. sierra/plugins/execenv/hpc/local/__init__.py +18 -0
  117. sierra/plugins/execenv/hpc/local/cmdline.py +31 -0
  118. sierra/plugins/execenv/hpc/local/plugin.py +145 -0
  119. sierra/plugins/execenv/hpc/pbs/__init__.py +18 -0
  120. sierra/plugins/execenv/hpc/pbs/cmdline.py +30 -0
  121. sierra/plugins/execenv/hpc/pbs/plugin.py +121 -0
  122. sierra/plugins/execenv/hpc/slurm/__init__.py +18 -0
  123. sierra/plugins/execenv/hpc/slurm/cmdline.py +30 -0
  124. sierra/plugins/execenv/hpc/slurm/plugin.py +133 -0
  125. sierra/plugins/execenv/prefectserver/__init__.py +18 -0
  126. sierra/plugins/execenv/prefectserver/cmdline.py +66 -0
  127. sierra/plugins/execenv/prefectserver/dockerremote/__init__.py +18 -0
  128. sierra/plugins/execenv/prefectserver/dockerremote/cmdline.py +66 -0
  129. sierra/plugins/execenv/prefectserver/dockerremote/plugin.py +132 -0
  130. sierra/plugins/execenv/prefectserver/flow.py +66 -0
  131. sierra/plugins/execenv/prefectserver/local/__init__.py +18 -0
  132. sierra/plugins/execenv/prefectserver/local/cmdline.py +29 -0
  133. sierra/plugins/execenv/prefectserver/local/plugin.py +133 -0
  134. sierra/plugins/{hpc/adhoc → execenv/robot}/__init__.py +1 -0
  135. sierra/plugins/execenv/robot/turtlebot3/__init__.py +18 -0
  136. sierra/plugins/execenv/robot/turtlebot3/plugin.py +204 -0
  137. sierra/plugins/expdef/__init__.py +14 -0
  138. sierra/plugins/expdef/json/__init__.py +14 -0
  139. sierra/plugins/expdef/json/plugin.py +504 -0
  140. sierra/plugins/expdef/xml/__init__.py +14 -0
  141. sierra/plugins/expdef/xml/plugin.py +386 -0
  142. sierra/{core/hpc → plugins/proc}/__init__.py +1 -1
  143. sierra/plugins/proc/collate/__init__.py +15 -0
  144. sierra/plugins/proc/collate/cmdline.py +47 -0
  145. sierra/plugins/proc/collate/plugin.py +271 -0
  146. sierra/plugins/proc/compress/__init__.py +18 -0
  147. sierra/plugins/proc/compress/cmdline.py +47 -0
  148. sierra/plugins/proc/compress/plugin.py +123 -0
  149. sierra/plugins/proc/decompress/__init__.py +18 -0
  150. sierra/plugins/proc/decompress/plugin.py +96 -0
  151. sierra/plugins/proc/imagize/__init__.py +15 -0
  152. sierra/plugins/proc/imagize/cmdline.py +49 -0
  153. sierra/plugins/proc/imagize/plugin.py +270 -0
  154. sierra/plugins/proc/modelrunner/__init__.py +16 -0
  155. sierra/plugins/proc/modelrunner/plugin.py +250 -0
  156. sierra/plugins/proc/statistics/__init__.py +15 -0
  157. sierra/plugins/proc/statistics/cmdline.py +64 -0
  158. sierra/plugins/proc/statistics/plugin.py +390 -0
  159. sierra/plugins/{hpc → prod}/__init__.py +1 -0
  160. sierra/plugins/prod/graphs/__init__.py +18 -0
  161. sierra/plugins/prod/graphs/cmdline.py +269 -0
  162. sierra/plugins/prod/graphs/collate.py +279 -0
  163. sierra/plugins/prod/graphs/inter/__init__.py +13 -0
  164. sierra/plugins/prod/graphs/inter/generate.py +83 -0
  165. sierra/plugins/prod/graphs/inter/heatmap.py +86 -0
  166. sierra/plugins/prod/graphs/inter/line.py +134 -0
  167. sierra/plugins/prod/graphs/intra/__init__.py +15 -0
  168. sierra/plugins/prod/graphs/intra/generate.py +202 -0
  169. sierra/plugins/prod/graphs/intra/heatmap.py +74 -0
  170. sierra/plugins/prod/graphs/intra/line.py +114 -0
  171. sierra/plugins/prod/graphs/plugin.py +103 -0
  172. sierra/plugins/prod/graphs/targets.py +63 -0
  173. sierra/plugins/prod/render/__init__.py +18 -0
  174. sierra/plugins/prod/render/cmdline.py +72 -0
  175. sierra/plugins/prod/render/plugin.py +282 -0
  176. sierra/plugins/storage/__init__.py +5 -0
  177. sierra/plugins/storage/arrow/__init__.py +18 -0
  178. sierra/plugins/storage/arrow/plugin.py +38 -0
  179. sierra/plugins/storage/csv/__init__.py +9 -0
  180. sierra/plugins/storage/csv/plugin.py +12 -5
  181. sierra/version.py +3 -2
  182. sierra_research-1.5.0.dist-info/METADATA +238 -0
  183. sierra_research-1.5.0.dist-info/RECORD +186 -0
  184. {sierra_research-1.3.11.dist-info → sierra_research-1.5.0.dist-info}/WHEEL +1 -2
  185. sierra/core/experiment/xml.py +0 -454
  186. sierra/core/generators/controller_generator_parser.py +0 -34
  187. sierra/core/generators/exp_creator.py +0 -351
  188. sierra/core/generators/exp_generators.py +0 -142
  189. sierra/core/graphs/scatterplot2D.py +0 -109
  190. sierra/core/graphs/stacked_line_graph.py +0 -251
  191. sierra/core/graphs/stacked_surface_graph.py +0 -220
  192. sierra/core/graphs/summary_line_graph.py +0 -371
  193. sierra/core/hpc/cmdline.py +0 -142
  194. sierra/core/models/graphs.py +0 -87
  195. sierra/core/pipeline/stage2/exp_runner.py +0 -286
  196. sierra/core/pipeline/stage3/imagizer.py +0 -149
  197. sierra/core/pipeline/stage3/run_collator.py +0 -317
  198. sierra/core/pipeline/stage3/statistics_calculator.py +0 -478
  199. sierra/core/pipeline/stage4/graph_collator.py +0 -320
  200. sierra/core/pipeline/stage4/inter_exp_graph_generator.py +0 -240
  201. sierra/core/pipeline/stage4/intra_exp_graph_generator.py +0 -317
  202. sierra/core/pipeline/stage4/model_runner.py +0 -168
  203. sierra/core/pipeline/stage4/rendering.py +0 -283
  204. sierra/core/pipeline/stage4/yaml_config_loader.py +0 -103
  205. sierra/core/pipeline/stage5/inter_scenario_comparator.py +0 -328
  206. sierra/core/pipeline/stage5/intra_scenario_comparator.py +0 -989
  207. sierra/core/platform.py +0 -493
  208. sierra/core/plugin_manager.py +0 -369
  209. sierra/core/root_dirpath_generator.py +0 -241
  210. sierra/plugins/hpc/adhoc/plugin.py +0 -125
  211. sierra/plugins/hpc/local/plugin.py +0 -81
  212. sierra/plugins/hpc/pbs/__init__.py +0 -9
  213. sierra/plugins/hpc/pbs/plugin.py +0 -126
  214. sierra/plugins/hpc/slurm/__init__.py +0 -9
  215. sierra/plugins/hpc/slurm/plugin.py +0 -130
  216. sierra/plugins/platform/__init__.py +0 -9
  217. sierra/plugins/platform/argos/__init__.py +0 -9
  218. sierra/plugins/platform/argos/generators/platform_generators.py +0 -383
  219. sierra/plugins/platform/argos/plugin.py +0 -337
  220. sierra/plugins/platform/argos/variables/arena_shape.py +0 -145
  221. sierra/plugins/platform/argos/variables/cameras.py +0 -243
  222. sierra/plugins/platform/argos/variables/constant_density.py +0 -136
  223. sierra/plugins/platform/argos/variables/exp_setup.py +0 -113
  224. sierra/plugins/platform/argos/variables/population_constant_density.py +0 -175
  225. sierra/plugins/platform/argos/variables/population_size.py +0 -102
  226. sierra/plugins/platform/argos/variables/population_variable_density.py +0 -132
  227. sierra/plugins/platform/argos/variables/rendering.py +0 -104
  228. sierra/plugins/platform/ros1gazebo/__init__.py +0 -9
  229. sierra/plugins/platform/ros1gazebo/cmdline.py +0 -213
  230. sierra/plugins/platform/ros1gazebo/generators/platform_generators.py +0 -137
  231. sierra/plugins/platform/ros1gazebo/plugin.py +0 -335
  232. sierra/plugins/platform/ros1gazebo/variables/__init__.py +0 -10
  233. sierra/plugins/platform/ros1gazebo/variables/population_size.py +0 -204
  234. sierra/plugins/platform/ros1robot/__init__.py +0 -9
  235. sierra/plugins/platform/ros1robot/cmdline.py +0 -175
  236. sierra/plugins/platform/ros1robot/generators/platform_generators.py +0 -112
  237. sierra/plugins/platform/ros1robot/plugin.py +0 -373
  238. sierra/plugins/platform/ros1robot/variables/__init__.py +0 -10
  239. sierra/plugins/platform/ros1robot/variables/population_size.py +0 -146
  240. sierra/plugins/robot/__init__.py +0 -9
  241. sierra/plugins/robot/turtlebot3/__init__.py +0 -9
  242. sierra/plugins/robot/turtlebot3/plugin.py +0 -194
  243. sierra_research-1.3.11.data/data/share/man/man1/sierra-cli.1 +0 -2349
  244. sierra_research-1.3.11.data/data/share/man/man7/sierra-examples.7 +0 -508
  245. sierra_research-1.3.11.data/data/share/man/man7/sierra-exec-envs.7 +0 -331
  246. sierra_research-1.3.11.data/data/share/man/man7/sierra-glossary.7 +0 -285
  247. sierra_research-1.3.11.data/data/share/man/man7/sierra-platforms.7 +0 -358
  248. sierra_research-1.3.11.data/data/share/man/man7/sierra-usage.7 +0 -729
  249. sierra_research-1.3.11.data/data/share/man/man7/sierra.7 +0 -78
  250. sierra_research-1.3.11.dist-info/METADATA +0 -492
  251. sierra_research-1.3.11.dist-info/RECORD +0 -133
  252. sierra_research-1.3.11.dist-info/top_level.txt +0 -1
  253. {sierra_research-1.3.11.dist-info → sierra_research-1.5.0.dist-info}/entry_points.txt +0 -0
  254. {sierra_research-1.3.11.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
- ]