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
@@ -1,369 +0,0 @@
1
- # Copyright 2018 John Harwell, All rights reserved.
2
- #
3
- # SPDX-License-Identifier: MIT
4
- #
5
- """
6
- Linegraph for summarizing the results of a batch experiment in different ways.
7
- """
8
-
9
- # Core packages
10
- import typing as tp
11
- import logging
12
- import pathlib
13
-
14
- # 3rd party packages
15
- import matplotlib.ticker as mticker
16
- import matplotlib.pyplot as plt
17
- import pandas as pd
18
-
19
- # Project packages
20
- from sierra.core import config, utils, storage
21
-
22
-
23
- class SummaryLineGraph:
24
- """Generates a linegraph from a :term:`Summary .csv`.
25
-
26
- Possibly shows the 95% confidence interval or box and whisker plots,
27
- according to configuration.
28
-
29
- Attributes:
30
-
31
- stats_root: The absolute path to the ``statistics/`` directory for the
32
- batch experiment.
33
-
34
- input_stem: Stem of the :term:`Summary .csv` file to generate a graph
35
- from.
36
-
37
- output_fpath: The absolute path to the output image file to save
38
- generated graph to.
39
-
40
- title: Graph title.
41
-
42
- xlabel: X-label for graph.
43
-
44
- ylabel: Y-label for graph.
45
-
46
- xticks: The xticks for the graph.
47
-
48
- xtick_labels: The xtick labels for the graph (can be different than the
49
- xticks; e.g., if the xticxs are 1-10 for categorical data,
50
- then then labels would be the categories).
51
-
52
- large_text: Should the labels, ticks, and titles be large, or regular
53
- size?
54
-
55
- legend: Legend for graph.
56
-
57
- logyscale: Should the Y axis be in the log2 domain ?
58
-
59
- stats: The type of statistics to include on the graph (from
60
- ``--dist-stats``).
61
-
62
- model_root: The absolute path to the ``models/`` directory for the batch
63
- experiment.
64
-
65
- """
66
- kLineStyles = ['-', '--', '.-', ':', '-', '--', '.-', ':']
67
- kMarkStyles = ['o', '^', 's', 'x', 'o', '^', 's', 'x']
68
-
69
- def __init__(self,
70
- stats_root: pathlib.Path,
71
- input_stem: str,
72
- output_fpath: pathlib.Path,
73
- title: str,
74
- xlabel: str,
75
- ylabel: str,
76
- xticks: tp.List[float],
77
- xtick_labels: tp.Optional[tp.List[str]] = None,
78
- large_text: bool = False,
79
- legend: tp.List[str] = ['Empirical Data'],
80
- logyscale: bool = False,
81
- stats: str = 'none',
82
- model_root: tp.Optional[pathlib.Path] = None) -> None:
83
-
84
- # Required arguments
85
- self.stats_root = stats_root
86
- self.input_stem = input_stem
87
- self.output_fpath = output_fpath
88
- self.title = title
89
- self.xlabel = xlabel
90
- self.ylabel = ylabel
91
- self.xticks = xticks
92
-
93
- # Optional arguments
94
- if large_text:
95
- self.text_size = config.kGraphTextSizeLarge
96
- else:
97
- self.text_size = config.kGraphTextSizeSmall
98
-
99
- self.xtick_labels = xtick_labels
100
- self.model_root = model_root
101
- self.legend = legend
102
- self.logyscale = logyscale
103
- self.stats = stats
104
-
105
- self.logger = logging.getLogger(__name__)
106
-
107
- def generate(self) -> None:
108
- input_fpath = self.stats_root / (self.input_stem +
109
- config.kStats['mean'].exts['mean'])
110
-
111
- if not utils.path_exists(input_fpath):
112
- self.logger.debug("Not generating %s: %s does not exist",
113
- self.output_fpath,
114
- input_fpath)
115
- return
116
- else:
117
- self.logger.debug("Generating %s from %s",
118
- self.output_fpath,
119
- input_fpath)
120
-
121
- data_dfy = storage.DataFrameReader('storage.csv')(input_fpath)
122
- model = self._read_models()
123
-
124
- fig, ax = plt.subplots()
125
-
126
- # Plot lines
127
- self._plot_lines(data_dfy, model)
128
-
129
- # Add legend
130
- self._plot_legend(model)
131
-
132
- # Add statistics according to configuration
133
- stat_dfs = self._read_stats()
134
- self._plot_stats(ax, self.xticks, data_dfy, stat_dfs)
135
-
136
- # Add X,Y labels
137
- plt.ylabel(self.ylabel, fontsize=self.text_size['xyz_label'])
138
- plt.xlabel(self.xlabel, fontsize=self.text_size['xyz_label'])
139
-
140
- # Add ticks
141
- self._plot_ticks(ax)
142
-
143
- # Add title
144
- plt.title(self.title, fontsize=self.text_size['title'])
145
-
146
- # Output figure
147
- fig = ax.get_figure()
148
- fig.set_size_inches(config.kGraphBaseSize,
149
- config.kGraphBaseSize)
150
- fig.savefig(self.output_fpath, bbox_inches='tight',
151
- dpi=config.kGraphDPI)
152
- # Prevent memory accumulation (fig.clf() does not close everything)
153
- plt.close(fig)
154
-
155
- def _plot_lines(self,
156
- data_dfy: pd.DataFrame,
157
- model: tp.Tuple[pd.DataFrame, tp.List[str]]) -> None:
158
- for i in range(0, len(data_dfy.values)):
159
- assert len(data_dfy.values[i]) == len(self.xticks),\
160
- "Length mismatch between xticks,data: {0} vs {1}/{2} vs {3}".format(
161
- len(self.xticks),
162
- len(data_dfy.values[i]),
163
- self.xticks,
164
- data_dfy.values[i])
165
-
166
- # Plot data
167
- plt.plot(self.xticks,
168
- data_dfy.values[i],
169
- marker=self.kMarkStyles[i],
170
- color=f"C{i}")
171
-
172
- # Plot model prediction(s)
173
- if model[0] is not None:
174
- # The model might be of different dimensions than the data. If
175
- # so, truncate it to fit.
176
- if len(self.xticks) < len(model[0].values[i]):
177
- self.logger.warning("Truncating model: model/data lengths disagree: %s vs. %s",
178
- len(model[0].values[i]),
179
- len(self.xticks))
180
- xvals = model[0].values[i][:len(self.xticks)]
181
- else:
182
- xvals = model[0].values[i]
183
-
184
- plt.plot(self.xticks,
185
- xvals,
186
- '--',
187
- marker=self.kMarkStyles[i],
188
- color="C{}".format(i + len(data_dfy.index)))
189
-
190
- def _plot_stats(self,
191
- ax,
192
- xticks,
193
- data_dfy: pd.DataFrame,
194
- stat_dfs: tp.Dict[str, pd.DataFrame]) -> None:
195
- """
196
- Plot statistics for all lines on the graph.
197
- """
198
- self._plot_conf95_stats(xticks, data_dfy, stat_dfs)
199
- self._plot_bw_stats(ax, xticks, data_dfy, stat_dfs)
200
-
201
- def _plot_conf95_stats(self,
202
- xticks,
203
- data_dfy: pd.DataFrame,
204
- stat_dfs: tp.Dict[str, pd.DataFrame]) -> None:
205
- if self.stats not in ['conf95', 'all']:
206
- return
207
-
208
- if not all(k in stat_dfs.keys() for k in config.kStats['conf95'].exts):
209
- self.logger.warning(("Cannot plot 95%% confidence intervals: "
210
- "missing some statistics: %s vs %s"),
211
- stat_dfs.keys(),
212
- config.kStats['conf95'].exts)
213
- return
214
-
215
- for i in range(0, len(data_dfy.values)):
216
- stddev_i = stat_dfs['stddev'].abs().values[i]
217
- # 95% interval = 2 std stdeviations
218
- plt.fill_between(xticks,
219
- data_dfy.values[i] - 2 * stddev_i,
220
- data_dfy.values[i] + 2 * stddev_i,
221
- alpha=0.25,
222
- color="C{}".format(i),
223
- interpolate=True)
224
-
225
- def _plot_bw_stats(self,
226
- ax,
227
- xticks,
228
- data_dfy: pd.DataFrame,
229
- stat_dfs: tp.Dict[str, pd.DataFrame]) -> None:
230
- if self.stats not in ['bw', 'all']:
231
- return
232
-
233
- if not all(k in stat_dfs.keys() for k in config.kStats['bw'].exts):
234
- self.logger.warning(("Cannot plot box-and-whisker plots: "
235
- "missing some statistics: %s vs %s"),
236
- stat_dfs.keys(),
237
- config.kStats['bw'].exts)
238
- return
239
-
240
- for i in range(0, len(data_dfy.values)):
241
- boxes = []
242
- for j in range(0, len(data_dfy.columns)):
243
- boxes.append({
244
- # Bottom whisker position
245
- 'whislo': stat_dfs['whislo'].iloc[i, j],
246
- # Top whisker position
247
- 'whishi': stat_dfs['whishi'].iloc[i, j],
248
- # First quartile (25th percentile)
249
- 'q1': stat_dfs['q1'].iloc[i, j],
250
- # Median (50th percentile)
251
- 'med': stat_dfs['median'].iloc[i, j],
252
- # Third quartile (75th percentile)
253
- 'q3': stat_dfs['q3'].iloc[i, j],
254
- # Confidence interval lower bound
255
- 'cilo': stat_dfs['cilo'].iloc[i, j],
256
- # Confidence interval upper bound
257
- 'cihi': stat_dfs['cihi'].iloc[i, j],
258
- 'fliers': [] # Ignoring outliers
259
- })
260
- ax.bxp(boxes,
261
- manage_ticks=False,
262
- positions=self.xticks,
263
- shownotches=True)
264
-
265
- def _plot_ticks(self, ax) -> None:
266
- if self.logyscale:
267
- ax.set_yscale('symlog', base=2)
268
- ax.yaxis.set_minor_formatter(mticker.ScalarFormatter())
269
-
270
- # Use scientific or decimal notation--whichever has fewer chars
271
- # ax.yaxis.set_major_formatter(mticker.FormatStrFormatter("%.02g"))
272
-
273
- ax.tick_params(labelsize=self.text_size['tick_label'])
274
-
275
- # For ordered, qualitative data
276
- if self.xtick_labels is not None:
277
- ax.set_xticks(self.xticks)
278
- ax.set_xticklabels(self.xtick_labels, rotation='vertical')
279
-
280
- def _plot_legend(self, model: tp.Tuple[pd.DataFrame, tp.List[str]]) -> None:
281
- legend = self.legend
282
-
283
- if model[1]:
284
- legend = [val for pair in zip(self.legend, model[1])
285
- for val in pair]
286
-
287
- plt.legend(legend,
288
- fontsize=self.text_size['legend_label'],
289
- ncol=max(1, int(len(legend) / 3.0)))
290
-
291
- def _read_stats(self) -> tp.Dict[str, tp.List[pd.DataFrame]]:
292
- dfs = {}
293
-
294
- dfs.update(self._read_conf95_stats())
295
- dfs.update(self._read_bw_stats())
296
-
297
- return dfs
298
-
299
- def _read_conf95_stats(self) -> tp.Dict[str, tp.List[pd.DataFrame]]:
300
- dfs = {}
301
- reader = storage.DataFrameReader('storage.csv')
302
- exts = config.kStats['conf95'].exts
303
-
304
- if self.stats in ['conf95', 'all']:
305
- for k in exts:
306
- ipath = self.stats_root / (self.input_stem + exts[k])
307
-
308
- if utils.path_exists(ipath):
309
- dfs[k] = reader(ipath)
310
- else:
311
- self.logger.warning("%s file not found for '%s'",
312
- exts[k],
313
- self.input_stem)
314
-
315
- return dfs
316
-
317
- def _read_bw_stats(self) -> tp.Dict[str, tp.List[pd.DataFrame]]:
318
- dfs = {}
319
- reader = storage.DataFrameReader('storage.csv')
320
- exts = config.kStats['bw'].exts
321
-
322
- if self.stats in ['bw', 'all']:
323
- for k in exts:
324
- ipath = self.stats_root / (self.input_stem + exts[k])
325
-
326
- if utils.path_exists(ipath):
327
- dfs[k] = reader(ipath)
328
- else:
329
- self.logger.warning("%s file not found for '%s'",
330
- exts[k],
331
- self.input_stem)
332
-
333
- return dfs
334
-
335
- def _read_models(self) -> tp.Tuple[pd.DataFrame, tp.List[str]]:
336
- if self.model_root is None:
337
- return (None, [])
338
-
339
- self.logger.trace("Model root='%s'", # type: ignore
340
- self.model_root)
341
-
342
- exts = config.kModelsExt
343
- modelf = self.model_root / (self.input_stem + exts['model'])
344
- legendf = self.model_root / (self.input_stem + exts['legend'])
345
-
346
- if not utils.path_exists(modelf):
347
- self.logger.trace("No model='%s' found in model root", # type: ignore
348
- modelf)
349
- return (None, [])
350
-
351
- model = storage.DataFrameReader('storage.csv')(modelf)
352
- if utils.path_exists(legendf):
353
- with utils.utf8open(legendf, 'r') as f:
354
- legend = f.read().splitlines()
355
- else:
356
- self.logger.warning("No legend file for model '%s' found",
357
- modelf)
358
- legend = ['Model Prediction']
359
-
360
- self.logger.trace("Loaded model='%s',legend='%s'", # type: ignore
361
- modelf.relative_to(self.model_root),
362
- legendf.relative_to(self.model_root))
363
-
364
- return (model, legend)
365
-
366
-
367
- __api__ = [
368
- 'SummaryLineGraph'
369
- ]
@@ -1,142 +0,0 @@
1
- # Copyright 2020 John Harwell, All rights reserved.
2
- #
3
- # SPDX-License-Identifier: MIT
4
- """Common cmdline classes for the various HPC plugins.
5
-
6
- """
7
-
8
- # Core packages
9
- import argparse
10
- import typing as tp
11
-
12
- # 3rd party packages
13
-
14
- # Project packages
15
- from sierra.core import types, cmdline
16
-
17
-
18
- class HPCCmdline(cmdline.BaseCmdline):
19
- def __init__(self, stages: tp.List[int]) -> None:
20
- self.parser = argparse.ArgumentParser(add_help=False,
21
- allow_abbrev=False)
22
-
23
- self.scaffold_cli()
24
- self.init_cli(stages)
25
-
26
- def scaffold_cli(self) -> None:
27
- desc = ("For platforms which are simulators (and can "
28
- "therefore be run in HPC environments).")
29
- self.hpc = self.parser.add_argument_group('HPC options', desc)
30
-
31
- def init_cli(self, stages: tp.List[int]) -> None:
32
- if 2 in stages:
33
- self.init_stage2()
34
-
35
- def init_stage2(self) -> None:
36
- """Add HPC cmdline options.
37
-
38
- Options may be interpreted differently between :term:`Platforms
39
- <Platform>`, or ignored, depending. These include:
40
-
41
- - ``--exec-jobs-per-node``
42
-
43
- - ``--exec-no-devnull``
44
-
45
- - ``--exec-resume``
46
-
47
- - ``--exec-strict``
48
-
49
- """
50
- self.hpc.add_argument("--exec-jobs-per-node",
51
- help="""
52
-
53
- Specify the maximum number of parallel jobs to run
54
- per allocated node. By default this is computed
55
- from the selected HPC environment for maximum
56
- throughput given the desired ``--n-runs`` and CPUs
57
- per allocated node. However, for some environments
58
- being able to override the computed default can be
59
- useful.
60
-
61
- """ + self.stage_usage_doc([2]),
62
- type=int,
63
- default=None)
64
-
65
- self.hpc.add_argument("--exec-devnull",
66
- help="""
67
-
68
- Redirect ALL output from simulations to
69
- /dev/null. Useful for platform where you can't
70
- disable all INFO messages at compile time, and
71
- don't want to have to grep through lots of
72
- redundant stdout files to see if there were any
73
- errors.
74
-
75
- """ + self.stage_usage_doc([1, 2]),
76
- action='store_true',
77
- dest='exec_devnull',
78
- default=True)
79
-
80
- self.hpc.add_argument("--exec-no-devnull",
81
- help="""
82
-
83
- Don't redirect ALL output from simulations to
84
- /dev/null. Useful for platform where you can't
85
- disable all INFO messages at compile time, and
86
- don't want to have to grep through lots of
87
- redundant stdout files to see if there were any
88
- errors.
89
-
90
- """ + self.stage_usage_doc([1, 2]),
91
- action='store_false',
92
- dest='exec_devnull')
93
-
94
- self.hpc.add_argument("--exec-resume",
95
- help="""
96
-
97
- Resume a batch experiment that was
98
- killed/stopped/etc last time SIERRA was run.
99
-
100
- """ + self.stage_usage_doc([2]),
101
- action='store_true',
102
- default=False)
103
-
104
- self.hpc.add_argument("--exec-strict",
105
- help="""
106
-
107
- If passed, then if any experimental commands fail
108
- during stage 2 SIERRA will exit, rather than try
109
- to keep going and execute the rest of the
110
- experiments.
111
-
112
- Useful for:
113
-
114
- - "Correctness by construction" experiments, where
115
- you know if SIERRA doesn't crash and it makes it
116
- to the end of your batch experiment then none of
117
- the individual experiments crashed.
118
-
119
- - CI pipelines
120
-
121
- """,
122
- action='store_true')
123
-
124
- @staticmethod
125
- def cmdopts_update(cli_args: argparse.Namespace,
126
- cmdopts: types.Cmdopts) -> None:
127
- """Update cmdopts dictionary with the HPC-specific cmdline options.
128
-
129
- """
130
- updates = {
131
- # Multistage
132
- 'exec_devnull': cli_args.exec_devnull,
133
- 'exec_jobs_per_node': cli_args.exec_jobs_per_node,
134
- 'exec_resume': cli_args.exec_resume,
135
- 'exec_strict': cli_args.exec_strict
136
- }
137
- cmdopts.update(updates)
138
-
139
-
140
- __api__ = [
141
- 'HPCCmdline',
142
- ]
@@ -1,87 +0,0 @@
1
- # Copyright 2020 John Harwell, All rights reserved.
2
- #
3
- # SPDX-License-Identifier: MIT
4
- """
5
- Graphs which can always be generated, irrespective of model specifics.
6
-
7
- For example, you can always compare the model value to the empirical value, and
8
- plot the difference as error.
9
- """
10
- # Core packages
11
- import pathlib
12
-
13
- # 3rd party packages
14
-
15
- # Project packages
16
- from sierra.core.graphs.heatmap import HeatmapSet
17
- from sierra.core import utils, config, storage
18
-
19
-
20
- class IntraExpModel2DGraphSet():
21
- """
22
- Generates 4 :class:`~sierra.core.graphs.heatmap.Heatmap` plots.
23
-
24
- - One for the empirical data
25
- - One for the stddev of the empirical data
26
- - One for the model prediction
27
- - One for the difference between the model and the empirical data
28
- """
29
- @staticmethod
30
- def model_exists(exp_model_root: pathlib.Path, target_stem: str):
31
- leaf = target_stem + config.kModelsExt['model']
32
- return utils.path_exists(exp_model_root / leaf)
33
-
34
- def __init__(self,
35
- exp_stat_root: pathlib.Path,
36
- exp_model_root: pathlib.Path,
37
- exp_graph_root: pathlib.Path,
38
- target_stem: str,
39
- target_title: str,
40
- **kwargs):
41
- self.exp_stat_root = exp_stat_root
42
- self.exp_model_root = exp_model_root
43
- self.exp_graph_root = exp_graph_root
44
- self.target_stem = target_stem
45
- self.target_title = target_title
46
- self.kwargs = kwargs
47
-
48
- def generate(self):
49
- stat_path = self.exp_stat_root / self.target_stem
50
- graph_path = self.exp_graph_root / self.target_stem
51
- model_path = self.exp_model_root / self.target_stem
52
-
53
- data_ipath = stat_path.with_suffix(config.kStats['mean'].exts['mean'])
54
-
55
- data_opath = self.exp_graph_root / \
56
- (self.target_stem + '-HM').with_suffix(config.kImageExt)
57
-
58
- stddev_ipath = stat_path.with_suffix(config.kStats['conf95'].exts['stddev'])
59
- stddev_opath = graph_path.with_name(
60
- self.target_stem + '-HM-stddev' + config.kImageExt)
61
-
62
- model_ipath = model_path.with_suffix(config.kModelsExt['model'])
63
- model_opath = graph_path.with_name(
64
- self.target_stem + '-HM-model' + config.kImageExt)
65
-
66
- model_error_ipath = model_path.with_name(
67
- self.target_stem + '-HM-model-error' + config.kStats['mean'].exts['mean'])
68
- model_error_opath = model_path.with_name(
69
- self.target_stem + '-HM-model-error' + config.kImageExt)
70
-
71
- # Write the error .csv to the filesystem
72
- reader = storage.DataFrameReader('storage.csv')
73
- writer = storage.DataFrameWriter('storage.csv')
74
- data_df = reader(data_ipath)
75
- model_df = reader(model_ipath)
76
- writer(model_df - data_df, model_error_ipath, index=False)
77
-
78
- HeatmapSet(ipaths=[data_ipath, stddev_ipath, model_ipath, model_error_ipath],
79
- opaths=[data_opath, stddev_opath,
80
- model_opath, model_error_opath],
81
- titles=[self.target_title,
82
- self.target_title + ' (Stddev)',
83
- self.target_title + ' (Model)',
84
- self.target_title + ' (Model Error)'],
85
- xlabel='X',
86
- ylabel='Y',
87
- **self.kwargs).generate()