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,320 +0,0 @@
1
- # Copyright 2018 John Harwell, All rights reserved.
2
- #
3
- # SPDX-License-Identifier: MIT
4
-
5
-
6
- # Core packages
7
- import multiprocessing as mp
8
- import queue
9
- import typing as tp
10
- import logging
11
- import pathlib
12
- import json
13
-
14
- # 3rd party packages
15
- import pandas as pd
16
- import psutil
17
-
18
- # Project packages
19
- from sierra.core import utils, config, types, storage
20
- import sierra.core.variables.batch_criteria as bc
21
-
22
-
23
- class UnivarGraphCollationInfo():
24
- """Data class of the :term:`Collated .csv` files for a particular graph.
25
-
26
- """
27
-
28
- def __init__(self,
29
- df_ext: str,
30
- ylabels: tp.List[str]) -> None:
31
- self.df_ext = df_ext
32
- self.df = pd.DataFrame(columns=ylabels)
33
- self.all_srcs_exist = True
34
- self.some_srcs_exist = False
35
-
36
-
37
- class BivarGraphCollationInfo():
38
- """Data class of the :term:`Collated .csv` files for a particular graph.
39
-
40
- """
41
-
42
- def __init__(self,
43
- df_ext: str,
44
- xlabels: tp.List[str],
45
- ylabels: tp.List[str]) -> None:
46
- self.df_ext = df_ext
47
- self.ylabels = ylabels
48
- self.xlabels = xlabels
49
- self.df_seq = {} # type: tp.Dict[int, pd.DataFrame]
50
- self.df_all = pd.DataFrame(columns=ylabels, index=xlabels)
51
- self.all_srcs_exist = True
52
- self.some_srcs_exist = False
53
-
54
-
55
- class UnivarGraphCollator:
56
- """For a single graph gather needed data from experiments in a batch.
57
-
58
- Results are put into a single :term:`Collated .csv` file.
59
- """
60
-
61
- def __init__(self,
62
- main_config: types.YAMLDict,
63
- cmdopts: types.Cmdopts) -> None:
64
- self.main_config = main_config
65
- self.cmdopts = cmdopts
66
- self.logger = logging.getLogger(__name__)
67
-
68
- def __call__(self,
69
- criteria,
70
- target: dict,
71
- stat_collate_root: pathlib.Path) -> None:
72
- self.logger.info("Univariate files from batch in %s for graph '%s'...",
73
- self.cmdopts['batch_output_root'],
74
- target['src_stem'])
75
- self.logger.trace(json.dumps(target, indent=4)) # type: ignore
76
-
77
- exp_dirs = utils.exp_range_calc(self.cmdopts,
78
- self.cmdopts['batch_output_root'],
79
- criteria)
80
-
81
- # Always do the mean, even if stats are disabled
82
- stat_config = config.kStats['mean'].exts
83
-
84
- if self.cmdopts['dist_stats'] in ['conf95', 'all']:
85
- stat_config.update(config.kStats['conf95'].exts)
86
-
87
- if self.cmdopts['dist_stats'] in ['bw', 'all']:
88
- stat_config.update(config.kStats['bw'].exts)
89
-
90
- stats = [UnivarGraphCollationInfo(df_ext=suffix,
91
- ylabels=[e.name for e in exp_dirs])
92
- for suffix in stat_config.values()]
93
-
94
- for diri in exp_dirs:
95
- self._collate_exp(target, diri.name, stats)
96
-
97
- writer = storage.DataFrameWriter('storage.csv')
98
- for stat in stats:
99
- if stat.all_srcs_exist:
100
- writer(stat.df,
101
- stat_collate_root / (target['dest_stem'] + stat.df_ext),
102
- index=False)
103
-
104
- elif not stat.all_srcs_exist and stat.some_srcs_exist:
105
- self.logger.warning("Not all experiments in '%s' produced '%s%s'",
106
- self.cmdopts['batch_output_root'],
107
- target['src_stem'],
108
- stat.df_ext)
109
-
110
- def _collate_exp(self,
111
- target: dict,
112
- exp_dir: str,
113
- stats: tp.List[UnivarGraphCollationInfo]) -> None:
114
- exp_stat_root = pathlib.Path(self.cmdopts['batch_stat_root'], exp_dir)
115
-
116
- for stat in stats:
117
- csv_ipath = pathlib.Path(exp_stat_root,
118
- target['src_stem'] + stat.df_ext)
119
- if not utils.path_exists(csv_ipath):
120
- stat.all_srcs_exist = False
121
- continue
122
-
123
- stat.some_srcs_exist = True
124
-
125
- data_df = storage.DataFrameReader('storage.csv')(csv_ipath)
126
-
127
- assert target['col'] in data_df.columns.values, \
128
- "{0} not in columns of {1}".format(target['col'],
129
- target['src_stem'] + stat.df_ext)
130
-
131
- if target.get('summary', False):
132
- stat.df.loc[0, exp_dir] = data_df.loc[data_df.index[-1],
133
- target['col']]
134
- else:
135
- stat.df[exp_dir] = data_df[target['col']]
136
-
137
-
138
- class BivarGraphCollator:
139
- """For a single graph gather needed data from experiments in a batch.
140
-
141
- Results are put into a single :term:`Collated .csv` file.
142
-
143
- """
144
-
145
- def __init__(self,
146
- main_config: types.YAMLDict,
147
- cmdopts: types.Cmdopts) -> None:
148
- self.main_config = main_config
149
- self.cmdopts = cmdopts
150
- self.logger = logging.getLogger(__name__)
151
-
152
- def __call__(self,
153
- criteria: bc.IConcreteBatchCriteria,
154
- target: dict,
155
- stat_collate_root: pathlib.Path) -> None:
156
- self.logger.info("Bivariate files from batch in %s for graph '%s'...",
157
- self.cmdopts['batch_output_root'],
158
- target['src_stem'])
159
- self.logger.trace(json.dumps(target, indent=4)) # type: ignore
160
-
161
- exp_dirs = utils.exp_range_calc(self.cmdopts,
162
- self.cmdopts['batch_output_root'],
163
- criteria)
164
-
165
- xlabels, ylabels = utils.bivar_exp_labels_calc(exp_dirs)
166
-
167
- # Always do the mean, even if stats are disabled
168
- stat_config = config.kStats['mean'].exts
169
-
170
- if self.cmdopts['dist_stats'] in ['conf95', 'all']:
171
- stat_config.update(config.kStats['conf95'].exts)
172
-
173
- if self.cmdopts['dist_stats'] in ['bw', 'all']:
174
- stat_config.update(config.kStats['bw'].exts)
175
-
176
- stats = [BivarGraphCollationInfo(df_ext=suffix,
177
- xlabels=xlabels,
178
- ylabels=ylabels)
179
- for suffix in stat_config.values()]
180
-
181
- for diri in exp_dirs:
182
- self._collate_exp(target, diri.name, stats)
183
-
184
- writer = storage.DataFrameWriter('storage.csv')
185
- for stat in stats:
186
- if stat.all_srcs_exist:
187
- for row, df in stat.df_seq.items():
188
- name = '{0}_{1}{2}'.format(target['dest_stem'],
189
- row,
190
- stat.df_ext)
191
- writer(df,
192
- stat_collate_root / name,
193
- index=False)
194
-
195
- # TODO: Don't write this for now, until I find a better way of
196
- # doing 3D data in CSV files.
197
- # writer(stat.df_all,
198
- # stat_collate_root / (target['dest_stem'] + stat.df_ext),
199
- # index=False)
200
-
201
- elif stat.some_srcs_exist:
202
- self.logger.warning("Not all experiments in '%s' produced '%s%s'",
203
- self.cmdopts['batch_output_root'],
204
- target['src_stem'],
205
- stat.df_ext)
206
-
207
- def _collate_exp(self,
208
- target: dict,
209
- exp_dir: str,
210
- stats: tp.List[BivarGraphCollationInfo]) -> None:
211
- exp_stat_root = pathlib.Path(self.cmdopts['batch_stat_root'], exp_dir)
212
- for stat in stats:
213
- csv_ipath = pathlib.Path(exp_stat_root,
214
- target['src_stem'] + stat.df_ext)
215
-
216
- if not utils.path_exists(csv_ipath):
217
- stat.all_srcs_exist = False
218
- continue
219
-
220
- stat.some_srcs_exist = True
221
-
222
- data_df = storage.DataFrameReader('storage.csv')(csv_ipath)
223
-
224
- assert target['col'] in data_df.columns.values, \
225
- "{0} not in columns of {1}, which has {2}".format(target['col'],
226
- csv_ipath,
227
- data_df.columns)
228
- xlabel, ylabel = exp_dir.split('+')
229
-
230
- # TODO: Don't capture this for now, until I figure out a better way
231
- # to do 3D data.
232
- # stat.df_all.loc[xlabel][ylabel] = data_df[target['col']].to_numpy()
233
-
234
- # We want a 2D dataframe after collation, with one iloc of SOMETHING
235
- # per experiment. If we just join the columns from each experiment
236
- # together into a dataframe like we did for univar criteria, we will
237
- # get a 3D dataframe. Instead, we take the ith row from each column
238
- # in sequence, to generate a SEQUENCE of 2D dataframes.
239
- for row in data_df[target['col']].index:
240
- if row in stat.df_seq.keys():
241
- stat.df_seq[row].loc[xlabel][ylabel] = data_df.loc[row,
242
- target['col']]
243
- else:
244
- df = pd.DataFrame(columns=stat.ylabels, index=stat.xlabels)
245
- df.loc[xlabel][ylabel] = data_df.loc[row, target['col']]
246
- stat.df_seq[row] = df
247
-
248
-
249
- class GraphParallelCollator():
250
- """
251
- Generate :term:`Collated .csv` files from :term:`Summary .csv`.
252
-
253
- """
254
-
255
- def __init__(self,
256
- main_config: types.YAMLDict,
257
- cmdopts: types.Cmdopts) -> None:
258
- self.main_config = main_config
259
- self.cmdopts = cmdopts
260
-
261
- self.batch_stat_collate_root = self.cmdopts['batch_stat_collate_root']
262
- utils.dir_create_checked(self.batch_stat_collate_root, exist_ok=True)
263
-
264
- def __call__(self,
265
- criteria: bc.IConcreteBatchCriteria,
266
- targets: tp.List[types.YAMLDict]) -> None:
267
- q = mp.JoinableQueue() # type: mp.JoinableQueue
268
-
269
- # For each category of graphs we are generating
270
- for category in targets:
271
- # For each graph in each category
272
- for graph in category['graphs']:
273
- q.put(graph)
274
-
275
- if self.cmdopts['processing_serial']:
276
- parallelism = 1
277
- else:
278
- parallelism = psutil.cpu_count()
279
-
280
- for _ in range(0, parallelism):
281
- p = mp.Process(target=GraphParallelCollator._thread_worker,
282
- args=(q,
283
- self.main_config,
284
- self.cmdopts,
285
- self.batch_stat_collate_root,
286
- criteria))
287
- p.start()
288
-
289
- q.join()
290
-
291
- @staticmethod
292
- def _thread_worker(q: mp.Queue,
293
- main_config: types.YAMLDict,
294
- cmdopts: types.Cmdopts,
295
- stat_collate_root: pathlib.Path,
296
- criteria) -> None:
297
-
298
- collator: tp.Union[UnivarGraphCollator, BivarGraphCollator]
299
-
300
- if criteria.is_univar():
301
- collator = UnivarGraphCollator(main_config, cmdopts)
302
- else:
303
- collator = BivarGraphCollator(main_config, cmdopts)
304
-
305
- while True:
306
- # Wait for 3 seconds after the queue is empty before bailing
307
- try:
308
- graph = q.get(True, 3)
309
- collator(criteria, graph, stat_collate_root)
310
- q.task_done()
311
- except queue.Empty:
312
- break
313
-
314
-
315
- __api__ = [
316
- 'UnivarGraphCollator',
317
- 'BivarGraphCollator',
318
- 'UnivarGraphCollationInfo',
319
- 'BivarGraphCollationInfo'
320
- ]
@@ -1,240 +0,0 @@
1
- # Copyright 2018 John Harwell, All rights reserved.
2
- #
3
- # SPDX-License-Identifier: MIT
4
- #
5
-
6
- """
7
- Classes for generating graphs across experiments in a batch.
8
- """
9
-
10
- # Core packages
11
- import copy
12
- import typing as tp
13
- import logging
14
- import pathlib
15
- import glob
16
- import re
17
-
18
- # 3rd party packages
19
- import json
20
-
21
- # Project packages
22
- from sierra.core.graphs.stacked_line_graph import StackedLineGraph
23
- from sierra.core.graphs.summary_line_graph import SummaryLineGraph
24
- from sierra.core.graphs.heatmap import Heatmap
25
- from sierra.core.variables import batch_criteria as bc
26
- from sierra.core import types, config, utils
27
-
28
-
29
- class InterExpGraphGenerator:
30
- """Generates graphs from :term:`Collated .csv` files.
31
-
32
- Which graphs are generated can be controlled by YAML configuration
33
- files parsed in
34
- :class:`~sierra.core.pipeline.stage4.pipeline_stage4.PipelineStage4`.
35
-
36
-
37
- This class can be extended/overriden using a :term:`Project` hook. See
38
- :ref:`ln-sierra-tutorials-project-hooks` for details.
39
-
40
- Attributes:
41
-
42
- cmdopts: Dictionary of parsed cmdline attributes.
43
-
44
- main_config: Parsed dictionary of main YAML configuration
45
-
46
- LN_targets: A list of dictionaries, where each dictionary defines an
47
- inter-experiment linegraph to generate.
48
-
49
- HM_targets: A list of dictionaries, where each dictionary defines an
50
- inter-experiment heatmap to generate.
51
-
52
- logger: The handle to the logger for this class. If you extend this
53
- class, you should save/restore this variable in tandem with
54
- overriding it in order to get logging messages have unique logger
55
- names between this class and your derived class, in order to
56
- reduce confusion.
57
-
58
- """
59
-
60
- def __init__(self,
61
- main_config: types.YAMLDict,
62
- cmdopts: types.Cmdopts,
63
- LN_targets: tp.List[types.YAMLDict],
64
- HM_targets: tp.List[types.YAMLDict]) -> None:
65
- # Copy because we are modifying it and don't want to mess up the
66
- # arguments for graphs that are generated after us
67
- self.cmdopts = copy.deepcopy(cmdopts)
68
- self.main_config = main_config
69
- self.LN_targets = LN_targets
70
- self.HM_targets = HM_targets
71
-
72
- utils.dir_create_checked(self.cmdopts['batch_graph_collate_root'],
73
- exist_ok=True)
74
- self.logger = logging.getLogger(__name__)
75
-
76
- def __call__(self, criteria: bc.IConcreteBatchCriteria) -> None:
77
- """
78
- Generate graphs.
79
-
80
- Performs the following steps:
81
-
82
- # . :class:`~sierra.core.pipeline.stage4.inter_exp_graph_generator.LineGraphsGenerator`
83
- to generate linegraphs (univariate batch criteria only).
84
- """
85
- if criteria.is_univar():
86
- if not self.cmdopts['project_no_LN']:
87
- LineGraphsGenerator(self.cmdopts,
88
- self.LN_targets).generate(criteria)
89
- else:
90
- if not self.cmdopts['project_no_HM']:
91
- HeatmapsGenerator(self.cmdopts,
92
- self.HM_targets).generate(criteria)
93
-
94
-
95
- class LineGraphsGenerator:
96
- """Generates linegraphs from :term:`Collated .csv` files.
97
-
98
- The graphs generated by this class respect the ``--exp-range`` cmdline
99
- option.
100
- """
101
-
102
- def __init__(self,
103
- cmdopts: types.Cmdopts,
104
- targets: tp.List[types.YAMLDict]) -> None:
105
- self.cmdopts = cmdopts
106
- self.targets = targets
107
- self.logger = logging.getLogger(__name__)
108
-
109
- def generate(self, criteria: bc.IConcreteBatchCriteria) -> None:
110
- self.logger.info("LineGraphs from %s",
111
- self.cmdopts['batch_stat_collate_root'])
112
- graph_root = pathlib.Path(self.cmdopts['batch_graph_collate_root'])
113
-
114
- # For each category of linegraphs we are generating
115
- for category in self.targets:
116
-
117
- # For each graph in each category
118
- for graph in category['graphs']:
119
- self.logger.trace('\n' + # type: ignore
120
- json.dumps(graph, indent=4))
121
- if graph.get('summary', False):
122
- self._gen_summary_linegraph(graph, criteria, graph_root)
123
- else:
124
- self._gen_stacked_linegraph(graph, criteria, graph_root)
125
-
126
- def _gen_summary_linegraph(self,
127
- graph: types.YAMLDict,
128
- criteria: bc.IConcreteBatchCriteria,
129
- graph_root: pathlib.Path) -> None:
130
- opath = graph_root / ('SM-' + graph['dest_stem'] + config.kImageExt)
131
-
132
- ln = SummaryLineGraph(stats_root=self.cmdopts['batch_stat_collate_root'],
133
- input_stem=graph['dest_stem'],
134
- output_fpath=opath,
135
- stats=self.cmdopts['dist_stats'],
136
- model_root=self.cmdopts['batch_model_root'],
137
- title=graph['title'],
138
- xlabel=criteria.graph_xlabel(self.cmdopts),
139
- ylabel=graph.get('ylabel', None),
140
- xticks=criteria.graph_xticks(self.cmdopts),
141
- xtick_labels=criteria.graph_xticklabels(
142
- self.cmdopts),
143
- logyscale=self.cmdopts['plot_log_yscale'],
144
- large_text=self.cmdopts['plot_large_text'])
145
- ln.generate()
146
-
147
- def _gen_stacked_linegraph(self,
148
- graph: types.YAMLDict,
149
- criteria: bc.IConcreteBatchCriteria,
150
- graph_root: pathlib.Path) -> None:
151
- opath = graph_root / ('SLN-' + graph['dest_stem'] +
152
- config.kImageExt)
153
-
154
- ln = StackedLineGraph(stats_root=self.cmdopts['batch_stat_collate_root'],
155
- input_stem=graph['dest_stem'],
156
- output_fpath=opath,
157
- stats=self.cmdopts['dist_stats'],
158
- dashstyles=graph.get('dashes', None),
159
- linestyles=graph.get('lines', None),
160
- title=graph['title'],
161
- xlabel=graph.get('xlabel', None),
162
- ylabel=graph.get('ylabel', None),
163
- logyscale=self.cmdopts['plot_log_yscale'],
164
- large_text=self.cmdopts['plot_large_text'])
165
-
166
- ln.generate()
167
-
168
-
169
- class HeatmapsGenerator:
170
- """Generates heatmaps from :term:`Collated .csv` files.
171
-
172
- The graphs generated by this class respect the ``--exp-range`` cmdline
173
- option.
174
- """
175
-
176
- def __init__(self,
177
- cmdopts: types.Cmdopts,
178
- targets: tp.List[types.YAMLDict]) -> None:
179
- self.cmdopts = cmdopts
180
- self.targets = targets
181
- self.logger = logging.getLogger(__name__)
182
- self.stat_root = pathlib.Path(self.cmdopts['batch_stat_collate_root'])
183
- self.graph_root = pathlib.Path(self.cmdopts['batch_graph_collate_root'])
184
-
185
- def generate(self, criteria: bc.IConcreteBatchCriteria) -> None:
186
- self.logger.info("Heatmaps from %s", self.stat_root)
187
-
188
- # For each category of heatmaps we are generating
189
- for category in self.targets:
190
-
191
- # For each graph in each category
192
- for graph in category['graphs']:
193
- self.logger.trace('\n' + # type: ignore
194
- json.dumps(graph, indent=4))
195
-
196
- pattern = str(self.stat_root / (graph['dest_stem'] + "*" +
197
- config.kStats['mean'].exts['mean']))
198
- specs = {}
199
- for f in glob.glob(pattern):
200
- if res := re.search('_[0-9]+', f):
201
- interval = int(res.group(0)[1:])
202
- specs[interval] = pathlib.Path(f)
203
-
204
- for interval, ipath in specs.items():
205
- self._generate_hm(graph, criteria, interval, ipath)
206
-
207
- def _generate_hm(self, graph: types.YAMLDict,
208
- criteria: bc.IConcreteBatchCriteria,
209
- interval: int,
210
- ipath: pathlib.Path) -> None:
211
-
212
- odir = self.graph_root / ("HM-" + graph['dest_stem'])
213
- odir.mkdir(parents=True, exist_ok=True)
214
- opath = odir / ('HM-{0}_{1}{2}'.format(graph['dest_stem'],
215
- interval,
216
- config.kImageExt))
217
-
218
- if title := graph.get('title', None):
219
- title += f" (Interval={interval})"
220
-
221
- hm = Heatmap(input_fpath=ipath,
222
- output_fpath=opath,
223
- title=title,
224
- xlabel=criteria.graph_xlabel(self.cmdopts),
225
- ylabel=criteria.graph_ylabel(self.cmdopts),
226
- transpose=self.cmdopts['plot_transpose_graphs'],
227
- interpolation=graph.get('interpolation', None),
228
- zlabel=graph.get('zlabel', None),
229
- large_text=self.cmdopts['plot_large_text'])
230
-
231
- hm. generate()
232
-
233
-
234
- __api__ = [
235
- 'InterExpGraphGenerator',
236
- 'LineGraphsGenerator',
237
- 'HeatmapsGenerator'
238
-
239
-
240
- ]