sierra-research 1.3.6__py3-none-any.whl → 1.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. sierra/__init__.py +3 -3
  2. sierra/core/__init__.py +3 -3
  3. sierra/core/batchroot.py +223 -0
  4. sierra/core/cmdline.py +681 -1057
  5. sierra/core/compare.py +11 -0
  6. sierra/core/config.py +96 -88
  7. sierra/core/engine.py +306 -0
  8. sierra/core/execenv.py +380 -0
  9. sierra/core/expdef.py +11 -0
  10. sierra/core/experiment/__init__.py +1 -0
  11. sierra/core/experiment/bindings.py +150 -101
  12. sierra/core/experiment/definition.py +414 -245
  13. sierra/core/experiment/spec.py +83 -85
  14. sierra/core/exproot.py +44 -0
  15. sierra/core/generators/__init__.py +10 -0
  16. sierra/core/generators/experiment.py +528 -0
  17. sierra/core/generators/generator_factory.py +138 -137
  18. sierra/core/graphs/__init__.py +23 -0
  19. sierra/core/graphs/bcbridge.py +94 -0
  20. sierra/core/graphs/heatmap.py +245 -324
  21. sierra/core/graphs/pathset.py +27 -0
  22. sierra/core/graphs/schema.py +77 -0
  23. sierra/core/graphs/stacked_line.py +341 -0
  24. sierra/core/graphs/summary_line.py +506 -0
  25. sierra/core/logging.py +3 -2
  26. sierra/core/models/__init__.py +3 -1
  27. sierra/core/models/info.py +19 -0
  28. sierra/core/models/interface.py +52 -122
  29. sierra/core/pipeline/__init__.py +2 -5
  30. sierra/core/pipeline/pipeline.py +228 -126
  31. sierra/core/pipeline/stage1/__init__.py +10 -0
  32. sierra/core/pipeline/stage1/pipeline_stage1.py +45 -31
  33. sierra/core/pipeline/stage2/__init__.py +10 -0
  34. sierra/core/pipeline/stage2/pipeline_stage2.py +8 -11
  35. sierra/core/pipeline/stage2/runner.py +401 -0
  36. sierra/core/pipeline/stage3/__init__.py +12 -0
  37. sierra/core/pipeline/stage3/gather.py +321 -0
  38. sierra/core/pipeline/stage3/pipeline_stage3.py +37 -84
  39. sierra/core/pipeline/stage4/__init__.py +12 -2
  40. sierra/core/pipeline/stage4/pipeline_stage4.py +36 -354
  41. sierra/core/pipeline/stage5/__init__.py +12 -0
  42. sierra/core/pipeline/stage5/pipeline_stage5.py +33 -208
  43. sierra/core/pipeline/yaml.py +48 -0
  44. sierra/core/plugin.py +529 -62
  45. sierra/core/proc.py +11 -0
  46. sierra/core/prod.py +11 -0
  47. sierra/core/ros1/__init__.py +5 -1
  48. sierra/core/ros1/callbacks.py +22 -21
  49. sierra/core/ros1/cmdline.py +59 -88
  50. sierra/core/ros1/generators.py +159 -175
  51. sierra/core/ros1/variables/__init__.py +3 -0
  52. sierra/core/ros1/variables/exp_setup.py +122 -116
  53. sierra/core/startup.py +106 -76
  54. sierra/core/stat_kernels.py +4 -5
  55. sierra/core/storage.py +13 -32
  56. sierra/core/trampoline.py +30 -0
  57. sierra/core/types.py +116 -71
  58. sierra/core/utils.py +103 -106
  59. sierra/core/variables/__init__.py +1 -1
  60. sierra/core/variables/base_variable.py +12 -17
  61. sierra/core/variables/batch_criteria.py +387 -481
  62. sierra/core/variables/builtin.py +135 -0
  63. sierra/core/variables/exp_setup.py +19 -39
  64. sierra/core/variables/population_size.py +72 -76
  65. sierra/core/variables/variable_density.py +44 -68
  66. sierra/core/vector.py +1 -1
  67. sierra/main.py +256 -88
  68. sierra/plugins/__init__.py +119 -0
  69. sierra/plugins/compare/__init__.py +14 -0
  70. sierra/plugins/compare/graphs/__init__.py +19 -0
  71. sierra/plugins/compare/graphs/cmdline.py +120 -0
  72. sierra/plugins/compare/graphs/comparator.py +291 -0
  73. sierra/plugins/compare/graphs/inter_controller.py +531 -0
  74. sierra/plugins/compare/graphs/inter_scenario.py +297 -0
  75. sierra/plugins/compare/graphs/namecalc.py +53 -0
  76. sierra/plugins/compare/graphs/outputroot.py +73 -0
  77. sierra/plugins/compare/graphs/plugin.py +147 -0
  78. sierra/plugins/compare/graphs/preprocess.py +172 -0
  79. sierra/plugins/compare/graphs/schema.py +37 -0
  80. sierra/plugins/engine/__init__.py +14 -0
  81. sierra/plugins/engine/argos/__init__.py +18 -0
  82. sierra/plugins/{platform → engine}/argos/cmdline.py +144 -151
  83. sierra/plugins/{platform/argos/variables → engine/argos/generators}/__init__.py +5 -0
  84. sierra/plugins/engine/argos/generators/engine.py +394 -0
  85. sierra/plugins/engine/argos/plugin.py +393 -0
  86. sierra/plugins/{platform/argos/generators → engine/argos/variables}/__init__.py +5 -0
  87. sierra/plugins/engine/argos/variables/arena_shape.py +183 -0
  88. sierra/plugins/engine/argos/variables/cameras.py +240 -0
  89. sierra/plugins/engine/argos/variables/constant_density.py +112 -0
  90. sierra/plugins/engine/argos/variables/exp_setup.py +82 -0
  91. sierra/plugins/{platform → engine}/argos/variables/physics_engines.py +83 -87
  92. sierra/plugins/engine/argos/variables/population_constant_density.py +178 -0
  93. sierra/plugins/engine/argos/variables/population_size.py +115 -0
  94. sierra/plugins/engine/argos/variables/population_variable_density.py +123 -0
  95. sierra/plugins/engine/argos/variables/rendering.py +108 -0
  96. sierra/plugins/engine/ros1gazebo/__init__.py +18 -0
  97. sierra/plugins/engine/ros1gazebo/cmdline.py +175 -0
  98. sierra/plugins/{platform/ros1robot → engine/ros1gazebo}/generators/__init__.py +5 -0
  99. sierra/plugins/engine/ros1gazebo/generators/engine.py +125 -0
  100. sierra/plugins/engine/ros1gazebo/plugin.py +404 -0
  101. sierra/plugins/engine/ros1gazebo/variables/__init__.py +15 -0
  102. sierra/plugins/engine/ros1gazebo/variables/population_size.py +214 -0
  103. sierra/plugins/engine/ros1robot/__init__.py +18 -0
  104. sierra/plugins/engine/ros1robot/cmdline.py +159 -0
  105. sierra/plugins/{platform/ros1gazebo → engine/ros1robot}/generators/__init__.py +4 -0
  106. sierra/plugins/engine/ros1robot/generators/engine.py +95 -0
  107. sierra/plugins/engine/ros1robot/plugin.py +410 -0
  108. sierra/plugins/{hpc/local → engine/ros1robot/variables}/__init__.py +5 -0
  109. sierra/plugins/engine/ros1robot/variables/population_size.py +146 -0
  110. sierra/plugins/execenv/__init__.py +11 -0
  111. sierra/plugins/execenv/hpc/__init__.py +18 -0
  112. sierra/plugins/execenv/hpc/adhoc/__init__.py +18 -0
  113. sierra/plugins/execenv/hpc/adhoc/cmdline.py +30 -0
  114. sierra/plugins/execenv/hpc/adhoc/plugin.py +131 -0
  115. sierra/plugins/execenv/hpc/cmdline.py +137 -0
  116. sierra/plugins/execenv/hpc/local/__init__.py +18 -0
  117. sierra/plugins/execenv/hpc/local/cmdline.py +31 -0
  118. sierra/plugins/execenv/hpc/local/plugin.py +145 -0
  119. sierra/plugins/execenv/hpc/pbs/__init__.py +18 -0
  120. sierra/plugins/execenv/hpc/pbs/cmdline.py +30 -0
  121. sierra/plugins/execenv/hpc/pbs/plugin.py +121 -0
  122. sierra/plugins/execenv/hpc/slurm/__init__.py +18 -0
  123. sierra/plugins/execenv/hpc/slurm/cmdline.py +30 -0
  124. sierra/plugins/execenv/hpc/slurm/plugin.py +133 -0
  125. sierra/plugins/execenv/prefectserver/__init__.py +18 -0
  126. sierra/plugins/execenv/prefectserver/cmdline.py +66 -0
  127. sierra/plugins/execenv/prefectserver/dockerremote/__init__.py +18 -0
  128. sierra/plugins/execenv/prefectserver/dockerremote/cmdline.py +66 -0
  129. sierra/plugins/execenv/prefectserver/dockerremote/plugin.py +132 -0
  130. sierra/plugins/execenv/prefectserver/flow.py +66 -0
  131. sierra/plugins/execenv/prefectserver/local/__init__.py +18 -0
  132. sierra/plugins/execenv/prefectserver/local/cmdline.py +29 -0
  133. sierra/plugins/execenv/prefectserver/local/plugin.py +133 -0
  134. sierra/plugins/{hpc/adhoc → execenv/robot}/__init__.py +1 -0
  135. sierra/plugins/execenv/robot/turtlebot3/__init__.py +18 -0
  136. sierra/plugins/execenv/robot/turtlebot3/plugin.py +204 -0
  137. sierra/plugins/expdef/__init__.py +14 -0
  138. sierra/plugins/expdef/json/__init__.py +14 -0
  139. sierra/plugins/expdef/json/plugin.py +504 -0
  140. sierra/plugins/expdef/xml/__init__.py +14 -0
  141. sierra/plugins/expdef/xml/plugin.py +386 -0
  142. sierra/{core/hpc → plugins/proc}/__init__.py +1 -1
  143. sierra/plugins/proc/collate/__init__.py +15 -0
  144. sierra/plugins/proc/collate/cmdline.py +47 -0
  145. sierra/plugins/proc/collate/plugin.py +271 -0
  146. sierra/plugins/proc/compress/__init__.py +18 -0
  147. sierra/plugins/proc/compress/cmdline.py +47 -0
  148. sierra/plugins/proc/compress/plugin.py +123 -0
  149. sierra/plugins/proc/decompress/__init__.py +18 -0
  150. sierra/plugins/proc/decompress/plugin.py +96 -0
  151. sierra/plugins/proc/imagize/__init__.py +15 -0
  152. sierra/plugins/proc/imagize/cmdline.py +49 -0
  153. sierra/plugins/proc/imagize/plugin.py +270 -0
  154. sierra/plugins/proc/modelrunner/__init__.py +16 -0
  155. sierra/plugins/proc/modelrunner/plugin.py +250 -0
  156. sierra/plugins/proc/statistics/__init__.py +15 -0
  157. sierra/plugins/proc/statistics/cmdline.py +64 -0
  158. sierra/plugins/proc/statistics/plugin.py +390 -0
  159. sierra/plugins/{hpc → prod}/__init__.py +1 -0
  160. sierra/plugins/prod/graphs/__init__.py +18 -0
  161. sierra/plugins/prod/graphs/cmdline.py +269 -0
  162. sierra/plugins/prod/graphs/collate.py +279 -0
  163. sierra/plugins/prod/graphs/inter/__init__.py +13 -0
  164. sierra/plugins/prod/graphs/inter/generate.py +83 -0
  165. sierra/plugins/prod/graphs/inter/heatmap.py +86 -0
  166. sierra/plugins/prod/graphs/inter/line.py +134 -0
  167. sierra/plugins/prod/graphs/intra/__init__.py +15 -0
  168. sierra/plugins/prod/graphs/intra/generate.py +202 -0
  169. sierra/plugins/prod/graphs/intra/heatmap.py +74 -0
  170. sierra/plugins/prod/graphs/intra/line.py +114 -0
  171. sierra/plugins/prod/graphs/plugin.py +103 -0
  172. sierra/plugins/prod/graphs/targets.py +63 -0
  173. sierra/plugins/prod/render/__init__.py +18 -0
  174. sierra/plugins/prod/render/cmdline.py +72 -0
  175. sierra/plugins/prod/render/plugin.py +282 -0
  176. sierra/plugins/storage/__init__.py +5 -0
  177. sierra/plugins/storage/arrow/__init__.py +18 -0
  178. sierra/plugins/storage/arrow/plugin.py +38 -0
  179. sierra/plugins/storage/csv/__init__.py +9 -0
  180. sierra/plugins/storage/csv/plugin.py +12 -5
  181. sierra/version.py +3 -2
  182. sierra_research-1.5.0.dist-info/METADATA +238 -0
  183. sierra_research-1.5.0.dist-info/RECORD +186 -0
  184. {sierra_research-1.3.6.dist-info → sierra_research-1.5.0.dist-info}/WHEEL +1 -2
  185. sierra/core/experiment/xml.py +0 -454
  186. sierra/core/generators/controller_generator_parser.py +0 -34
  187. sierra/core/generators/exp_creator.py +0 -351
  188. sierra/core/generators/exp_generators.py +0 -142
  189. sierra/core/graphs/scatterplot2D.py +0 -109
  190. sierra/core/graphs/stacked_line_graph.py +0 -249
  191. sierra/core/graphs/stacked_surface_graph.py +0 -220
  192. sierra/core/graphs/summary_line_graph.py +0 -369
  193. sierra/core/hpc/cmdline.py +0 -142
  194. sierra/core/models/graphs.py +0 -87
  195. sierra/core/pipeline/stage2/exp_runner.py +0 -286
  196. sierra/core/pipeline/stage3/imagizer.py +0 -149
  197. sierra/core/pipeline/stage3/run_collator.py +0 -317
  198. sierra/core/pipeline/stage3/statistics_calculator.py +0 -478
  199. sierra/core/pipeline/stage4/graph_collator.py +0 -319
  200. sierra/core/pipeline/stage4/inter_exp_graph_generator.py +0 -240
  201. sierra/core/pipeline/stage4/intra_exp_graph_generator.py +0 -317
  202. sierra/core/pipeline/stage4/model_runner.py +0 -168
  203. sierra/core/pipeline/stage4/rendering.py +0 -283
  204. sierra/core/pipeline/stage4/yaml_config_loader.py +0 -103
  205. sierra/core/pipeline/stage5/inter_scenario_comparator.py +0 -328
  206. sierra/core/pipeline/stage5/intra_scenario_comparator.py +0 -989
  207. sierra/core/platform.py +0 -493
  208. sierra/core/plugin_manager.py +0 -369
  209. sierra/core/root_dirpath_generator.py +0 -241
  210. sierra/plugins/hpc/adhoc/plugin.py +0 -125
  211. sierra/plugins/hpc/local/plugin.py +0 -81
  212. sierra/plugins/hpc/pbs/__init__.py +0 -9
  213. sierra/plugins/hpc/pbs/plugin.py +0 -126
  214. sierra/plugins/hpc/slurm/__init__.py +0 -9
  215. sierra/plugins/hpc/slurm/plugin.py +0 -130
  216. sierra/plugins/platform/__init__.py +0 -9
  217. sierra/plugins/platform/argos/__init__.py +0 -9
  218. sierra/plugins/platform/argos/generators/platform_generators.py +0 -383
  219. sierra/plugins/platform/argos/plugin.py +0 -337
  220. sierra/plugins/platform/argos/variables/arena_shape.py +0 -145
  221. sierra/plugins/platform/argos/variables/cameras.py +0 -243
  222. sierra/plugins/platform/argos/variables/constant_density.py +0 -136
  223. sierra/plugins/platform/argos/variables/exp_setup.py +0 -113
  224. sierra/plugins/platform/argos/variables/population_constant_density.py +0 -175
  225. sierra/plugins/platform/argos/variables/population_size.py +0 -102
  226. sierra/plugins/platform/argos/variables/population_variable_density.py +0 -132
  227. sierra/plugins/platform/argos/variables/rendering.py +0 -104
  228. sierra/plugins/platform/ros1gazebo/__init__.py +0 -9
  229. sierra/plugins/platform/ros1gazebo/cmdline.py +0 -213
  230. sierra/plugins/platform/ros1gazebo/generators/platform_generators.py +0 -137
  231. sierra/plugins/platform/ros1gazebo/plugin.py +0 -335
  232. sierra/plugins/platform/ros1gazebo/variables/__init__.py +0 -10
  233. sierra/plugins/platform/ros1gazebo/variables/population_size.py +0 -204
  234. sierra/plugins/platform/ros1robot/__init__.py +0 -9
  235. sierra/plugins/platform/ros1robot/cmdline.py +0 -175
  236. sierra/plugins/platform/ros1robot/generators/platform_generators.py +0 -112
  237. sierra/plugins/platform/ros1robot/plugin.py +0 -373
  238. sierra/plugins/platform/ros1robot/variables/__init__.py +0 -10
  239. sierra/plugins/platform/ros1robot/variables/population_size.py +0 -146
  240. sierra/plugins/robot/__init__.py +0 -9
  241. sierra/plugins/robot/turtlebot3/__init__.py +0 -9
  242. sierra/plugins/robot/turtlebot3/plugin.py +0 -194
  243. sierra_research-1.3.6.data/data/share/man/man1/sierra-cli.1 +0 -2349
  244. sierra_research-1.3.6.data/data/share/man/man7/sierra-examples.7 +0 -488
  245. sierra_research-1.3.6.data/data/share/man/man7/sierra-exec-envs.7 +0 -331
  246. sierra_research-1.3.6.data/data/share/man/man7/sierra-glossary.7 +0 -285
  247. sierra_research-1.3.6.data/data/share/man/man7/sierra-platforms.7 +0 -358
  248. sierra_research-1.3.6.data/data/share/man/man7/sierra-usage.7 +0 -725
  249. sierra_research-1.3.6.data/data/share/man/man7/sierra.7 +0 -78
  250. sierra_research-1.3.6.dist-info/METADATA +0 -500
  251. sierra_research-1.3.6.dist-info/RECORD +0 -133
  252. sierra_research-1.3.6.dist-info/top_level.txt +0 -1
  253. {sierra_research-1.3.6.dist-info → sierra_research-1.5.0.dist-info}/entry_points.txt +0 -0
  254. {sierra_research-1.3.6.dist-info → sierra_research-1.5.0.dist-info/licenses}/LICENSE +0 -0
