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.
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.6.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 -249
  191. sierra/core/graphs/stacked_surface_graph.py +0 -220
  192. sierra/core/graphs/summary_line_graph.py +0 -369
  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 -319
  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.6.data/data/share/man/man1/sierra-cli.1 +0 -2349
  244. sierra_research-1.3.6.data/data/share/man/man7/sierra-examples.7 +0 -488
  245. sierra_research-1.3.6.data/data/share/man/man7/sierra-exec-envs.7 +0 -331
  246. sierra_research-1.3.6.data/data/share/man/man7/sierra-glossary.7 +0 -285
  247. sierra_research-1.3.6.data/data/share/man/man7/sierra-platforms.7 +0 -358
  248. sierra_research-1.3.6.data/data/share/man/man7/sierra-usage.7 +0 -725
  249. sierra_research-1.3.6.data/data/share/man/man7/sierra.7 +0 -78
  250. sierra_research-1.3.6.dist-info/METADATA +0 -500
  251. sierra_research-1.3.6.dist-info/RECORD +0 -133
  252. sierra_research-1.3.6.dist-info/top_level.txt +0 -1
  253. {sierra_research-1.3.6.dist-info → sierra_research-1.5.0.dist-info}/entry_points.txt +0 -0
  254. {sierra_research-1.3.6.dist-info → sierra_research-1.5.0.dist-info/licenses}/LICENSE +0 -0
