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