@@ -0,0 +1,120 @@
1
+ #
2
+ # Copyright 2025 John Harwell, All rights reserved.
3
+ #
4
+ # SPDX-License Identifier: MIT
5
+ #
6
+
7
+ # Core packages
8
+ import typing as tp
9
+ import argparse
10
+
11
+ # 3rd party packages
12
+
13
+ # Project packages
14
+ from sierra.core import types, utils
15
+ from sierra.plugins import PluginCmdline
16
+
17
+
18
+ def build(
19
+ parents: tp.List[argparse.ArgumentParser], stages: tp.List[int]
20
+ ) -> PluginCmdline:
21
+ """
22
+ Get a cmdline parser supporting the ``compare.graphs`` comparison plugin.
23
+ """
24
+ cmdline = PluginCmdline(parents, stages)
25
+ cmdline.stage5.add_argument(
26
+ "--things",
27
+ help="""
28
+ Comma separated list of things to compare within ``--sierra-root``.
29
+
30
+ The first things in this list will be used as the thing of primary
31
+ interest if ``--comparison-type`` is passed.
32
+ """
33
+ + cmdline.stage_usage_doc([5]),
34
+ )
35
+
36
+ cmdline.stage5.add_argument(
37
+ "--things-legend",
38
+ help="""
39
+ Comma separated list of names to use on the legend for the
40
+ generated comparison graphs, specified in the same order as the
41
+ ``--things``.
42
+ """
43
+ + cmdline.stage_usage_doc(
44
+ [5], "If omitted: the raw names of the compared things will be used."
45
+ ),
46
+ )
47
+
48
+ cmdline.stage5.add_argument(
49
+ "--across",
50
+ choices=["controllers", "scenarios", "criterias"],
51
+ help="""
52
+ Perform a comparison *across* ``--things`` (controllers,
53
+ scenarios, batch criteria), as configured.
54
+ """
55
+ + cmdline.stage_usage_doc([5]),
56
+ default="intercc",
57
+ )
58
+
59
+ cmdline.stage5.add_argument(
60
+ "--comparison-type",
61
+ choices=["LNraw"],
62
+ help=r"""
63
+ Specify how controller comparisons should be performed.
64
+
65
+ If the batch criteria is univariate, the options are:
66
+
67
+ - ``LNraw`` - Output raw 1D performance measures using a single
68
+ {0} for each measure, with all ``--things`` shown on the same
69
+ graph.
70
+
71
+ If the batch criteria is bivariate, the options are:
72
+
73
+ - ``LNraw`` - Output raw performance measures as a set of {0},
74
+ where each line graph is constructed from the i-th row/column
75
+ for the 2D dataframe for the performance results for all
76
+ ``--things``.
77
+
78
+ .. NOTE:: SIERRA cannot currently plot statistics on the linegraphs
79
+ built from slices of the 2D CSVs/heatmaps generated
80
+ during stage4, because statistics generation is limited
81
+ to stage3. This limitation may be removed in a future
82
+ release.
83
+
84
+ For all comparison types, ``--legend`` is used if passed for
85
+ legend.
86
+ """.format(
87
+ utils.sphinx_ref(
88
+ ":py:func:`Summary Line <sierra.core.graphs.summary_line.generate>`"
89
+ )
90
+ )
91
+ + cmdline.stage_usage_doc([5]),
92
+ )
93
+
94
+ cmdline.stage5.add_argument(
95
+ "--bc-cardinality",
96
+ help="""
97
+ Specify the cardinality of the batch criteria used. It is not
98
+ trivial to deduce this correctly for all ``--across`` /
99
+ ``--comparison-type`` combinations, so for now the solution is to
100
+ require that this be passed.
101
+ """
102
+ + cmdline.stage_usage_doc([5]),
103
+ type=int,
104
+ )
105
+
106
+ return cmdline
107
+
108
+
109
+ def to_cmdopts(args: argparse.Namespace) -> types.Cmdopts:
110
+ return {
111
+ "things": args.things,
112
+ "things_legend": args.things_legend,
113
+ "across": args.across,
114
+ "comparison_type": args.comparison_type,
115
+ "bc_cardinality": args.bc_cardinality,
116
+ }
117
+
118
+
119
+ def sphinx_cmdline_stage5():
120
+ return build([], [5]).parser
@@ -0,0 +1,291 @@
1
+ #
2
+ # Copyright 2025 John Harwell, All rights reserved.
3
+ #
4
+ # SPDX-License Identifier: MIT
5
+ #
6
+ """
7
+ Base class functionality for comparing products/deliverables in stage 5.
8
+ """
9
+ # Core packages
10
+ import typing as tp
11
+ import logging
12
+ import pathlib
13
+ import argparse
14
+
15
+ # 3rd party packages
16
+ import strictyaml
17
+ import yaml
18
+
19
+ # Project packages
20
+ from sierra.core import types, batchroot
21
+ from sierra.plugins.compare.graphs import outputroot, schema
22
+
23
+
24
+ class BaseComparator:
25
+ """Compares a set of SOMETHING within SOME context.
26
+
27
+ Graph generation
28
+ is controlled via a config file parsed in
29
+ :class:`~sierra.core.pipeline.stage5.pipeline_stage5.PipelineStage5`.
30
+
31
+ Attributes:
32
+ things: List of names of things to compare.
33
+
34
+ stage5_roots: Set of directory paths for stage 5 file generation.
35
+
36
+ cmdopts: Dictionary of parsed cmdline parameters.
37
+
38
+ cli_args: :class:`argparse` object containing the cmdline
39
+ parameters. Needed for
40
+ :class:`~sierra.core.variables.batch_criteria.XVarBatchCriteria`
41
+ generation for each scenario controllers are compared within,
42
+ as batch criteria is dependent on controller+scenario
43
+ definition, and needs to be re-generated for each scenario in
44
+ order to get graph labels/axis ticks to come out right in all
45
+ cases.
46
+
47
+ """
48
+
49
+ def __init__(
50
+ self,
51
+ things: tp.List[str],
52
+ stage5_roots: outputroot.PathSet,
53
+ cmdopts: types.Cmdopts,
54
+ cli_args: argparse.Namespace,
55
+ main_config: types.YAMLDict,
56
+ ) -> None:
57
+ self.things = things
58
+ self.stage5_roots = stage5_roots
59
+
60
+ self.cmdopts = cmdopts
61
+ self.cli_args = cli_args
62
+ self.main_config = main_config
63
+ self.project_root = pathlib.Path(
64
+ self.cmdopts["sierra_root"], self.cmdopts["project"]
65
+ )
66
+ self.logger = logging.getLogger(__name__)
67
+ self.logger.debug("csv_root=%s", str(self.stage5_roots.csv_root))
68
+ self.logger.debug("graph_root=%s", str(self.stage5_roots.graph_root))
69
+
70
+ def __call__(
71
+ self,
72
+ target_graphs: tp.List[types.YAMLDict],
73
+ legend: tp.List[str],
74
+ ) -> None:
75
+ self._check_comparability()
76
+
77
+ selected = self.exp_select()
78
+ if not selected:
79
+ self.logger.warning(
80
+ "No matching batch experiments to compare %s in for criteria %s",
81
+ self.things,
82
+ self.cli_args.batch_criteria,
83
+ )
84
+ return
85
+
86
+ self.logger.debug(
87
+ "Comparing %s: selected=%s",
88
+ self.things,
89
+ [r.to_str() for r in selected],
90
+ )
91
+
92
+ # For each comparison graph we are interested in, generate it using data
93
+ # from all matching batch roots
94
+ for graph in target_graphs:
95
+ try:
96
+ if self.cmdopts["across"] == "controllers":
97
+ graph = strictyaml.load(yaml.dump(graph), schema.cc).data
98
+ elif self.cmdopts["across"] == "scenarios":
99
+ graph = strictyaml.load(yaml.dump(graph), schema.sc).data
100
+ elif self.cmdopts["across"] == "criterias":
101
+ raise NotImplementedError
102
+ except strictyaml.YAMLError as e:
103
+ self.logger.critical("Non-conformant comparison YAML: %s", e)
104
+ raise
105
+
106
+ self.compare(
107
+ cmdopts=self.cmdopts, graph=graph, roots=selected, legend=legend
108
+ )
109
+
110
+ def _check_comparability(self) -> None:
111
+ """Check if the specified THINGS can be compared.
112
+
113
+ Comparable THINGS have all been run on the same set of batch
114
+ experiments, scenarios or controllers (depending on the specified
115
+ comparison type). If they have not, it is not *necessarily* an error,
116
+ but probably should be looked at, so it is only a warning, not fatal.
117
+ """
118
+ if self.cmdopts["across"] == "controllers":
119
+ self._check_comparability_cc()
120
+ elif self.cmdopts["across"] == "scenarios":
121
+ self._check_comparability_sc()
122
+
123
+ def _check_comparability_cc(self) -> None:
124
+ """
125
+ Check that a set of controllers can be compared.
126
+
127
+ To be comparable, controllers must have been run in the same scenario
128
+ with the same batch criteria.
129
+ """
130
+ for c1 in self.things:
131
+ # Check all scenario+batch criteria experiments which have used
132
+ # this controller.
133
+ for scenario in (self.project_root / c1).iterdir():
134
+ for candidate in scenario.iterdir():
135
+ # Get the dirname of the batch experiment path
136
+ leaf1 = batchroot.ExpRootLeaf.from_name(candidate.name)
137
+ opts1 = batchroot.from_exp(
138
+ sierra_root=self.cmdopts["sierra_root"],
139
+ project=self.cmdopts["project"],
140
+ batch_leaf=leaf1,
141
+ controller=c1,
142
+ scenario=str(scenario),
143
+ )
144
+ interexp_root1 = opts1.stat_interexp_root
145
+
146
+ # Stage 5 only operates on stage4 collated data, so if that
147
+ # doesn't exist, we can't do anything.
148
+ if not interexp_root1.exists():
149
+ self.logger.debug(
150
+ "%s cannot be compared in/across for %s: %s does not exist",
151
+ leaf1.scenario,
152
+ c1,
153
+ interexp_root1,
154
+ )
155
+ continue
156
+
157
+ for c2 in self.things:
158
+ self._check_comparability_cc_pairwise(c1, leaf1, c2)
159
+
160
+ def _check_comparability_cc_pairwise(
161
+ self, c1: str, leaf1: batchroot.ExpRootLeaf, c2: str
162
+ ) -> None:
163
+ """
164
+ Check if two controllers can be compared.
165
+
166
+ Given a candidate batch experiment for one of them, check that the other
167
+ one executed the same batch experiment in the same scenario.
168
+ """
169
+ if c1 == c2:
170
+ return
171
+
172
+ for scenario2 in (self.project_root / c2).iterdir():
173
+ for candidate2 in scenario2.iterdir():
174
+ # Get the dirname of the batch experiment path
175
+ leaf2 = batchroot.ExpRootLeaf.from_name(candidate2.name)
176
+
177
+ opts2 = batchroot.from_exp(
178
+ sierra_root=self.cmdopts["sierra_root"],
179
+ project=self.cmdopts["project"],
180
+ batch_leaf=leaf2,
181
+ controller=c2,
182
+ scenario=str(scenario2),
183
+ )
184
+ interexp_root2 = opts2.stat_interexp_root
185
+
186
+ if not interexp_root2.exists():
187
+ self.logger.debug(
188
+ "%s cannot be compared in/across for %s: %s does not exist",
189
+ leaf1.scenario,
190
+ c2,
191
+ interexp_root2,
192
+ )
193
+ return
194
+
195
+ # Check that both controllers were run on the same set
196
+ # of batch criteria
197
+ if leaf1.bc != leaf2.bc:
198
+ self.logger.warning(
199
+ "Cannot compare %s with %s: bc mismatch (%s != %s)",
200
+ c1,
201
+ c2,
202
+ leaf1.bc,
203
+ leaf2.bc,
204
+ )
205
+
206
+ def _check_comparability_sc(self) -> None:
207
+ """
208
+ Check that a set of scenarios can be compared.
209
+
210
+ To be comparable, scenarios must have been run using the same controller
211
+ with the same batch criteria.
212
+ """
213
+ controller = self.cmdopts["controller"]
214
+
215
+ # Check all scenarios
216
+ for s1 in self.things:
217
+ # Check all batch criteria experiments which have used the specified
218
+ # controller.
219
+ for candidate in (self.project_root / controller / s1).iterdir():
220
+ # Get the dirname of the batch experiment path
221
+ leaf1 = batchroot.ExpRootLeaf.from_name(candidate.name)
222
+ opts1 = batchroot.from_exp(
223
+ sierra_root=self.cmdopts["sierra_root"],
224
+ project=self.cmdopts["project"],
225
+ batch_leaf=leaf1,
226
+ controller=controller,
227
+ scenario=s1,
228
+ )
229
+ interexp_root1 = opts1.stat_interexp_root
230
+
231
+ # Stage 5 only operates on stage4 collated data, so if that
232
+ # doesn't exist, we can't do anything.
233
+ if not interexp_root1.exists():
234
+ self.logger.debug(
235
+ "%s cannot be compared in/across for %s: %s does not exist",
236
+ controller,
237
+ s1,
238
+ interexp_root1,
239
+ )
240
+ continue
241
+
242
+ for s2 in self.things:
243
+ self._check_comparability_sc_pairwise(s1, controller, leaf1, s2)
244
+
245
+ def _check_comparability_sc_pairwise(
246
+ self, s1: str, controller: str, leaf1: batchroot.ExpRootLeaf, s2: str
247
+ ) -> None:
248
+ """
249
+ Check if two scenarios can be compared.
250
+
251
+ Given a candidate batch experiment for one of them, check that the other
252
+ one executed the same batch experiment using the same controller.
253
+ """
254
+ if s1 == s2:
255
+ return
256
+
257
+ for candidate2 in (self.project_root / controller / s2).iterdir():
258
+ # Get the dirname of the batch experiment path
259
+ leaf2 = batchroot.ExpRootLeaf.from_name(candidate2.name)
260
+
261
+ opts2 = batchroot.from_exp(
262
+ sierra_root=self.cmdopts["sierra_root"],
263
+ project=self.cmdopts["project"],
264
+ batch_leaf=leaf2,
265
+ controller=controller,
266
+ scenario=s2,
267
+ )
268
+ interexp_root2 = opts2.stat_interexp_root
269
+
270
+ if not interexp_root2.exists():
271
+ self.logger.debug(
272
+ "%s cannot be compared in/across for %s: %s does not exist",
273
+ leaf1.scenario,
274
+ s2,
275
+ interexp_root2,
276
+ )
277
+ return
278
+
279
+ # Check that both controllers were run on the same set
280
+ # of batch criteria
281
+ if leaf1.bc != leaf2.bc:
282
+ self.logger.warning(
283
+ "Cannot compare %s with %s: bc mismatch (%s != %s)",
284
+ s1,
285
+ s2,
286
+ leaf1.bc,
287
+ leaf2.bc,
288
+ )
289
+
290
+
291
+ __all__ = ["BaseComparator"]