diff --git a/scripts/nvbench_compare.py b/scripts/nvbench_compare.py index ac2509e..80ccf2c 100755 --- a/scripts/nvbench_compare.py +++ b/scripts/nvbench_compare.py @@ -1,7 +1,6 @@ #!/usr/bin/env python import argparse -import json import math import os import sys @@ -10,6 +9,7 @@ from colorama import Fore import tabulate +from nvbench_json import reader # Parse version string into tuple, "x.y.z" -> (x, y, z) def version_tuple(v): @@ -282,9 +282,9 @@ def main(): for ref, comp in to_compare: with open(ref, "r") as ref_file: - ref_root = json.load(ref_file) + ref_root = reader.read_file(ref_file) with open(comp, "r") as cmp_file: - cmp_root = json.load(cmp_file) + cmp_root = reader.read_file(cmp_file) global all_devices all_devices = cmp_root["devices"] diff --git a/scripts/nvbench_histogram.py b/scripts/nvbench_histogram.py index 43d0060..1df17cc 100644 --- a/scripts/nvbench_histogram.py +++ b/scripts/nvbench_histogram.py @@ -6,10 +6,10 @@ import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import argparse -import json import os import sys +from nvbench_json import reader def parse_files(): help_text = "%(prog)s [nvbench.out.json | dir/] ..." @@ -76,8 +76,7 @@ def to_df(data): def parse_json(filename): - with open(filename, "r") as f: - json_root = json.load(f) + json_root = reader.read_file(filename) samples_data = {} diff --git a/scripts/nvbench_json/.gitignore b/scripts/nvbench_json/.gitignore new file mode 100644 index 0000000..96403d3 --- /dev/null +++ b/scripts/nvbench_json/.gitignore @@ -0,0 +1 @@ +__pycache__/* diff --git a/scripts/nvbench_json/__init__.py b/scripts/nvbench_json/__init__.py new file mode 100644 index 0000000..09990f1 --- /dev/null +++ b/scripts/nvbench_json/__init__.py @@ -0,0 +1,2 @@ +from . import reader +from . import version diff --git a/scripts/nvbench_json/reader.py b/scripts/nvbench_json/reader.py new file mode 100644 index 0000000..7aad521 --- /dev/null +++ b/scripts/nvbench_json/reader.py @@ -0,0 +1,10 @@ +import json + +from . import version + + +def read_file(filename): + with open(filename, "r") as f: + file_root = json.load(f) + version.check_file_version(filename, file_root) + return file_root diff --git a/scripts/nvbench_json/version.py b/scripts/nvbench_json/version.py new file mode 100644 index 0000000..be1c03f --- /dev/null +++ b/scripts/nvbench_json/version.py @@ -0,0 +1,26 @@ +file_version = (1, 0, 0) + +file_version_string = "{}.{}.{}".format(file_version[0], + file_version[1], + file_version[2]) + + +def check_file_version(filename, root_node): + try: + version_node = root_node["meta"]["version"]["json"] + except KeyError: + print("WARNING:") + print(" {} is written in an older, unversioned format. ".format(filename)) + print(" It may not read correctly.") + print(" Reader expects JSON file version {}.".format(file_version_string)) + return + + # TODO We could do something fancy here using semantic versioning, but + # for now just warn on mismatch. + if version_node["string"] != file_version_string: + print("WARNING:") + print(" {} was written using a different NVBench JSON file version." + .format(filename)) + print(" It may not read correctly.") + print(" (file version: {} reader version: {})" + .format(version_node["string"], file_version_string)) diff --git a/scripts/nvbench_walltime.py b/scripts/nvbench_walltime.py index fb044cb..18ca243 100644 --- a/scripts/nvbench_walltime.py +++ b/scripts/nvbench_walltime.py @@ -2,10 +2,11 @@ import argparse import math -import json import os import sys +from nvbench_json import reader + import tabulate @@ -111,8 +112,7 @@ def append_measure_values(row, measures, active=measure_names): def consume_file(filename): - with open(filename, "r") as f: - file_root = json.load(f) + file_root = reader.read_file(filename) file_out = {} file_measures = init_measures() @@ -349,9 +349,6 @@ def main(): data["files"] = files_out data["measures"] = measures - # Debug data structure: - # print(json.dumps(data, indent=2)) - print_overview_section(data) print_files_section(data)