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