diff options
| -rwxr-xr-x | parse_exps.py | 82 | ||||
| -rwxr-xr-x | plot_exps.py | 6 |
2 files changed, 71 insertions, 17 deletions
diff --git a/parse_exps.py b/parse_exps.py index 37667aa..82febfc 100755 --- a/parse_exps.py +++ b/parse_exps.py | |||
| @@ -43,6 +43,10 @@ def parse_args(): | |||
| 43 | parser.add_option('-s', '--scale-against', dest='scale_against', | 43 | parser.add_option('-s', '--scale-against', dest='scale_against', |
| 44 | metavar='PARAM=VALUE', default="type=unmanaged", | 44 | metavar='PARAM=VALUE', default="type=unmanaged", |
| 45 | help='calculate task scaling factors against these configs') | 45 | help='calculate task scaling factors against these configs') |
| 46 | parser.add_option('-c', '--collapse', dest='collapse', | ||
| 47 | action='store_true', default=False, | ||
| 48 | help=('simplify graphs where possible by averaging ' + | ||
| 49 | 'parameter values which are numbers (dangerous)')) | ||
| 46 | 50 | ||
| 47 | return parser.parse_args() | 51 | return parser.parse_args() |
| 48 | 52 | ||
| @@ -226,30 +230,80 @@ def fill_table(table, builder, exps, opts): | |||
| 226 | sys.stderr.write('\n') | 230 | sys.stderr.write('\n') |
| 227 | 231 | ||
| 228 | 232 | ||
| 229 | def write_output(table, opts): | 233 | def write_csvs(table, out, print_empty=False): |
| 230 | reduced_table = table.reduce() | 234 | reduced_table = table.reduce() |
| 231 | 235 | ||
| 236 | # Write out csv directories for all variable params | ||
| 237 | dir_map = reduced_table.to_dir_map() | ||
| 238 | |||
| 239 | # No csvs to write, assume user meant to print out data | ||
| 240 | if dir_map.is_empty(): | ||
| 241 | if print_empty: | ||
| 242 | sys.stderr.write("Too little data to make csv files, " + | ||
| 243 | "printing results.\n") | ||
| 244 | for key, exp in table: | ||
| 245 | for e in exp: | ||
| 246 | print(e) | ||
| 247 | else: | ||
| 248 | dir_map.write(out) | ||
| 249 | |||
| 250 | |||
| 251 | def write_collapsed_csvs(table, opts): | ||
| 252 | sys.stderr.write("Collapse option specified. " | ||
| 253 | "Only one numeric column at a time will be plotted.\n" | ||
| 254 | "The values of others will be averaged. " | ||
| 255 | "This is dangerous and can hide important trends!\n") | ||
| 256 | |||
| 257 | original_map = table.get_col_map() | ||
| 258 | |||
| 259 | builder = ColMapBuilder() | ||
| 260 | numeric_cols = [] | ||
| 261 | |||
| 262 | # Add only nonnumeric fields to builder | ||
| 263 | for column in original_map.columns(): | ||
| 264 | numeric = True | ||
| 265 | for v in original_map.get_values()[column]: | ||
| 266 | try: | ||
| 267 | float(v) | ||
| 268 | except ValueError: | ||
| 269 | numeric = False | ||
| 270 | builder.try_add(column, v) | ||
| 271 | if numeric: | ||
| 272 | numeric_cols += [column] | ||
| 273 | |||
| 274 | for num_column in numeric_cols: | ||
| 275 | # Only going to consider a single number column at a time | ||
| 276 | for num_value in original_map.get_values()[column]: | ||
| 277 | builder.try_add(num_column, num_value) | ||
| 278 | |||
| 279 | next_map = builder.build() | ||
| 280 | next_table = TupleTable(next_map) | ||
| 281 | |||
| 282 | # Re-sort data into new table using this new key | ||
| 283 | for mapped_key, points in table: | ||
| 284 | kv = original_map.get_kv(mapped_key) | ||
| 285 | next_table[kv] += points | ||
| 286 | |||
| 287 | write_csvs(next_table, opts.out) | ||
| 288 | |||
| 289 | builder.try_remove(num_column) | ||
| 290 | |||
| 291 | |||
| 292 | def write_output(table, opts): | ||
| 232 | if opts.write_map: | 293 | if opts.write_map: |
| 233 | sys.stderr.write("Writing python map into %s...\n" % opts.out) | 294 | sys.stderr.write("Writing python map into %s...\n" % opts.out) |
| 295 | reduced_table = table.reduce() | ||
| 234 | reduced_table.write_map(opts.out) | 296 | reduced_table.write_map(opts.out) |
| 235 | else: | 297 | else: |
| 236 | if opts.force and os.path.exists(opts.out): | 298 | if opts.force and os.path.exists(opts.out): |
| 237 | sh.rmtree(opts.out) | 299 | sh.rmtree(opts.out) |
| 238 | 300 | ||
| 239 | # Write out csv directories for all variable params | 301 | sys.stderr.write("Writing csvs into %s...\n" % opts.out) |
| 240 | dir_map = reduced_table.to_dir_map() | 302 | |
| 241 | 303 | if opts.collapse: | |
| 242 | # No csvs to write, assume user meant to print out data | 304 | write_collapsed_csvs(table, opts) |
| 243 | if dir_map.is_empty(): | ||
| 244 | if not opts.verbose: | ||
| 245 | sys.stderr.write("Too little data to make csv files, " + | ||
| 246 | "printing results.\n") | ||
| 247 | for key, exp in table: | ||
| 248 | for e in exp: | ||
| 249 | print(e) | ||
| 250 | else: | 305 | else: |
| 251 | sys.stderr.write("Writing csvs into %s...\n" % opts.out) | 306 | write_csvs(table, opts.out, not opts.verbose) |
| 252 | dir_map.write(opts.out) | ||
| 253 | 307 | ||
| 254 | 308 | ||
| 255 | def main(): | 309 | def main(): |
diff --git a/plot_exps.py b/plot_exps.py index 15c54d0..2d6f06b 100755 --- a/plot_exps.py +++ b/plot_exps.py | |||
| @@ -85,12 +85,12 @@ def plot_by_variable(details): | |||
| 85 | axes.set_title(details.title) | 85 | axes.set_title(details.title) |
| 86 | 86 | ||
| 87 | lines, labels = zip(*style_map.get_key()) | 87 | lines, labels = zip(*style_map.get_key()) |
| 88 | axes.legend(tuple(lines), tuple(labels), prop={'size':10}) | 88 | axes.legend(tuple(lines), tuple(labels), prop={'size':10}, loc=2) |
| 89 | 89 | ||
| 90 | axes.set_ylabel(details.value) | 90 | axes.set_ylabel(details.value) |
| 91 | axes.set_xlabel(details.variable) | 91 | axes.set_xlabel(details.variable) |
| 92 | axes.set_xlim(0, axes.get_xlim()[1] + 1) | 92 | axes.set_xlim(0, axes.get_xlim()[1]) |
| 93 | axes.set_ylim(0, axes.get_ylim()[1] + 1) | 93 | axes.set_ylim(0, axes.get_ylim()[1]) |
| 94 | 94 | ||
| 95 | plot.savefig(details.out, format=OUT_FORMAT) | 95 | plot.savefig(details.out, format=OUT_FORMAT) |
| 96 | 96 | ||
