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