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,317 +0,0 @@
1
- # Copyright 2018 London Lowmanstone, John Harwell, All rights reserved.
2
- #
3
- # SPDX-License-Identifier: MIT
4
- #
5
- """
6
- Classes for generating 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 json
18
-
19
- # Project packages
20
- from sierra.core.graphs.stacked_line_graph import StackedLineGraph
21
- from sierra.core.graphs.heatmap import Heatmap
22
- from sierra.core.models.graphs import IntraExpModel2DGraphSet
23
- import sierra.core.variables.batch_criteria as bc
24
- import sierra.core.plugin_manager as pm
25
- from sierra.core import types, config, utils
26
-
27
-
28
- class BatchIntraExpGraphGenerator:
29
- def __init__(self, cmdopts: types.Cmdopts) -> None:
30
- # Copy because we are modifying it and don't want to mess up the
31
- # arguments for graphs that are generated after us
32
- self.cmdopts = copy.deepcopy(cmdopts)
33
- self.logger = logging.getLogger(__name__)
34
-
35
- def __call__(self,
36
- main_config: types.YAMLDict,
37
- controller_config: types.YAMLDict,
38
- LN_config: types.YAMLDict,
39
- HM_config: types.YAMLDict,
40
- criteria: bc.IConcreteBatchCriteria) -> None:
41
- """Generate all intra-experiment graphs for a :term:`Batch Experiment`.
42
-
43
- Parameters:
44
-
45
- main_config: Parsed dictionary of main YAML configuration
46
-
47
- controller_config: Parsed dictionary of controller YAML
48
- configuration.
49
-
50
- LN_config: Parsed dictionary of intra-experiment linegraph
51
- configuration.
52
-
53
- HM_config: Parsed dictionary of intra-experiment heatmap
54
- configuration.
55
-
56
- criteria: The :term:`Batch Criteria` used for the batch
57
- experiment.
58
-
59
- """
60
- exp_to_gen = utils.exp_range_calc(self.cmdopts,
61
- self.cmdopts['batch_output_root'],
62
- criteria)
63
-
64
- for exp in exp_to_gen:
65
- batch_output_root = pathlib.Path(self.cmdopts["batch_output_root"])
66
- batch_stat_root = pathlib.Path(self.cmdopts["batch_stat_root"])
67
- batch_input_root = pathlib.Path(self.cmdopts["batch_input_root"])
68
- batch_graph_root = pathlib.Path(self.cmdopts["batch_graph_root"])
69
- batch_model_root = pathlib.Path(self.cmdopts["batch_model_root"])
70
-
71
- cmdopts = copy.deepcopy(self.cmdopts)
72
- cmdopts["exp_input_root"] = str(batch_input_root / exp.name)
73
- cmdopts["exp_output_root"] = str(batch_output_root / exp.name)
74
- cmdopts["exp_graph_root"] = str(batch_graph_root / exp.name)
75
- cmdopts["exp_model_root"] = str(batch_model_root / exp.name)
76
- cmdopts["exp_stat_root"] = str(batch_stat_root / exp.name)
77
-
78
- if os.path.isdir(cmdopts["exp_stat_root"]):
79
- generator = pm.module_load_tiered(project=self.cmdopts['project'],
80
- path='pipeline.stage4.intra_exp_graph_generator')
81
- generator.IntraExpGraphGenerator(main_config,
82
- controller_config,
83
- LN_config,
84
- HM_config,
85
- cmdopts)(criteria)
86
- else:
87
- self.logger.warning("Skipping experiment '%s': %s does not exist",
88
- exp,
89
- cmdopts['exp_stat_root'])
90
-
91
-
92
- class IntraExpGraphGenerator:
93
- """Generates graphs from :term:`Averaged .csv` files for a single experiment.
94
-
95
- Which graphs are generated is controlled by YAML configuration files parsed
96
- in :class:`~sierra.core.pipeline.stage4.pipeline_stage4.PipelineStage4`.
97
-
98
- This class can be extended/overriden using a :term:`Project` hook. See
99
- :ref:`ln-sierra-tutorials-project-hooks` for details.
100
-
101
- Attributes:
102
-
103
- cmdopts: Dictionary of parsed cmdline attributes.
104
-
105
- main_config: Parsed dictionary of main YAML configuration
106
-
107
- controller_config: Parsed dictionary of controller YAML
108
- configuration.
109
-
110
- LN_config: Parsed dictionary of intra-experiment linegraph
111
- configuration.
112
-
113
- HM_config: Parsed dictionary of intra-experiment heatmap
114
- configuration.
115
-
116
- criteria: The :term:`Batch Criteria` used for the batch
117
- experiment.
118
-
119
- logger: The handle to the logger for this class. If you extend this
120
- class, you should save/restore this variable in tandem with
121
- overriding it in order to get logging messages have unique logger
122
- names between this class and your derived class, in order to
123
- reduce confusion.
124
-
125
- """
126
-
127
- def __init__(self,
128
- main_config: types.YAMLDict,
129
- controller_config: types.YAMLDict,
130
- LN_config: types.YAMLDict,
131
- HM_config: types.YAMLDict,
132
- cmdopts: types.Cmdopts) -> None:
133
- # Copy because we are modifying it and don't want to mess up the
134
- # arguments for graphs that are generated after us
135
- self.cmdopts = copy.deepcopy(cmdopts)
136
- self.main_config = main_config
137
- self.LN_config = LN_config
138
- self.HM_config = HM_config
139
- self.controller_config = controller_config
140
- self.logger = logging.getLogger(__name__)
141
-
142
- utils.dir_create_checked(self.cmdopts["exp_graph_root"], exist_ok=True)
143
-
144
- def __call__(self, criteria: bc.IConcreteBatchCriteria) -> None:
145
- """
146
- Generate graphs.
147
-
148
- Performs the following steps:
149
-
150
- # . :class:`~sierra.core.pipeline.stage4.intra_exp_graph_generator.LinegraphsGenerator`
151
- to generate linegraphs for each experiment in the batch.
152
-
153
- # . :class:`~sierra.core.pipeline.stage4.intra_exp_graph_generator.HeatmapsGenerator`
154
- to generate heatmaps for each experiment in the batch.
155
- """
156
- LN_targets, HM_targets = self.calc_targets()
157
- self.generate(LN_targets, HM_targets)
158
-
159
- def generate(self,
160
- LN_targets: tp.List[types.YAMLDict],
161
- HM_targets: tp.List[types.YAMLDict]):
162
- if not self.cmdopts['project_no_LN']:
163
- LinegraphsGenerator(self.cmdopts, LN_targets).generate()
164
-
165
- if not self.cmdopts['project_no_HM']:
166
- HeatmapsGenerator(self.cmdopts, HM_targets).generate()
167
-
168
- def calc_targets(self) -> tp.Tuple[tp.List[types.YAMLDict],
169
- tp.List[types.YAMLDict]]:
170
- """Calculate what intra-experiment graphs should be generated.
171
-
172
- Uses YAML configuration for controller and intra-experiment graphs.
173
- Returns a tuple of dictionaries: (intra-experiment linegraphs,
174
- intra-experiment heatmaps) defined what graphs to generate. The enabled
175
- graphs exist in their YAML respective YAML configuration `and` are
176
- enabled by the YAML configuration for the selected controller.
177
-
178
- """
179
- keys = []
180
- for category in list(self.controller_config.keys()):
181
- if category not in self.cmdopts['controller']:
182
- continue
183
- for controller in self.controller_config[category]['controllers']:
184
- if controller['name'] not in self.cmdopts['controller']:
185
- continue
186
-
187
- # valid to specify no graphs, and only to inherit graphs
188
- keys = controller.get('graphs', [])
189
- if 'graphs_inherit' in controller:
190
- for inherit in controller['graphs_inherit']:
191
- keys.extend(inherit) # optional
192
-
193
- # Get keys for enabled graphs
194
- LN_keys = [k for k in self.LN_config if k in keys]
195
- self.logger.debug("Enabled linegraph categories: %s", LN_keys)
196
-
197
- HM_keys = [k for k in self.HM_config if k in keys]
198
- self.logger.debug("Enabled heatmap categories: %s", HM_keys)
199
-
200
- # Strip out all configured graphs which are not enabled
201
- LN_targets = [self.LN_config[k] for k in LN_keys]
202
- HM_targets = [self.HM_config[k] for k in HM_keys]
203
-
204
- return LN_targets, HM_targets
205
-
206
-
207
- class LinegraphsGenerator:
208
- """
209
- Generates linegraphs from :term:`Averaged .csv` files within an experiment.
210
- """
211
-
212
- def __init__(self,
213
- cmdopts: types.Cmdopts,
214
- targets: tp.List[types.YAMLDict]) -> None:
215
- self.cmdopts = cmdopts
216
- self.targets = targets
217
- self.logger = logging.getLogger(__name__)
218
- self.graph_root = pathlib.Path(self.cmdopts['exp_graph_root'])
219
- self.stats_root = pathlib.Path(self.cmdopts['exp_stat_root'])
220
-
221
- def generate(self) -> None:
222
- self.logger.info("Linegraphs from %s", self.cmdopts['exp_stat_root'])
223
-
224
- # For each category of linegraphs we are generating
225
- for category in self.targets:
226
-
227
- # For each graph in each category
228
- for graph in category['graphs']:
229
- output_fpath = self.graph_root / ('SLN-' + graph['dest_stem'] +
230
- config.kImageExt)
231
- try:
232
- self.logger.trace('\n' + # type: ignore
233
- json.dumps(graph, indent=4))
234
- StackedLineGraph(stats_root=self.stats_root,
235
- input_stem=graph['src_stem'],
236
- output_fpath=output_fpath,
237
- stats=self.cmdopts['dist_stats'],
238
- dashstyles=graph.get('dashes', None),
239
- linestyles=graph.get('styles', None),
240
- cols=graph.get('cols', None),
241
- title=graph.get('title', None),
242
- legend=graph.get('legend', None),
243
- xlabel=graph.get('xlabel', None),
244
- ylabel=graph.get('ylabel', None),
245
- logyscale=self.cmdopts['plot_log_yscale'],
246
- large_text=self.cmdopts['plot_large_text']).generate()
247
- except KeyError:
248
- self.logger.fatal(("Could not generate linegraph. "
249
- "Possible reasons include: "))
250
-
251
- self.logger.fatal(("1. The YAML configuration entry is "
252
- "missing required fields"))
253
- missing_cols = graph.get('cols', "MISSING_KEY")
254
- missing_stem = graph.get('src_stem', "MISSING_KEY")
255
- self.logger.fatal(("2. 'cols' is present in YAML "
256
- "configuration but some of %s are "
257
- "missing from %s"),
258
- missing_cols,
259
- missing_stem)
260
-
261
- raise
262
-
263
-
264
- class HeatmapsGenerator:
265
- """
266
- Generates heatmaps from :term:`Averaged .csv` files for a single experiment.
267
- """
268
-
269
- def __init__(self,
270
- cmdopts: types.Cmdopts,
271
- targets: tp.List[types.YAMLDict]) -> None:
272
-
273
- self.exp_stat_root = pathlib.Path(cmdopts['exp_stat_root'])
274
- self.exp_graph_root = pathlib.Path(cmdopts["exp_graph_root"])
275
- self.exp_model_root = pathlib.Path(cmdopts["exp_model_root"])
276
- self.large_text = cmdopts['plot_large_text']
277
-
278
- self.targets = targets
279
- self.logger = logging.getLogger(__name__)
280
-
281
- def generate(self) -> None:
282
- self.logger.info("Heatmaps from %s", self.exp_stat_root)
283
-
284
- # For each category of heatmaps we are generating
285
- for category in self.targets:
286
-
287
- # For each graph in each category
288
- for graph in category['graphs']:
289
- self.logger.trace('\n' + # type: ignore
290
- json.dumps(graph, indent=4))
291
- if IntraExpModel2DGraphSet.model_exists(self.exp_model_root,
292
- graph['src_stem']):
293
- IntraExpModel2DGraphSet(self.exp_stat_root,
294
- self.exp_model_root,
295
- self.exp_graph_root,
296
- graph['src_stem'],
297
- graph.get('title', None)).generate()
298
- else:
299
- input_fpath = self.exp_stat_root / (graph['src_stem'] +
300
- config.kStats['mean'].exts['mean'])
301
- output_fpath = self.exp_graph_root / ('HM-' + graph['src_stem'] +
302
- config.kImageExt)
303
-
304
- Heatmap(input_fpath=input_fpath,
305
- output_fpath=output_fpath,
306
- title=graph.get('title', None),
307
- xlabel='X',
308
- ylabel='Y',
309
- large_text=self.large_text).generate()
310
-
311
-
312
- __api__ = [
313
- 'BatchIntraExpGraphGenerator',
314
- 'IntraExpGraphGenerator',
315
- 'LinegraphsGenerator',
316
- 'HeatmapsGenerator'
317
- ]
@@ -1,168 +0,0 @@
1
- # Copyright 2018 London Lowmanstone, John Harwell, All rights reserved.
2
- #
3
- # SPDX-License-Identifier: MIT
4
- #
5
- """Classes for running project-specific :term:`Models <Model>`.
6
-
7
- """
8
- # Core packages
9
- import copy
10
- import typing as tp
11
- import logging
12
- import pathlib
13
-
14
- # 3rd party packages
15
-
16
- # Project packages
17
- import sierra.core.variables.batch_criteria as bc
18
- from sierra.core import models, types, utils, storage, config
19
-
20
-
21
- class IntraExpModelRunner:
22
- """
23
- Runs all enabled intra-experiment models for all experiments in a batch.
24
- """
25
-
26
- def __init__(self,
27
- cmdopts: types.Cmdopts,
28
- to_run: tp.List[tp.Union[models.interface.IConcreteIntraExpModel1D,
29
- models.interface.IConcreteIntraExpModel2D]]) -> None:
30
- self.cmdopts = cmdopts
31
- self.models = to_run
32
- self.logger = logging.getLogger(__name__)
33
-
34
- def __call__(self,
35
- main_config: types.YAMLDict,
36
- criteria: bc.IConcreteBatchCriteria) -> None:
37
- exp_to_run = utils.exp_range_calc(self.cmdopts,
38
- self.cmdopts['batch_output_root'],
39
- criteria)
40
- exp_dirnames = criteria.gen_exp_names(self.cmdopts)
41
-
42
- for exp in exp_to_run:
43
- self._run_models_in_exp(criteria, exp_dirnames, exp)
44
-
45
- def _run_models_in_exp(self,
46
- criteria: bc.IConcreteBatchCriteria,
47
- exp_dirnames: tp.List[pathlib.Path],
48
- exp: pathlib.Path) -> None:
49
- exp_index = exp_dirnames.index(exp)
50
-
51
- cmdopts = copy.deepcopy(self.cmdopts)
52
- batch_output_root = pathlib.Path(self.cmdopts["batch_output_root"])
53
- batch_stat_root = pathlib.Path(self.cmdopts["batch_stat_root"])
54
- batch_input_root = pathlib.Path(self.cmdopts["batch_input_root"])
55
- batch_graph_root = pathlib.Path(self.cmdopts["batch_graph_root"])
56
- batch_model_root = pathlib.Path(self.cmdopts["batch_model_root"])
57
-
58
- cmdopts["exp0_output_root"] = str(batch_output_root / exp_dirnames[0].name)
59
- cmdopts["exp0_stat_root"] = str(batch_stat_root / exp_dirnames[0].name)
60
-
61
- cmdopts["exp_input_root"] = str(batch_input_root / exp.name)
62
- cmdopts["exp_output_root"] = str(batch_output_root / exp.name)
63
- cmdopts["exp_graph_root"] = str(batch_graph_root / exp.name)
64
- cmdopts["exp_stat_root"] = str(batch_stat_root / exp.name)
65
- cmdopts["exp_model_root"] = str(batch_model_root / exp.name)
66
-
67
- utils.dir_create_checked(cmdopts['exp_model_root'], exist_ok=True)
68
-
69
- for model in self.models:
70
- self._run_model_in_exp(criteria, cmdopts, exp_index, model)
71
-
72
- def _run_model_in_exp(self,
73
- criteria: bc.IConcreteBatchCriteria,
74
- cmdopts: types.Cmdopts,
75
- exp_index: int,
76
- model: tp.Union[models.interface.IConcreteIntraExpModel1D,
77
- models.interface.IConcreteIntraExpModel2D]) -> None:
78
- if not model.run_for_exp(criteria, cmdopts, exp_index):
79
- self.logger.debug("Skip running intra-experiment model from '%s' for exp%s",
80
- str(model),
81
- exp_index)
82
- return
83
-
84
- # Run the model
85
- self.logger.debug("Run intra-experiment model '%s' for exp%s",
86
- str(model),
87
- exp_index)
88
- dfs = model.run(criteria, exp_index, cmdopts)
89
- writer = storage.DataFrameWriter('storage.csv')
90
-
91
- for df, csv_stem in zip(dfs, model.target_csv_stems()):
92
- path_stem = pathlib.Path(cmdopts['exp_model_root']) / csv_stem
93
-
94
- # Write model legend file so the generated graph can find it
95
- with utils.utf8open(path_stem.with_suffix(config.kModelsExt['legend']),
96
- 'w') as f:
97
- for j, search in enumerate(dfs):
98
- if search.values.all() == df.values.all():
99
- legend = model.legend_names()[j]
100
- f.write(legend)
101
- break
102
-
103
- # Write model .csv file
104
- writer(df,
105
- path_stem.with_suffix(config.kModelsExt['model']),
106
- index=False)
107
-
108
-
109
- class InterExpModelRunner:
110
- """
111
- Runs all enabled inter-experiment models in a batch.
112
- """
113
-
114
- def __init__(self,
115
- cmdopts: types.Cmdopts,
116
- to_run: tp.List[models.interface.IConcreteInterExpModel1D]) -> None:
117
- self.cmdopts = cmdopts
118
- self.models = to_run
119
- self.logger = logging.getLogger(__name__)
120
-
121
- def __call__(self,
122
- main_config: types.YAMLDict,
123
- criteria: bc.IConcreteBatchCriteria) -> None:
124
-
125
- cmdopts = copy.deepcopy(self.cmdopts)
126
-
127
- utils.dir_create_checked(
128
- cmdopts['batch_model_root'], exist_ok=True)
129
- utils.dir_create_checked(
130
- cmdopts['batch_graph_collate_root'], exist_ok=True)
131
-
132
- for model in self.models:
133
- if not model.run_for_batch(criteria, cmdopts):
134
- self.logger.debug("Skip running inter-experiment model '%s'",
135
- str(model))
136
- continue
137
-
138
- # Run the model
139
- self.logger.debug("Run inter-experiment model '%s'", str(model))
140
-
141
- dfs = model.run(criteria, cmdopts)
142
-
143
- for df, csv_stem in zip(dfs, model.target_csv_stems()):
144
- path_stem = pathlib.Path(cmdopts['batch_model_root']) / csv_stem
145
-
146
- # Write model .csv file
147
- writer = storage.DataFrameWriter('storage.csv')
148
- writer(df,
149
- path_stem.with_suffix(config.kModelsExt['model']),
150
- index=False)
151
-
152
- # 1D dataframe -> line graph with legend
153
- if len(df.index) == 1:
154
- legend_path = path_stem.with_suffix(config.kModelsExt['legend'])
155
-
156
- # Write model legend file so the generated graph can find it
157
- with utils.utf8open(legend_path, 'w') as f:
158
- for i, search in enumerate(dfs):
159
- if search.values.all() == df.values.all():
160
- legend = model.legend_names()[i]
161
- f.write(legend)
162
- break
163
-
164
-
165
- __api__ = [
166
- 'IntraExpModelRunner',
167
- 'InterExpModelRunner'
168
- ]