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.
- 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.11.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 -251
- sierra/core/graphs/stacked_surface_graph.py +0 -220
- sierra/core/graphs/summary_line_graph.py +0 -371
- 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 -320
- 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.11.data/data/share/man/man1/sierra-cli.1 +0 -2349
- sierra_research-1.3.11.data/data/share/man/man7/sierra-examples.7 +0 -508
- sierra_research-1.3.11.data/data/share/man/man7/sierra-exec-envs.7 +0 -331
- sierra_research-1.3.11.data/data/share/man/man7/sierra-glossary.7 +0 -285
- sierra_research-1.3.11.data/data/share/man/man7/sierra-platforms.7 +0 -358
- sierra_research-1.3.11.data/data/share/man/man7/sierra-usage.7 +0 -729
- sierra_research-1.3.11.data/data/share/man/man7/sierra.7 +0 -78
- sierra_research-1.3.11.dist-info/METADATA +0 -492
- sierra_research-1.3.11.dist-info/RECORD +0 -133
- sierra_research-1.3.11.dist-info/top_level.txt +0 -1
- {sierra_research-1.3.11.dist-info → sierra_research-1.5.0.dist-info}/entry_points.txt +0 -0
- {sierra_research-1.3.11.dist-info → sierra_research-1.5.0.dist-info/licenses}/LICENSE +0 -0
@@ -0,0 +1,202 @@
|
|
1
|
+
# Copyright 2018 London Lowmanstone, John Harwell, All rights reserved.
|
2
|
+
#
|
3
|
+
# SPDX-License-Identifier: MIT
|
4
|
+
#
|
5
|
+
"""
|
6
|
+
Generate graphs within a single :term:`Experiment`.
|
7
|
+
"""
|
8
|
+
|
9
|
+
# Core packages
|
10
|
+
import os
|
11
|
+
import copy
|
12
|
+
import typing as tp
|
13
|
+
import logging
|
14
|
+
import pathlib
|
15
|
+
|
16
|
+
# 3rd party packages
|
17
|
+
import yaml
|
18
|
+
|
19
|
+
# Project packages
|
20
|
+
|
21
|
+
import sierra.core.plugin as pm
|
22
|
+
from sierra.core import types, utils, batchroot, exproot, config
|
23
|
+
from sierra.plugins.prod.graphs import intra
|
24
|
+
from sierra.core.variables import batch_criteria as bc
|
25
|
+
|
26
|
+
|
27
|
+
_logger = logging.getLogger(__name__)
|
28
|
+
|
29
|
+
|
30
|
+
def proc_batch_exp(
|
31
|
+
main_config: types.YAMLDict,
|
32
|
+
cmdopts: types.Cmdopts,
|
33
|
+
pathset: batchroot.PathSet,
|
34
|
+
criteria: bc.XVarBatchCriteria,
|
35
|
+
) -> None:
|
36
|
+
"""
|
37
|
+
Generate intra-experiment graphs for a :term:`Batch Experiment`.
|
38
|
+
|
39
|
+
Arguments:
|
40
|
+
main_config: Parsed dictionary of main YAML configuration
|
41
|
+
|
42
|
+
|
43
|
+
criteria: The :term:`Batch Criteria` used for the batch
|
44
|
+
experiment.
|
45
|
+
"""
|
46
|
+
info = criteria.graph_info(cmdopts, batch_output_root=pathset.output_root)
|
47
|
+
exp_to_gen = utils.exp_range_calc(
|
48
|
+
cmdopts["exp_range"], pathset.output_root, info.exp_names
|
49
|
+
)
|
50
|
+
|
51
|
+
if not exp_to_gen:
|
52
|
+
return
|
53
|
+
|
54
|
+
loader = pm.module_load_tiered(project=cmdopts["project"], path="pipeline.yaml")
|
55
|
+
|
56
|
+
graphs_config = loader.load_config(cmdopts, config.kYAML.graphs)
|
57
|
+
|
58
|
+
if "intra-exp" not in graphs_config:
|
59
|
+
_logger.warning(
|
60
|
+
"Cannot generate graphs: 'intra-exp' key not found in YAML config"
|
61
|
+
)
|
62
|
+
return
|
63
|
+
|
64
|
+
project_config_root = pathlib.Path(cmdopts["project_config_root"])
|
65
|
+
controllers_yaml = project_config_root / config.kYAML.controllers
|
66
|
+
|
67
|
+
if controllers_yaml.exists():
|
68
|
+
with utils.utf8open(controllers_yaml) as f:
|
69
|
+
controller_config = yaml.load(f, yaml.FullLoader)
|
70
|
+
else:
|
71
|
+
controller_config = None
|
72
|
+
|
73
|
+
generator = IntraExpGraphGenerator(
|
74
|
+
main_config, controller_config, graphs_config["intra-exp"], cmdopts
|
75
|
+
)
|
76
|
+
for exp in exp_to_gen:
|
77
|
+
exproots = exproot.PathSet(pathset, exp.name)
|
78
|
+
|
79
|
+
if os.path.isdir(exproots.stat_root):
|
80
|
+
generator(exproots)
|
81
|
+
else:
|
82
|
+
_logger.warning(
|
83
|
+
"Skipping experiment '%s': %s does not exist, or isn't a directory",
|
84
|
+
exp,
|
85
|
+
exproots.stat_root,
|
86
|
+
)
|
87
|
+
|
88
|
+
|
89
|
+
class IntraExpGraphGenerator:
|
90
|
+
"""Generates graphs from :term:`Processed Output Data` files.
|
91
|
+
|
92
|
+
Which graphs are generated is controlled by YAML configuration files parsed
|
93
|
+
in stage 4.
|
94
|
+
|
95
|
+
Attributes:
|
96
|
+
cmdopts: Dictionary of parsed cmdline attributes.
|
97
|
+
|
98
|
+
main_config: Parsed dictionary of main YAML configuration
|
99
|
+
|
100
|
+
controller_config: Parsed dictionary of controller YAML
|
101
|
+
configuration.
|
102
|
+
|
103
|
+
graphs_config: Parsed dictionary of intra-experiment graph
|
104
|
+
configuration.
|
105
|
+
|
106
|
+
logger: The handle to the logger for this class. If you extend this
|
107
|
+
class, you should save/restore this variable in tandem with
|
108
|
+
overriding it in order to get logging messages have unique logger
|
109
|
+
names between this class and your derived class, in order to
|
110
|
+
reduce confusion.
|
111
|
+
|
112
|
+
"""
|
113
|
+
|
114
|
+
def __init__(
|
115
|
+
self,
|
116
|
+
main_config: types.YAMLDict,
|
117
|
+
controller_config: tp.Optional[types.YAMLDict],
|
118
|
+
graphs_config: types.YAMLDict,
|
119
|
+
cmdopts: types.Cmdopts,
|
120
|
+
) -> None:
|
121
|
+
# Copy because we are modifying it and don't want to mess up the
|
122
|
+
# arguments for graphs that are generated after us
|
123
|
+
self.cmdopts = copy.deepcopy(cmdopts)
|
124
|
+
self.main_config = main_config
|
125
|
+
self.graphs_config = graphs_config
|
126
|
+
self.controller_config = controller_config
|
127
|
+
self.logger = logging.getLogger(__name__)
|
128
|
+
|
129
|
+
def __call__(self, pathset: exproot.PathSet) -> None:
|
130
|
+
"""
|
131
|
+
Generate graphs.
|
132
|
+
|
133
|
+
Performs the following steps:
|
134
|
+
|
135
|
+
#. :func:`~sierra.plugins.prod.graphs.intra.line.generate()`
|
136
|
+
to generate linegraphs for each experiment in the batch.
|
137
|
+
|
138
|
+
#. :func:`~sierra.plugins.prod.graphs.intra.heatmap.generate()`
|
139
|
+
to generate heatmaps for each experiment in the batch.
|
140
|
+
"""
|
141
|
+
utils.dir_create_checked(pathset.graph_root, exist_ok=True)
|
142
|
+
|
143
|
+
LN_targets, HM_targets = self._calc_targets()
|
144
|
+
|
145
|
+
if not self.cmdopts["project_no_LN"]:
|
146
|
+
intra.line.generate(self.cmdopts, pathset, LN_targets)
|
147
|
+
|
148
|
+
if not self.cmdopts["project_no_HM"]:
|
149
|
+
intra.heatmap.generate(self.cmdopts, pathset, HM_targets)
|
150
|
+
|
151
|
+
def _calc_targets(
|
152
|
+
self,
|
153
|
+
) -> tp.Tuple[tp.List[types.YAMLDict], tp.List[types.YAMLDict]]:
|
154
|
+
"""Calculate what intra-experiment graphs should be generated.
|
155
|
+
|
156
|
+
Uses YAML configuration for controller and intra-experiment graphs.
|
157
|
+
Returns a tuple of dictionaries: (intra-experiment linegraphs,
|
158
|
+
intra-experiment heatmaps) defined what graphs to generate. The enabled
|
159
|
+
graphs exist in their respective YAML configuration *and* are enabled by
|
160
|
+
the YAML configuration for the selected controller.
|
161
|
+
"""
|
162
|
+
keys = []
|
163
|
+
if self.controller_config:
|
164
|
+
for category in list(self.controller_config.keys()):
|
165
|
+
if category not in self.cmdopts["controller"]:
|
166
|
+
continue
|
167
|
+
for controller in self.controller_config[category]["controllers"]:
|
168
|
+
if controller["name"] not in self.cmdopts["controller"]:
|
169
|
+
continue
|
170
|
+
|
171
|
+
# valid to specify no graphs, and only to inherit graphs
|
172
|
+
keys = controller.get("graphs", [])
|
173
|
+
if "graphs_inherit" in controller:
|
174
|
+
for inherit in controller["graphs_inherit"]:
|
175
|
+
keys.extend(inherit) # optional
|
176
|
+
|
177
|
+
else:
|
178
|
+
keys = list(k for k in self.graphs_config)
|
179
|
+
self.logger.warning(
|
180
|
+
"Missing controller graph config--generating all enabled "
|
181
|
+
"intra-experiment graphs for all controllers: %s",
|
182
|
+
keys,
|
183
|
+
)
|
184
|
+
|
185
|
+
# Get keys for enabled graphs
|
186
|
+
LN_keys = [k for k in self.graphs_config if k in keys]
|
187
|
+
self.logger.debug("Enabled linegraph categories: %s", LN_keys)
|
188
|
+
|
189
|
+
HM_keys = [k for k in self.graphs_config if k in keys]
|
190
|
+
self.logger.debug("Enabled heatmap categories: %s", HM_keys)
|
191
|
+
|
192
|
+
# Strip out all configured graphs which are not enabled
|
193
|
+
LN_targets = [self.graphs_config[k] for k in LN_keys]
|
194
|
+
HM_targets = [self.graphs_config[k] for k in HM_keys]
|
195
|
+
|
196
|
+
return LN_targets, HM_targets
|
197
|
+
|
198
|
+
|
199
|
+
__all__ = [
|
200
|
+
"proc_batch_exp",
|
201
|
+
"IntraExpGraphGenerator",
|
202
|
+
]
|
@@ -0,0 +1,74 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2024 John Harwell, All rights reserved.
|
3
|
+
#
|
4
|
+
# SPDX-License Identifier: MIT
|
5
|
+
#
|
6
|
+
"""Generate heatmaps within a single :term:`Experiment`."""
|
7
|
+
|
8
|
+
# Core packages
|
9
|
+
import typing as tp
|
10
|
+
import logging
|
11
|
+
|
12
|
+
# 3rd party packages
|
13
|
+
import json
|
14
|
+
|
15
|
+
# Project packages
|
16
|
+
from sierra.core import types, exproot, graphs
|
17
|
+
|
18
|
+
_logger = logging.getLogger(__name__)
|
19
|
+
|
20
|
+
|
21
|
+
def generate(
|
22
|
+
cmdopts: types.Cmdopts,
|
23
|
+
pathset: exproot.PathSet,
|
24
|
+
targets: tp.List[types.YAMLDict],
|
25
|
+
) -> None:
|
26
|
+
"""
|
27
|
+
Generate heatmaps from: term:`Processed Output Data` files.
|
28
|
+
"""
|
29
|
+
large_text = cmdopts["plot_large_text"]
|
30
|
+
|
31
|
+
_logger.info(
|
32
|
+
"Heatmaps from <batch_root>/%s", pathset.stat_root.relative_to(pathset.parent)
|
33
|
+
)
|
34
|
+
|
35
|
+
# For each category of heatmaps we are generating
|
36
|
+
for category in targets:
|
37
|
+
|
38
|
+
# For each graph in each category
|
39
|
+
for graph in category:
|
40
|
+
# Only try to create heatmaps (duh)
|
41
|
+
if graph["type"] != "heatmap":
|
42
|
+
continue
|
43
|
+
|
44
|
+
_logger.trace("\n" + json.dumps(graph, indent=4)) # type: ignore
|
45
|
+
|
46
|
+
graph_pathset = graphs.PathSet(
|
47
|
+
input_root=pathset.stat_root,
|
48
|
+
output_root=pathset.graph_root,
|
49
|
+
batchroot=pathset.parent.parent,
|
50
|
+
model_root=None,
|
51
|
+
)
|
52
|
+
# 2025-06-05 [JRH]: We always write stage {3,4} output data files as
|
53
|
+
# .csv because that is currently SIERRA's 'native' format; this may
|
54
|
+
# change in the future.
|
55
|
+
graphs.heatmap(
|
56
|
+
pathset=graph_pathset,
|
57
|
+
input_stem=graph["src_stem"],
|
58
|
+
output_stem=graph["dest_stem"],
|
59
|
+
medium="storage.csv",
|
60
|
+
title=graph.get("title", None),
|
61
|
+
xlabel=graph.get("xlabel", None),
|
62
|
+
ylabel=graph.get("ylabel", None),
|
63
|
+
zlabel=graph.get("zlabel", None),
|
64
|
+
backend=graph.get("backend", cmdopts["graphs_backend"]),
|
65
|
+
colnames=(
|
66
|
+
graph.get("x", "x"),
|
67
|
+
graph.get("y", "y"),
|
68
|
+
graph.get("z", "z"),
|
69
|
+
),
|
70
|
+
large_text=large_text,
|
71
|
+
)
|
72
|
+
|
73
|
+
|
74
|
+
__all__ = ["generate"]
|
@@ -0,0 +1,114 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2024 John Harwell, All rights reserved.
|
3
|
+
#
|
4
|
+
# SPDX-License Identifier: MIT
|
5
|
+
#
|
6
|
+
"""Generate linegraphs within a single :term:`Experiment`."""
|
7
|
+
|
8
|
+
# Core packages
|
9
|
+
import typing as tp
|
10
|
+
import logging
|
11
|
+
|
12
|
+
# 3rd party packages
|
13
|
+
import json
|
14
|
+
import numpy as np
|
15
|
+
|
16
|
+
# Project packages
|
17
|
+
from sierra.core import types, exproot, graphs, config
|
18
|
+
from sierra.core import plugin as pm
|
19
|
+
|
20
|
+
_logger = logging.getLogger(__name__)
|
21
|
+
|
22
|
+
|
23
|
+
def generate(
|
24
|
+
cmdopts: types.Cmdopts, pathset: exproot.PathSet, targets: tp.List[types.YAMLDict]
|
25
|
+
) -> None:
|
26
|
+
"""
|
27
|
+
Generate linegraphs from: term:`Processed Output Data` files.
|
28
|
+
"""
|
29
|
+
|
30
|
+
_logger.info(
|
31
|
+
"Linegraphs from <batch_root>/%s", pathset.stat_root.relative_to(pathset.parent)
|
32
|
+
)
|
33
|
+
|
34
|
+
# For each category of linegraphs we are generating
|
35
|
+
for category in targets:
|
36
|
+
# For each graph in each category
|
37
|
+
for graph in category:
|
38
|
+
|
39
|
+
# Only try to create linegraphs (duh)
|
40
|
+
if graph["type"] != "stacked_line":
|
41
|
+
continue
|
42
|
+
|
43
|
+
_logger.trace("\n" + json.dumps(graph, indent=4)) # type: ignore
|
44
|
+
|
45
|
+
paths = graphs.PathSet(
|
46
|
+
input_root=pathset.stat_root,
|
47
|
+
output_root=pathset.graph_root,
|
48
|
+
batchroot=pathset.parent.parent,
|
49
|
+
model_root=pathset.model_root,
|
50
|
+
)
|
51
|
+
|
52
|
+
try:
|
53
|
+
# 2025-06-05 [JRH]: We always write stage {3,4} output data
|
54
|
+
# files as .csv because that is currently SIERRA's 'native'
|
55
|
+
# format; this may change in the future.
|
56
|
+
module = pm.pipeline.get_plugin_module(cmdopts["engine"])
|
57
|
+
if hasattr(module, "expsetup_from_def"):
|
58
|
+
module2 = pm.pipeline.get_plugin_module(cmdopts["expdef"])
|
59
|
+
pkl_def = module2.unpickle(pathset.input_root / config.kPickleLeaf)
|
60
|
+
|
61
|
+
info = module.expsetup_from_def(pkl_def)
|
62
|
+
xticks = np.linspace(
|
63
|
+
0,
|
64
|
+
info["duration"],
|
65
|
+
int(
|
66
|
+
info["duration"]
|
67
|
+
* info["n_ticks_per_sec"]
|
68
|
+
* cmdopts["exp_n_datapoints_factor"]
|
69
|
+
),
|
70
|
+
)
|
71
|
+
else:
|
72
|
+
xticks = None
|
73
|
+
|
74
|
+
graphs.stacked_line(
|
75
|
+
paths=paths,
|
76
|
+
input_stem=graph["src_stem"],
|
77
|
+
output_stem=graph["dest_stem"],
|
78
|
+
medium="storage.csv",
|
79
|
+
backend=graph.get("backend", cmdopts["graphs_backend"]),
|
80
|
+
xticks=xticks,
|
81
|
+
stats=cmdopts["dist_stats"],
|
82
|
+
cols=graph.get("cols", None),
|
83
|
+
title=graph.get("title", ""),
|
84
|
+
legend=graph.get("legend", graph.get("cols", None)),
|
85
|
+
xlabel=graph.get("xlabel", ""),
|
86
|
+
ylabel=graph.get("ylabel", ""),
|
87
|
+
points=graph.get("points", False),
|
88
|
+
logyscale=graph.get("logy", cmdopts["plot_log_yscale"]),
|
89
|
+
large_text=cmdopts["plot_large_text"],
|
90
|
+
)
|
91
|
+
except KeyError:
|
92
|
+
_logger.fatal(
|
93
|
+
("Could not generate linegraph. Possible reasons include: ")
|
94
|
+
)
|
95
|
+
|
96
|
+
_logger.fatal(
|
97
|
+
("1. The YAML configuration entry is missing required fields")
|
98
|
+
)
|
99
|
+
missing_cols = graph.get("cols", "MISSING_KEY")
|
100
|
+
missing_stem = graph.get("src_stem", "MISSING_KEY")
|
101
|
+
_logger.fatal(
|
102
|
+
(
|
103
|
+
"2. 'cols' is present in YAML "
|
104
|
+
"configuration but some of %s are "
|
105
|
+
"missing from %s"
|
106
|
+
),
|
107
|
+
missing_cols,
|
108
|
+
missing_stem,
|
109
|
+
)
|
110
|
+
|
111
|
+
raise
|
112
|
+
|
113
|
+
|
114
|
+
__all__ = ["generate"]
|
@@ -0,0 +1,103 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2025 John Harwell, All rights reserved.
|
3
|
+
#
|
4
|
+
# SPDX-License Identifier: MIT
|
5
|
+
#
|
6
|
+
|
7
|
+
# Core packages
|
8
|
+
import logging
|
9
|
+
import pathlib
|
10
|
+
import time
|
11
|
+
import datetime
|
12
|
+
|
13
|
+
# 3rd party packages
|
14
|
+
import yaml
|
15
|
+
|
16
|
+
# Project packages
|
17
|
+
import sierra.core.variables.batch_criteria as bc
|
18
|
+
from sierra.core import types, config, utils, batchroot
|
19
|
+
|
20
|
+
from sierra.plugins.prod.graphs import inter, intra, collate
|
21
|
+
|
22
|
+
_logger = logging.getLogger(__name__)
|
23
|
+
|
24
|
+
|
25
|
+
def proc_batch_exp(
|
26
|
+
main_config: types.YAMLDict,
|
27
|
+
cmdopts: types.Cmdopts,
|
28
|
+
pathset: batchroot.PathSet,
|
29
|
+
criteria: bc.XVarBatchCriteria,
|
30
|
+
) -> None:
|
31
|
+
"""
|
32
|
+
Generate graphs from the :term:`Batch Experiment`.
|
33
|
+
|
34
|
+
Intra-experiment graph generation: if intra-experiment graphs should be
|
35
|
+
generated, according to configuration, the following is run:
|
36
|
+
|
37
|
+
#. :py:func:`~sierra.plugins.prod.graphs.intra.generate` to
|
38
|
+
generate graphs for each experiment in the batch, or a subset.
|
39
|
+
|
40
|
+
Inter-experiment graph generation: if inter-experiment graphs should be
|
41
|
+
generated according to cmdline configuration, the following is run:
|
42
|
+
|
43
|
+
#. :class:`~sierra.plugins.prod.graphs.collate.GraphCollator`.
|
44
|
+
|
45
|
+
#. :py:func:`~sierra.plugins.prod.graphs.inter.generate` to perform
|
46
|
+
graph generation from collated CSV files.
|
47
|
+
"""
|
48
|
+
graphs_path = pathlib.Path(cmdopts["project_config_root"]) / pathlib.Path(
|
49
|
+
config.kYAML.graphs
|
50
|
+
)
|
51
|
+
if utils.path_exists(graphs_path):
|
52
|
+
_logger.info("Loading graphs config for project=%s", cmdopts["project"])
|
53
|
+
graphs_config = yaml.load(utils.utf8open(graphs_path), yaml.FullLoader)
|
54
|
+
else:
|
55
|
+
_logger.warning("%s does not exist--cannot generate graphs", graphs_path)
|
56
|
+
return
|
57
|
+
|
58
|
+
if (
|
59
|
+
(cmdopts["exp_graphs"] == "all" or cmdopts["exp_graphs"] == "intra")
|
60
|
+
and graphs_config is not None
|
61
|
+
and "intra-exp" in graphs_config
|
62
|
+
):
|
63
|
+
_logger.info("Generating intra-experiment graphs...")
|
64
|
+
start = time.time()
|
65
|
+
intra.generate.proc_batch_exp(
|
66
|
+
main_config,
|
67
|
+
cmdopts,
|
68
|
+
pathset,
|
69
|
+
criteria,
|
70
|
+
)
|
71
|
+
elapsed = int(time.time() - start)
|
72
|
+
sec = datetime.timedelta(seconds=elapsed)
|
73
|
+
_logger.info("Intra-experiment graph generation complete: %s", str(sec))
|
74
|
+
|
75
|
+
# Collation must be after intra-experiment graph generation, so that all
|
76
|
+
# .csv files to be collated have been generated/modified according to
|
77
|
+
# parameters.
|
78
|
+
if (
|
79
|
+
(cmdopts["exp_graphs"] == "all" or cmdopts["exp_graphs"] == "inter")
|
80
|
+
and graphs_config is not None
|
81
|
+
and "inter-exp" in graphs_config
|
82
|
+
):
|
83
|
+
if not cmdopts["skip_collate"]:
|
84
|
+
_logger.info("Collating inter-experiment files...")
|
85
|
+
start = time.time()
|
86
|
+
collate.proc_batch_exp(main_config, cmdopts, pathset, criteria)
|
87
|
+
elapsed = int(time.time() - start)
|
88
|
+
sec = datetime.timedelta(seconds=elapsed)
|
89
|
+
_logger.info("Collating inter-experiment files complete: %s", str(sec))
|
90
|
+
|
91
|
+
_logger.info("Generating inter-experiment graphs...")
|
92
|
+
start = time.time()
|
93
|
+
|
94
|
+
inter.generate.proc_batch_exp(
|
95
|
+
main_config,
|
96
|
+
cmdopts,
|
97
|
+
pathset,
|
98
|
+
criteria,
|
99
|
+
)
|
100
|
+
elapsed = int(time.time() - start)
|
101
|
+
sec = datetime.timedelta(seconds=elapsed)
|
102
|
+
|
103
|
+
_logger.info("Inter-experiment graph generation complete: %s", str(sec))
|
@@ -0,0 +1,63 @@
|
|
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 logging
|
10
|
+
|
11
|
+
# 3rd party packages
|
12
|
+
|
13
|
+
# Project packages
|
14
|
+
from sierra.core import types
|
15
|
+
|
16
|
+
_logger = logging.getLogger(__name__)
|
17
|
+
|
18
|
+
|
19
|
+
def inter_exp_calc(
|
20
|
+
loaded_graphs: types.YAMLDict,
|
21
|
+
controller_config: tp.Optional[types.YAMLDict],
|
22
|
+
cmdopts: types.Cmdopts,
|
23
|
+
) -> tp.List[types.YAMLDict]:
|
24
|
+
"""Calculate what inter-experiment graphs to generate.
|
25
|
+
|
26
|
+
This also defines what CSV files need to be collated, as one graph is
|
27
|
+
always generated from one CSV file. Uses YAML configuration for
|
28
|
+
controllers and inter-experiment graphs.
|
29
|
+
|
30
|
+
"""
|
31
|
+
keys = []
|
32
|
+
|
33
|
+
if controller_config:
|
34
|
+
for category in list(controller_config.keys()):
|
35
|
+
if category not in cmdopts["controller"]:
|
36
|
+
continue
|
37
|
+
for controller in controller_config[category]["controllers"]:
|
38
|
+
if dict(controller)["name"] not in cmdopts["controller"]:
|
39
|
+
continue
|
40
|
+
|
41
|
+
# valid to specify no graphs, and only to inherit graphs
|
42
|
+
keys = controller.get("graphs", [])
|
43
|
+
if "graphs_inherit" in controller:
|
44
|
+
for inherit in dict(controller)["graphs_inherit"]:
|
45
|
+
keys.extend(inherit) # optional
|
46
|
+
_logger.debug("Loaded %s inter-experiment categories: %s", len(keys), keys)
|
47
|
+
else:
|
48
|
+
keys = list(k for k in loaded_graphs)
|
49
|
+
_logger.debug(
|
50
|
+
"Missing controller graph config--generating all "
|
51
|
+
"inter-experiment graphs for all controllers: %s",
|
52
|
+
keys,
|
53
|
+
)
|
54
|
+
|
55
|
+
filtered_keys = [k for k in loaded_graphs if k in keys]
|
56
|
+
targets = [loaded_graphs[k] for k in filtered_keys]
|
57
|
+
|
58
|
+
_logger.debug(
|
59
|
+
"Enabled %s inter-experiment categories: %s",
|
60
|
+
len(filtered_keys),
|
61
|
+
filtered_keys,
|
62
|
+
)
|
63
|
+
return targets
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2024 John Harwell, All rights reserved.
|
3
|
+
#
|
4
|
+
# SPDX-License Identifier: MIT
|
5
|
+
#
|
6
|
+
"""
|
7
|
+
Container module for rendering in stage 4.
|
8
|
+
"""
|
9
|
+
|
10
|
+
# Core packages
|
11
|
+
|
12
|
+
# 3rd party packages
|
13
|
+
|
14
|
+
# Project packages
|
15
|
+
|
16
|
+
|
17
|
+
def sierra_plugin_type() -> str:
|
18
|
+
return "pipeline"
|
@@ -0,0 +1,72 @@
|
|
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
|
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 ``prod.render`` product plugin.
|
23
|
+
"""
|
24
|
+
cmdline = PluginCmdline(parents, stages)
|
25
|
+
cmdline.stage4.add_argument(
|
26
|
+
"--render-cmd-opts",
|
27
|
+
help="""
|
28
|
+
Specify the :program:`ffmpeg` options to appear between the
|
29
|
+
specification of the input image files and the specification of
|
30
|
+
the output file. The default is suitable for use with ARGoS
|
31
|
+
frame grabbing set to a frames size of 1600x1200 to output a
|
32
|
+
reasonable quality video.
|
33
|
+
"""
|
34
|
+
+ cmdline.stage_usage_doc([4]),
|
35
|
+
default="-r 10 -s:v 800x600 -c:v libx264 -crf 25 -filter:v scale=-2:956 -pix_fmt yuv420p",
|
36
|
+
)
|
37
|
+
|
38
|
+
cmdline.stage4.add_argument(
|
39
|
+
"--project-rendering",
|
40
|
+
help="""
|
41
|
+
Enable generation of videos from imagized CSV files created as
|
42
|
+
a result of running the ``proc.imagize`` plugin. See
|
43
|
+
:ref:`plugins/prod/render` for details.
|
44
|
+
"""
|
45
|
+
+ cmdline.stage_usage_doc([4]),
|
46
|
+
action="store_true",
|
47
|
+
)
|
48
|
+
|
49
|
+
cmdline.stage4.add_argument(
|
50
|
+
"--bc-rendering",
|
51
|
+
help="""
|
52
|
+
Enable generation of videos from generated graphs, such as
|
53
|
+
heatmaps. Bivariate batch criteria only.
|
54
|
+
|
55
|
+
.. versionadded:: 1.2.20
|
56
|
+
"""
|
57
|
+
+ cmdline.stage_usage_doc([4]),
|
58
|
+
action="store_true",
|
59
|
+
)
|
60
|
+
return cmdline
|
61
|
+
|
62
|
+
|
63
|
+
def to_cmdopts(args: argparse.Namespace) -> types.Cmdopts:
|
64
|
+
return {
|
65
|
+
"render_cmd_opts": args.render_cmd_opts,
|
66
|
+
"project_rendering": args.project_rendering,
|
67
|
+
"bc_rendering": args.bc_rendering,
|
68
|
+
}
|
69
|
+
|
70
|
+
|
71
|
+
def sphinx_cmdline_stage4():
|
72
|
+
return build([], [4]).parser
|