@@ -0,0 +1,202 @@
1
+ # Copyright 2018 London Lowmanstone, John Harwell, All rights reserved.
2
+ #
3
+ # SPDX-License-Identifier: MIT
4
+ #
5
+ """
6
+ Generate graphs within a single :term:`Experiment`.
7
+ """
8
+
9
+ # Core packages
10
+ import os
11
+ import copy
12
+ import typing as tp
13
+ import logging
14
+ import pathlib
15
+
16
+ # 3rd party packages
17
+ import yaml
18
+
19
+ # Project packages
20
+
21
+ import sierra.core.plugin as pm
22
+ from sierra.core import types, utils, batchroot, exproot, config
23
+ from sierra.plugins.prod.graphs import intra
24
+ from sierra.core.variables import batch_criteria as bc
25
+
26
+
27
+ _logger = logging.getLogger(__name__)
28
+
29
+
30
+ def proc_batch_exp(
31
+ main_config: types.YAMLDict,
32
+ cmdopts: types.Cmdopts,
33
+ pathset: batchroot.PathSet,
34
+ criteria: bc.XVarBatchCriteria,
35
+ ) -> None:
36
+ """
37
+ Generate intra-experiment graphs for a :term:`Batch Experiment`.
38
+
39
+ Arguments:
40
+ main_config: Parsed dictionary of main YAML configuration
41
+
42
+
43
+ criteria: The :term:`Batch Criteria` used for the batch
44
+ experiment.
45
+ """
46
+ info = criteria.graph_info(cmdopts, batch_output_root=pathset.output_root)
47
+ exp_to_gen = utils.exp_range_calc(
48
+ cmdopts["exp_range"], pathset.output_root, info.exp_names
49
+ )
50
+
51
+ if not exp_to_gen:
52
+ return
53
+
54
+ loader = pm.module_load_tiered(project=cmdopts["project"], path="pipeline.yaml")
55
+
56
+ graphs_config = loader.load_config(cmdopts, config.kYAML.graphs)
57
+
58
+ if "intra-exp" not in graphs_config:
59
+ _logger.warning(
60
+ "Cannot generate graphs: 'intra-exp' key not found in YAML config"
61
+ )
62
+ return
63
+
64
+ project_config_root = pathlib.Path(cmdopts["project_config_root"])
65
+ controllers_yaml = project_config_root / config.kYAML.controllers
66
+
67
+ if controllers_yaml.exists():
68
+ with utils.utf8open(controllers_yaml) as f:
69
+ controller_config = yaml.load(f, yaml.FullLoader)
70
+ else:
71
+ controller_config = None
72
+
73
+ generator = IntraExpGraphGenerator(
74
+ main_config, controller_config, graphs_config["intra-exp"], cmdopts
75
+ )
76
+ for exp in exp_to_gen:
77
+ exproots = exproot.PathSet(pathset, exp.name)
78
+
79
+ if os.path.isdir(exproots.stat_root):
80
+ generator(exproots)
81
+ else:
82
+ _logger.warning(
83
+ "Skipping experiment '%s': %s does not exist, or isn't a directory",
84
+ exp,
85
+ exproots.stat_root,
86
+ )
87
+
88
+
89
+ class IntraExpGraphGenerator:
90
+ """Generates graphs from :term:`Processed Output Data` files.
91
+
92
+ Which graphs are generated is controlled by YAML configuration files parsed
93
+ in stage 4.
94
+
95
+ Attributes:
96
+ cmdopts: Dictionary of parsed cmdline attributes.
97
+
98
+ main_config: Parsed dictionary of main YAML configuration
99
+
100
+ controller_config: Parsed dictionary of controller YAML
101
+ configuration.
102
+
103
+ graphs_config: Parsed dictionary of intra-experiment graph
104
+ configuration.
105
+
106
+ logger: The handle to the logger for this class. If you extend this
107
+ class, you should save/restore this variable in tandem with
108
+ overriding it in order to get logging messages have unique logger
109
+ names between this class and your derived class, in order to
110
+ reduce confusion.
111
+
112
+ """
113
+
114
+ def __init__(
115
+ self,
116
+ main_config: types.YAMLDict,
117
+ controller_config: tp.Optional[types.YAMLDict],
118
+ graphs_config: types.YAMLDict,
119
+ cmdopts: types.Cmdopts,
120
+ ) -> None:
121
+ # Copy because we are modifying it and don't want to mess up the
122
+ # arguments for graphs that are generated after us
123
+ self.cmdopts = copy.deepcopy(cmdopts)
124
+ self.main_config = main_config
125
+ self.graphs_config = graphs_config
126
+ self.controller_config = controller_config
127
+ self.logger = logging.getLogger(__name__)
128
+
129
+ def __call__(self, pathset: exproot.PathSet) -> None:
130
+ """
131
+ Generate graphs.
132
+
133
+ Performs the following steps:
134
+
135
+ #. :func:`~sierra.plugins.prod.graphs.intra.line.generate()`
136
+ to generate linegraphs for each experiment in the batch.
137
+
138
+ #. :func:`~sierra.plugins.prod.graphs.intra.heatmap.generate()`
139
+ to generate heatmaps for each experiment in the batch.
140
+ """
141
+ utils.dir_create_checked(pathset.graph_root, exist_ok=True)
142
+
143
+ LN_targets, HM_targets = self._calc_targets()
144
+
145
+ if not self.cmdopts["project_no_LN"]:
146
+ intra.line.generate(self.cmdopts, pathset, LN_targets)
147
+
148
+ if not self.cmdopts["project_no_HM"]:
149
+ intra.heatmap.generate(self.cmdopts, pathset, HM_targets)
150
+
151
+ def _calc_targets(
152
+ self,
153
+ ) -> tp.Tuple[tp.List[types.YAMLDict], tp.List[types.YAMLDict]]:
154
+ """Calculate what intra-experiment graphs should be generated.
155
+
156
+ Uses YAML configuration for controller and intra-experiment graphs.
157
+ Returns a tuple of dictionaries: (intra-experiment linegraphs,
158
+ intra-experiment heatmaps) defined what graphs to generate. The enabled
159
+ graphs exist in their respective YAML configuration *and* are enabled by
160
+ the YAML configuration for the selected controller.
161
+ """
162
+ keys = []
163
+ if self.controller_config:
164
+ for category in list(self.controller_config.keys()):
165
+ if category not in self.cmdopts["controller"]:
166
+ continue
167
+ for controller in self.controller_config[category]["controllers"]:
168
+ if controller["name"] not in self.cmdopts["controller"]:
169
+ continue
170
+
171
+ # valid to specify no graphs, and only to inherit graphs
172
+ keys = controller.get("graphs", [])
173
+ if "graphs_inherit" in controller:
174
+ for inherit in controller["graphs_inherit"]:
175
+ keys.extend(inherit) # optional
176
+
177
+ else:
178
+ keys = list(k for k in self.graphs_config)
179
+ self.logger.warning(
180
+ "Missing controller graph config--generating all enabled "
181
+ "intra-experiment graphs for all controllers: %s",
182
+ keys,
183
+ )
184
+
185
+ # Get keys for enabled graphs
186
+ LN_keys = [k for k in self.graphs_config if k in keys]
187
+ self.logger.debug("Enabled linegraph categories: %s", LN_keys)
188
+
189
+ HM_keys = [k for k in self.graphs_config if k in keys]
190
+ self.logger.debug("Enabled heatmap categories: %s", HM_keys)
191
+
192
+ # Strip out all configured graphs which are not enabled
193
+ LN_targets = [self.graphs_config[k] for k in LN_keys]
194
+ HM_targets = [self.graphs_config[k] for k in HM_keys]
195
+
196
+ return LN_targets, HM_targets
197
+
198
+
199
+ __all__ = [
200
+ "proc_batch_exp",
201
+ "IntraExpGraphGenerator",
202
+ ]
@@ -0,0 +1,74 @@
1
+ #
2
+ # Copyright 2024 John Harwell, All rights reserved.
3
+ #
4
+ # SPDX-License Identifier: MIT
5
+ #
6
+ """Generate heatmaps within a single :term:`Experiment`."""
7
+
8
+ # Core packages
9
+ import typing as tp
10
+ import logging
11
+
12
+ # 3rd party packages
13
+ import json
14
+
15
+ # Project packages
16
+ from sierra.core import types, exproot, graphs
17
+
18
+ _logger = logging.getLogger(__name__)
19
+
20
+
21
+ def generate(
22
+ cmdopts: types.Cmdopts,
23
+ pathset: exproot.PathSet,
24
+ targets: tp.List[types.YAMLDict],
25
+ ) -> None:
26
+ """
27
+ Generate heatmaps from: term:`Processed Output Data` files.
28
+ """
29
+ large_text = cmdopts["plot_large_text"]
30
+
31
+ _logger.info(
32
+ "Heatmaps from <batch_root>/%s", pathset.stat_root.relative_to(pathset.parent)
33
+ )
34
+
35
+ # For each category of heatmaps we are generating
36
+ for category in targets:
37
+
38
+ # For each graph in each category
39
+ for graph in category:
40
+ # Only try to create heatmaps (duh)
41
+ if graph["type"] != "heatmap":
42
+ continue
43
+
44
+ _logger.trace("\n" + json.dumps(graph, indent=4)) # type: ignore
45
+
46
+ graph_pathset = graphs.PathSet(
47
+ input_root=pathset.stat_root,
48
+ output_root=pathset.graph_root,
49
+ batchroot=pathset.parent.parent,
50
+ model_root=None,
51
+ )
52
+ # 2025-06-05 [JRH]: We always write stage {3,4} output data files as
53
+ # .csv because that is currently SIERRA's 'native' format; this may
54
+ # change in the future.
55
+ graphs.heatmap(
56
+ pathset=graph_pathset,
57
+ input_stem=graph["src_stem"],
58
+ output_stem=graph["dest_stem"],
59
+ medium="storage.csv",
60
+ title=graph.get("title", None),
61
+ xlabel=graph.get("xlabel", None),
62
+ ylabel=graph.get("ylabel", None),
63
+ zlabel=graph.get("zlabel", None),
64
+ backend=graph.get("backend", cmdopts["graphs_backend"]),
65
+ colnames=(
66
+ graph.get("x", "x"),
67
+ graph.get("y", "y"),
68
+ graph.get("z", "z"),
69
+ ),
70
+ large_text=large_text,
71
+ )
72
+
73
+
74
+ __all__ = ["generate"]
@@ -0,0 +1,114 @@
1
+ #
2
+ # Copyright 2024 John Harwell, All rights reserved.
3
+ #
4
+ # SPDX-License Identifier: MIT
5
+ #
6
+ """Generate linegraphs within a single :term:`Experiment`."""
7
+
8
+ # Core packages
9
+ import typing as tp
10
+ import logging
11
+
12
+ # 3rd party packages
13
+ import json
14
+ import numpy as np
15
+
16
+ # Project packages
17
+ from sierra.core import types, exproot, graphs, config
18
+ from sierra.core import plugin as pm
19
+
20
+ _logger = logging.getLogger(__name__)
21
+
22
+
23
+ def generate(
24
+ cmdopts: types.Cmdopts, pathset: exproot.PathSet, targets: tp.List[types.YAMLDict]
25
+ ) -> None:
26
+ """
27
+ Generate linegraphs from: term:`Processed Output Data` files.
28
+ """
29
+
30
+ _logger.info(
31
+ "Linegraphs from <batch_root>/%s", pathset.stat_root.relative_to(pathset.parent)
32
+ )
33
+
34
+ # For each category of linegraphs we are generating
35
+ for category in targets:
36
+ # For each graph in each category
37
+ for graph in category:
38
+
39
+ # Only try to create linegraphs (duh)
40
+ if graph["type"] != "stacked_line":
41
+ continue
42
+
43
+ _logger.trace("\n" + json.dumps(graph, indent=4)) # type: ignore
44
+
45
+ paths = graphs.PathSet(
46
+ input_root=pathset.stat_root,
47
+ output_root=pathset.graph_root,
48
+ batchroot=pathset.parent.parent,
49
+ model_root=pathset.model_root,
50
+ )
51
+
52
+ try:
53
+ # 2025-06-05 [JRH]: We always write stage {3,4} output data
54
+ # files as .csv because that is currently SIERRA's 'native'
55
+ # format; this may change in the future.
56
+ module = pm.pipeline.get_plugin_module(cmdopts["engine"])
57
+ if hasattr(module, "expsetup_from_def"):
58
+ module2 = pm.pipeline.get_plugin_module(cmdopts["expdef"])
59
+ pkl_def = module2.unpickle(pathset.input_root / config.kPickleLeaf)
60
+
61
+ info = module.expsetup_from_def(pkl_def)
62
+ xticks = np.linspace(
63
+ 0,
64
+ info["duration"],
65
+ int(
66
+ info["duration"]
67
+ * info["n_ticks_per_sec"]
68
+ * cmdopts["exp_n_datapoints_factor"]
69
+ ),
70
+ )
71
+ else:
72
+ xticks = None
73
+
74
+ graphs.stacked_line(
75
+ paths=paths,
76
+ input_stem=graph["src_stem"],
77
+ output_stem=graph["dest_stem"],
78
+ medium="storage.csv",
79
+ backend=graph.get("backend", cmdopts["graphs_backend"]),
80
+ xticks=xticks,
81
+ stats=cmdopts["dist_stats"],
82
+ cols=graph.get("cols", None),
83
+ title=graph.get("title", ""),
84
+ legend=graph.get("legend", graph.get("cols", None)),
85
+ xlabel=graph.get("xlabel", ""),
86
+ ylabel=graph.get("ylabel", ""),
87
+ points=graph.get("points", False),
88
+ logyscale=graph.get("logy", cmdopts["plot_log_yscale"]),
89
+ large_text=cmdopts["plot_large_text"],
90
+ )
91
+ except KeyError:
92
+ _logger.fatal(
93
+ ("Could not generate linegraph. Possible reasons include: ")
94
+ )
95
+
96
+ _logger.fatal(
97
+ ("1. The YAML configuration entry is missing required fields")
98
+ )
99
+ missing_cols = graph.get("cols", "MISSING_KEY")
100
+ missing_stem = graph.get("src_stem", "MISSING_KEY")
101
+ _logger.fatal(
102
+ (
103
+ "2. 'cols' is present in YAML "
104
+ "configuration but some of %s are "
105
+ "missing from %s"
106
+ ),
107
+ missing_cols,
108
+ missing_stem,
109
+ )
110
+
111
+ raise
112
+
113
+
114
+ __all__ = ["generate"]
@@ -0,0 +1,103 @@
1
+ #
2
+ # Copyright 2025 John Harwell, All rights reserved.
3
+ #
4
+ # SPDX-License Identifier: MIT
5
+ #
6
+
7
+ # Core packages
8
+ import logging
9
+ import pathlib
10
+ import time
11
+ import datetime
12
+
13
+ # 3rd party packages
14
+ import yaml
15
+
16
+ # Project packages
17
+ import sierra.core.variables.batch_criteria as bc
18
+ from sierra.core import types, config, utils, batchroot
19
+
20
+ from sierra.plugins.prod.graphs import inter, intra, collate
21
+
22
+ _logger = logging.getLogger(__name__)
23
+
24
+
25
+ def proc_batch_exp(
26
+ main_config: types.YAMLDict,
27
+ cmdopts: types.Cmdopts,
28
+ pathset: batchroot.PathSet,
29
+ criteria: bc.XVarBatchCriteria,
30
+ ) -> None:
31
+ """
32
+ Generate graphs from the :term:`Batch Experiment`.
33
+
34
+ Intra-experiment graph generation: if intra-experiment graphs should be
35
+ generated, according to configuration, the following is run:
36
+
37
+ #. :py:func:`~sierra.plugins.prod.graphs.intra.generate` to
38
+ generate graphs for each experiment in the batch, or a subset.
39
+
40
+ Inter-experiment graph generation: if inter-experiment graphs should be
41
+ generated according to cmdline configuration, the following is run:
42
+
43
+ #. :class:`~sierra.plugins.prod.graphs.collate.GraphCollator`.
44
+
45
+ #. :py:func:`~sierra.plugins.prod.graphs.inter.generate` to perform
46
+ graph generation from collated CSV files.
47
+ """
48
+ graphs_path = pathlib.Path(cmdopts["project_config_root"]) / pathlib.Path(
49
+ config.kYAML.graphs
50
+ )
51
+ if utils.path_exists(graphs_path):
52
+ _logger.info("Loading graphs config for project=%s", cmdopts["project"])
53
+ graphs_config = yaml.load(utils.utf8open(graphs_path), yaml.FullLoader)
54
+ else:
55
+ _logger.warning("%s does not exist--cannot generate graphs", graphs_path)
56
+ return
57
+
58
+ if (
59
+ (cmdopts["exp_graphs"] == "all" or cmdopts["exp_graphs"] == "intra")
60
+ and graphs_config is not None
61
+ and "intra-exp" in graphs_config
62
+ ):
63
+ _logger.info("Generating intra-experiment graphs...")
64
+ start = time.time()
65
+ intra.generate.proc_batch_exp(
66
+ main_config,
67
+ cmdopts,
68
+ pathset,
69
+ criteria,
70
+ )
71
+ elapsed = int(time.time() - start)
72
+ sec = datetime.timedelta(seconds=elapsed)
73
+ _logger.info("Intra-experiment graph generation complete: %s", str(sec))
74
+
75
+ # Collation must be after intra-experiment graph generation, so that all
76
+ # .csv files to be collated have been generated/modified according to
77
+ # parameters.
78
+ if (
79
+ (cmdopts["exp_graphs"] == "all" or cmdopts["exp_graphs"] == "inter")
80
+ and graphs_config is not None
81
+ and "inter-exp" in graphs_config
82
+ ):
83
+ if not cmdopts["skip_collate"]:
84
+ _logger.info("Collating inter-experiment files...")
85
+ start = time.time()
86
+ collate.proc_batch_exp(main_config, cmdopts, pathset, criteria)
87
+ elapsed = int(time.time() - start)
88
+ sec = datetime.timedelta(seconds=elapsed)
89
+ _logger.info("Collating inter-experiment files complete: %s", str(sec))
90
+
91
+ _logger.info("Generating inter-experiment graphs...")
92
+ start = time.time()
93
+
94
+ inter.generate.proc_batch_exp(
95
+ main_config,
96
+ cmdopts,
97
+ pathset,
98
+ criteria,
99
+ )
100
+ elapsed = int(time.time() - start)
101
+ sec = datetime.timedelta(seconds=elapsed)
102
+
103
+ _logger.info("Inter-experiment graph generation complete: %s", str(sec))
@@ -0,0 +1,63 @@
1
+ #
2
+ # Copyright 2025 John Harwell, All rights reserved.
3
+ #
4
+ # SPDX-License Identifier: MIT
5
+ #
6
+
7
+ # Core packages
8
+ import typing as tp
9
+ import logging
10
+
11
+ # 3rd party packages
12
+
13
+ # Project packages
14
+ from sierra.core import types
15
+
16
+ _logger = logging.getLogger(__name__)
17
+
18
+
19
+ def inter_exp_calc(
20
+ loaded_graphs: types.YAMLDict,
21
+ controller_config: tp.Optional[types.YAMLDict],
22
+ cmdopts: types.Cmdopts,
23
+ ) -> tp.List[types.YAMLDict]:
24
+ """Calculate what inter-experiment graphs to generate.
25
+
26
+ This also defines what CSV files need to be collated, as one graph is
27
+ always generated from one CSV file. Uses YAML configuration for
28
+ controllers and inter-experiment graphs.
29
+
30
+ """
31
+ keys = []
32
+
33
+ if controller_config:
34
+ for category in list(controller_config.keys()):
35
+ if category not in cmdopts["controller"]:
36
+ continue
37
+ for controller in controller_config[category]["controllers"]:
38
+ if dict(controller)["name"] not in cmdopts["controller"]:
39
+ continue
40
+
41
+ # valid to specify no graphs, and only to inherit graphs
42
+ keys = controller.get("graphs", [])
43
+ if "graphs_inherit" in controller:
44
+ for inherit in dict(controller)["graphs_inherit"]:
45
+ keys.extend(inherit) # optional
46
+ _logger.debug("Loaded %s inter-experiment categories: %s", len(keys), keys)
47
+ else:
48
+ keys = list(k for k in loaded_graphs)
49
+ _logger.debug(
50
+ "Missing controller graph config--generating all "
51
+ "inter-experiment graphs for all controllers: %s",
52
+ keys,
53
+ )
54
+
55
+ filtered_keys = [k for k in loaded_graphs if k in keys]
56
+ targets = [loaded_graphs[k] for k in filtered_keys]
57
+
58
+ _logger.debug(
59
+ "Enabled %s inter-experiment categories: %s",
60
+ len(filtered_keys),
61
+ filtered_keys,
62
+ )
63
+ return targets
@@ -0,0 +1,18 @@
1
+ #
2
+ # Copyright 2024 John Harwell, All rights reserved.
3
+ #
4
+ # SPDX-License Identifier: MIT
5
+ #
6
+ """
7
+ Container module for rendering in stage 4.
8
+ """
9
+
10
+ # Core packages
11
+
12
+ # 3rd party packages
13
+
14
+ # Project packages
15
+
16
+
17
+ def sierra_plugin_type() -> str:
18
+ return "pipeline"
@@ -0,0 +1,72 @@
1
+ #
2
+ # Copyright 2025 John Harwell, All rights reserved.
3
+ #
4
+ # SPDX-License Identifier: MIT
5
+ #
6
+
7
+ # Core packages
8
+ import typing as tp
9
+ import argparse
10
+
11
+ # 3rd party packages
12
+
13
+ # Project packages
14
+ from sierra.core import types
15
+ from sierra.plugins import PluginCmdline
16
+
17
+
18
+ def build(
19
+ parents: tp.List[argparse.ArgumentParser], stages: tp.List[int]
20
+ ) -> PluginCmdline:
21
+ """
22
+ Get a cmdline parser supporting the ``prod.render`` product plugin.
23
+ """
24
+ cmdline = PluginCmdline(parents, stages)
25
+ cmdline.stage4.add_argument(
26
+ "--render-cmd-opts",
27
+ help="""
28
+ Specify the :program:`ffmpeg` options to appear between the
29
+ specification of the input image files and the specification of
30
+ the output file. The default is suitable for use with ARGoS
31
+ frame grabbing set to a frames size of 1600x1200 to output a
32
+ reasonable quality video.
33
+ """
34
+ + cmdline.stage_usage_doc([4]),
35
+ default="-r 10 -s:v 800x600 -c:v libx264 -crf 25 -filter:v scale=-2:956 -pix_fmt yuv420p",
36
+ )
37
+
38
+ cmdline.stage4.add_argument(
39
+ "--project-rendering",
40
+ help="""
41
+ Enable generation of videos from imagized CSV files created as
42
+ a result of running the ``proc.imagize`` plugin. See
43
+ :ref:`plugins/prod/render` for details.
44
+ """
45
+ + cmdline.stage_usage_doc([4]),
46
+ action="store_true",
47
+ )
48
+
49
+ cmdline.stage4.add_argument(
50
+ "--bc-rendering",
51
+ help="""
52
+ Enable generation of videos from generated graphs, such as
53
+ heatmaps. Bivariate batch criteria only.
54
+
55
+ .. versionadded:: 1.2.20
56
+ """
57
+ + cmdline.stage_usage_doc([4]),
58
+ action="store_true",
59
+ )
60
+ return cmdline
61
+
62
+
63
+ def to_cmdopts(args: argparse.Namespace) -> types.Cmdopts:
64
+ return {
65
+ "render_cmd_opts": args.render_cmd_opts,
66
+ "project_rendering": args.project_rendering,
67
+ "bc_rendering": args.bc_rendering,
68
+ }
69
+
70
+
71
+ def sphinx_cmdline_stage4():
72
+ return build([], [4]).parser