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.
- sierra/__init__.py +3 -3
- sierra/core/__init__.py +3 -3
- sierra/core/batchroot.py +223 -0
- sierra/core/cmdline.py +681 -1057
- sierra/core/compare.py +11 -0
- sierra/core/config.py +96 -88
- sierra/core/engine.py +306 -0
- sierra/core/execenv.py +380 -0
- sierra/core/expdef.py +11 -0
- sierra/core/experiment/__init__.py +1 -0
- sierra/core/experiment/bindings.py +150 -101
- sierra/core/experiment/definition.py +414 -245
- sierra/core/experiment/spec.py +83 -85
- sierra/core/exproot.py +44 -0
- sierra/core/generators/__init__.py +10 -0
- sierra/core/generators/experiment.py +528 -0
- sierra/core/generators/generator_factory.py +138 -137
- sierra/core/graphs/__init__.py +23 -0
- sierra/core/graphs/bcbridge.py +94 -0
- sierra/core/graphs/heatmap.py +245 -324
- sierra/core/graphs/pathset.py +27 -0
- sierra/core/graphs/schema.py +77 -0
- sierra/core/graphs/stacked_line.py +341 -0
- sierra/core/graphs/summary_line.py +506 -0
- sierra/core/logging.py +3 -2
- sierra/core/models/__init__.py +3 -1
- sierra/core/models/info.py +19 -0
- sierra/core/models/interface.py +52 -122
- sierra/core/pipeline/__init__.py +2 -5
- sierra/core/pipeline/pipeline.py +228 -126
- sierra/core/pipeline/stage1/__init__.py +10 -0
- sierra/core/pipeline/stage1/pipeline_stage1.py +45 -31
- sierra/core/pipeline/stage2/__init__.py +10 -0
- sierra/core/pipeline/stage2/pipeline_stage2.py +8 -11
- sierra/core/pipeline/stage2/runner.py +401 -0
- sierra/core/pipeline/stage3/__init__.py +12 -0
- sierra/core/pipeline/stage3/gather.py +321 -0
- sierra/core/pipeline/stage3/pipeline_stage3.py +37 -84
- sierra/core/pipeline/stage4/__init__.py +12 -2
- sierra/core/pipeline/stage4/pipeline_stage4.py +36 -354
- sierra/core/pipeline/stage5/__init__.py +12 -0
- sierra/core/pipeline/stage5/pipeline_stage5.py +33 -208
- sierra/core/pipeline/yaml.py +48 -0
- sierra/core/plugin.py +529 -62
- sierra/core/proc.py +11 -0
- sierra/core/prod.py +11 -0
- sierra/core/ros1/__init__.py +5 -1
- sierra/core/ros1/callbacks.py +22 -21
- sierra/core/ros1/cmdline.py +59 -88
- sierra/core/ros1/generators.py +159 -175
- sierra/core/ros1/variables/__init__.py +3 -0
- sierra/core/ros1/variables/exp_setup.py +122 -116
- sierra/core/startup.py +106 -76
- sierra/core/stat_kernels.py +4 -5
- sierra/core/storage.py +13 -32
- sierra/core/trampoline.py +30 -0
- sierra/core/types.py +116 -71
- sierra/core/utils.py +103 -106
- sierra/core/variables/__init__.py +1 -1
- sierra/core/variables/base_variable.py +12 -17
- sierra/core/variables/batch_criteria.py +387 -481
- sierra/core/variables/builtin.py +135 -0
- sierra/core/variables/exp_setup.py +19 -39
- sierra/core/variables/population_size.py +72 -76
- sierra/core/variables/variable_density.py +44 -68
- sierra/core/vector.py +1 -1
- sierra/main.py +256 -88
- sierra/plugins/__init__.py +119 -0
- sierra/plugins/compare/__init__.py +14 -0
- sierra/plugins/compare/graphs/__init__.py +19 -0
- sierra/plugins/compare/graphs/cmdline.py +120 -0
- sierra/plugins/compare/graphs/comparator.py +291 -0
- sierra/plugins/compare/graphs/inter_controller.py +531 -0
- sierra/plugins/compare/graphs/inter_scenario.py +297 -0
- sierra/plugins/compare/graphs/namecalc.py +53 -0
- sierra/plugins/compare/graphs/outputroot.py +73 -0
- sierra/plugins/compare/graphs/plugin.py +147 -0
- sierra/plugins/compare/graphs/preprocess.py +172 -0
- sierra/plugins/compare/graphs/schema.py +37 -0
- sierra/plugins/engine/__init__.py +14 -0
- sierra/plugins/engine/argos/__init__.py +18 -0
- sierra/plugins/{platform → engine}/argos/cmdline.py +144 -151
- sierra/plugins/{platform/argos/variables → engine/argos/generators}/__init__.py +5 -0
- sierra/plugins/engine/argos/generators/engine.py +394 -0
- sierra/plugins/engine/argos/plugin.py +393 -0
- sierra/plugins/{platform/argos/generators → engine/argos/variables}/__init__.py +5 -0
- sierra/plugins/engine/argos/variables/arena_shape.py +183 -0
- sierra/plugins/engine/argos/variables/cameras.py +240 -0
- sierra/plugins/engine/argos/variables/constant_density.py +112 -0
- sierra/plugins/engine/argos/variables/exp_setup.py +82 -0
- sierra/plugins/{platform → engine}/argos/variables/physics_engines.py +83 -87
- sierra/plugins/engine/argos/variables/population_constant_density.py +178 -0
- sierra/plugins/engine/argos/variables/population_size.py +115 -0
- sierra/plugins/engine/argos/variables/population_variable_density.py +123 -0
- sierra/plugins/engine/argos/variables/rendering.py +108 -0
- sierra/plugins/engine/ros1gazebo/__init__.py +18 -0
- sierra/plugins/engine/ros1gazebo/cmdline.py +175 -0
- sierra/plugins/{platform/ros1robot → engine/ros1gazebo}/generators/__init__.py +5 -0
- sierra/plugins/engine/ros1gazebo/generators/engine.py +125 -0
- sierra/plugins/engine/ros1gazebo/plugin.py +404 -0
- sierra/plugins/engine/ros1gazebo/variables/__init__.py +15 -0
- sierra/plugins/engine/ros1gazebo/variables/population_size.py +214 -0
- sierra/plugins/engine/ros1robot/__init__.py +18 -0
- sierra/plugins/engine/ros1robot/cmdline.py +159 -0
- sierra/plugins/{platform/ros1gazebo → engine/ros1robot}/generators/__init__.py +4 -0
- sierra/plugins/engine/ros1robot/generators/engine.py +95 -0
- sierra/plugins/engine/ros1robot/plugin.py +410 -0
- sierra/plugins/{hpc/local → engine/ros1robot/variables}/__init__.py +5 -0
- sierra/plugins/engine/ros1robot/variables/population_size.py +146 -0
- sierra/plugins/execenv/__init__.py +11 -0
- sierra/plugins/execenv/hpc/__init__.py +18 -0
- sierra/plugins/execenv/hpc/adhoc/__init__.py +18 -0
- sierra/plugins/execenv/hpc/adhoc/cmdline.py +30 -0
- sierra/plugins/execenv/hpc/adhoc/plugin.py +131 -0
- sierra/plugins/execenv/hpc/cmdline.py +137 -0
- sierra/plugins/execenv/hpc/local/__init__.py +18 -0
- sierra/plugins/execenv/hpc/local/cmdline.py +31 -0
- sierra/plugins/execenv/hpc/local/plugin.py +145 -0
- sierra/plugins/execenv/hpc/pbs/__init__.py +18 -0
- sierra/plugins/execenv/hpc/pbs/cmdline.py +30 -0
- sierra/plugins/execenv/hpc/pbs/plugin.py +121 -0
- sierra/plugins/execenv/hpc/slurm/__init__.py +18 -0
- sierra/plugins/execenv/hpc/slurm/cmdline.py +30 -0
- sierra/plugins/execenv/hpc/slurm/plugin.py +133 -0
- sierra/plugins/execenv/prefectserver/__init__.py +18 -0
- sierra/plugins/execenv/prefectserver/cmdline.py +66 -0
- sierra/plugins/execenv/prefectserver/dockerremote/__init__.py +18 -0
- sierra/plugins/execenv/prefectserver/dockerremote/cmdline.py +66 -0
- sierra/plugins/execenv/prefectserver/dockerremote/plugin.py +132 -0
- sierra/plugins/execenv/prefectserver/flow.py +66 -0
- sierra/plugins/execenv/prefectserver/local/__init__.py +18 -0
- sierra/plugins/execenv/prefectserver/local/cmdline.py +29 -0
- sierra/plugins/execenv/prefectserver/local/plugin.py +133 -0
- sierra/plugins/{hpc/adhoc → execenv/robot}/__init__.py +1 -0
- sierra/plugins/execenv/robot/turtlebot3/__init__.py +18 -0
- sierra/plugins/execenv/robot/turtlebot3/plugin.py +204 -0
- sierra/plugins/expdef/__init__.py +14 -0
- sierra/plugins/expdef/json/__init__.py +14 -0
- sierra/plugins/expdef/json/plugin.py +504 -0
- sierra/plugins/expdef/xml/__init__.py +14 -0
- sierra/plugins/expdef/xml/plugin.py +386 -0
- sierra/{core/hpc → plugins/proc}/__init__.py +1 -1
- sierra/plugins/proc/collate/__init__.py +15 -0
- sierra/plugins/proc/collate/cmdline.py +47 -0
- sierra/plugins/proc/collate/plugin.py +271 -0
- sierra/plugins/proc/compress/__init__.py +18 -0
- sierra/plugins/proc/compress/cmdline.py +47 -0
- sierra/plugins/proc/compress/plugin.py +123 -0
- sierra/plugins/proc/decompress/__init__.py +18 -0
- sierra/plugins/proc/decompress/plugin.py +96 -0
- sierra/plugins/proc/imagize/__init__.py +15 -0
- sierra/plugins/proc/imagize/cmdline.py +49 -0
- sierra/plugins/proc/imagize/plugin.py +270 -0
- sierra/plugins/proc/modelrunner/__init__.py +16 -0
- sierra/plugins/proc/modelrunner/plugin.py +250 -0
- sierra/plugins/proc/statistics/__init__.py +15 -0
- sierra/plugins/proc/statistics/cmdline.py +64 -0
- sierra/plugins/proc/statistics/plugin.py +390 -0
- sierra/plugins/{hpc → prod}/__init__.py +1 -0
- sierra/plugins/prod/graphs/__init__.py +18 -0
- sierra/plugins/prod/graphs/cmdline.py +269 -0
- sierra/plugins/prod/graphs/collate.py +279 -0
- sierra/plugins/prod/graphs/inter/__init__.py +13 -0
- sierra/plugins/prod/graphs/inter/generate.py +83 -0
- sierra/plugins/prod/graphs/inter/heatmap.py +86 -0
- sierra/plugins/prod/graphs/inter/line.py +134 -0
- sierra/plugins/prod/graphs/intra/__init__.py +15 -0
- sierra/plugins/prod/graphs/intra/generate.py +202 -0
- sierra/plugins/prod/graphs/intra/heatmap.py +74 -0
- sierra/plugins/prod/graphs/intra/line.py +114 -0
- sierra/plugins/prod/graphs/plugin.py +103 -0
- sierra/plugins/prod/graphs/targets.py +63 -0
- sierra/plugins/prod/render/__init__.py +18 -0
- sierra/plugins/prod/render/cmdline.py +72 -0
- sierra/plugins/prod/render/plugin.py +282 -0
- sierra/plugins/storage/__init__.py +5 -0
- sierra/plugins/storage/arrow/__init__.py +18 -0
- sierra/plugins/storage/arrow/plugin.py +38 -0
- sierra/plugins/storage/csv/__init__.py +9 -0
- sierra/plugins/storage/csv/plugin.py +12 -5
- sierra/version.py +3 -2
- sierra_research-1.5.0.dist-info/METADATA +238 -0
- sierra_research-1.5.0.dist-info/RECORD +186 -0
- {sierra_research-1.3.6.dist-info → sierra_research-1.5.0.dist-info}/WHEEL +1 -2
- sierra/core/experiment/xml.py +0 -454
- sierra/core/generators/controller_generator_parser.py +0 -34
- sierra/core/generators/exp_creator.py +0 -351
- sierra/core/generators/exp_generators.py +0 -142
- sierra/core/graphs/scatterplot2D.py +0 -109
- sierra/core/graphs/stacked_line_graph.py +0 -249
- sierra/core/graphs/stacked_surface_graph.py +0 -220
- sierra/core/graphs/summary_line_graph.py +0 -369
- sierra/core/hpc/cmdline.py +0 -142
- sierra/core/models/graphs.py +0 -87
- sierra/core/pipeline/stage2/exp_runner.py +0 -286
- sierra/core/pipeline/stage3/imagizer.py +0 -149
- sierra/core/pipeline/stage3/run_collator.py +0 -317
- sierra/core/pipeline/stage3/statistics_calculator.py +0 -478
- sierra/core/pipeline/stage4/graph_collator.py +0 -319
- sierra/core/pipeline/stage4/inter_exp_graph_generator.py +0 -240
- sierra/core/pipeline/stage4/intra_exp_graph_generator.py +0 -317
- sierra/core/pipeline/stage4/model_runner.py +0 -168
- sierra/core/pipeline/stage4/rendering.py +0 -283
- sierra/core/pipeline/stage4/yaml_config_loader.py +0 -103
- sierra/core/pipeline/stage5/inter_scenario_comparator.py +0 -328
- sierra/core/pipeline/stage5/intra_scenario_comparator.py +0 -989
- sierra/core/platform.py +0 -493
- sierra/core/plugin_manager.py +0 -369
- sierra/core/root_dirpath_generator.py +0 -241
- sierra/plugins/hpc/adhoc/plugin.py +0 -125
- sierra/plugins/hpc/local/plugin.py +0 -81
- sierra/plugins/hpc/pbs/__init__.py +0 -9
- sierra/plugins/hpc/pbs/plugin.py +0 -126
- sierra/plugins/hpc/slurm/__init__.py +0 -9
- sierra/plugins/hpc/slurm/plugin.py +0 -130
- sierra/plugins/platform/__init__.py +0 -9
- sierra/plugins/platform/argos/__init__.py +0 -9
- sierra/plugins/platform/argos/generators/platform_generators.py +0 -383
- sierra/plugins/platform/argos/plugin.py +0 -337
- sierra/plugins/platform/argos/variables/arena_shape.py +0 -145
- sierra/plugins/platform/argos/variables/cameras.py +0 -243
- sierra/plugins/platform/argos/variables/constant_density.py +0 -136
- sierra/plugins/platform/argos/variables/exp_setup.py +0 -113
- sierra/plugins/platform/argos/variables/population_constant_density.py +0 -175
- sierra/plugins/platform/argos/variables/population_size.py +0 -102
- sierra/plugins/platform/argos/variables/population_variable_density.py +0 -132
- sierra/plugins/platform/argos/variables/rendering.py +0 -104
- sierra/plugins/platform/ros1gazebo/__init__.py +0 -9
- sierra/plugins/platform/ros1gazebo/cmdline.py +0 -213
- sierra/plugins/platform/ros1gazebo/generators/platform_generators.py +0 -137
- sierra/plugins/platform/ros1gazebo/plugin.py +0 -335
- sierra/plugins/platform/ros1gazebo/variables/__init__.py +0 -10
- sierra/plugins/platform/ros1gazebo/variables/population_size.py +0 -204
- sierra/plugins/platform/ros1robot/__init__.py +0 -9
- sierra/plugins/platform/ros1robot/cmdline.py +0 -175
- sierra/plugins/platform/ros1robot/generators/platform_generators.py +0 -112
- sierra/plugins/platform/ros1robot/plugin.py +0 -373
- sierra/plugins/platform/ros1robot/variables/__init__.py +0 -10
- sierra/plugins/platform/ros1robot/variables/population_size.py +0 -146
- sierra/plugins/robot/__init__.py +0 -9
- sierra/plugins/robot/turtlebot3/__init__.py +0 -9
- sierra/plugins/robot/turtlebot3/plugin.py +0 -194
- sierra_research-1.3.6.data/data/share/man/man1/sierra-cli.1 +0 -2349
- sierra_research-1.3.6.data/data/share/man/man7/sierra-examples.7 +0 -488
- sierra_research-1.3.6.data/data/share/man/man7/sierra-exec-envs.7 +0 -331
- sierra_research-1.3.6.data/data/share/man/man7/sierra-glossary.7 +0 -285
- sierra_research-1.3.6.data/data/share/man/man7/sierra-platforms.7 +0 -358
- sierra_research-1.3.6.data/data/share/man/man7/sierra-usage.7 +0 -725
- sierra_research-1.3.6.data/data/share/man/man7/sierra.7 +0 -78
- sierra_research-1.3.6.dist-info/METADATA +0 -500
- sierra_research-1.3.6.dist-info/RECORD +0 -133
- sierra_research-1.3.6.dist-info/top_level.txt +0 -1
- {sierra_research-1.3.6.dist-info → sierra_research-1.5.0.dist-info}/entry_points.txt +0 -0
- {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"]
|