logging.info(" Done.")
-def table_performance_improvements(table, input_data):
- """Generate the table(s) with algorithm: table_performance_improvements
- specified in the specification file.
-
- # FIXME: Not used now.
-
- :param table: Table to generate.
- :param input_data: Data to process.
- :type table: pandas.Series
- :type input_data: InputData
- """
-
- def _write_line_to_file(file_handler, data):
- """Write a line to the .csv file.
-
- :param file_handler: File handler for the csv file. It must be open for
- writing text.
- :param data: Item to be written to the file.
- :type file_handler: BinaryIO
- :type data: list
- """
-
- line_lst = list()
- for item in data:
- if isinstance(item["data"], str):
- # Remove -?drdisc from the end
- if item["data"].endswith("drdisc"):
- item["data"] = item["data"][:-8]
- line_lst.append(item["data"])
- elif isinstance(item["data"], float):
- line_lst.append("{:.1f}".format(item["data"]))
- elif item["data"] is None:
- line_lst.append("")
- file_handler.write(",".join(line_lst) + "\n")
-
- logging.info(" Generating the table {0} ...".
- format(table.get("title", "")))
-
- # Read the template
- file_name = table.get("template", None)
- if file_name:
- try:
- tmpl = _read_csv_template(file_name)
- except PresentationError:
- logging.error(" The template '{0}' does not exist. Skipping the "
- "table.".format(file_name))
- return None
- else:
- logging.error("The template is not defined. Skipping the table.")
- return None
-
- # Transform the data
- logging.info(" Creating the data set for the {0} '{1}'.".
- format(table.get("type", ""), table.get("title", "")))
- data = input_data.filter_data(table)
-
- # Prepare the header of the tables
- header = list()
- for column in table["columns"]:
- header.append(column["title"])
-
- # Generate the data for the table according to the model in the table
- # specification
- tbl_lst = list()
- for tmpl_item in tmpl:
- tbl_item = list()
- for column in table["columns"]:
- cmd = column["data"].split(" ")[0]
- args = column["data"].split(" ")[1:]
- if cmd == "template":
- try:
- val = float(tmpl_item[int(args[0])])
- except ValueError:
- val = tmpl_item[int(args[0])]
- tbl_item.append({"data": val})
- elif cmd == "data":
- jobs = args[0:-1]
- operation = args[-1]
- data_lst = list()
- for job in jobs:
- for build in data[job]:
- try:
- data_lst.append(float(build[tmpl_item[0]]
- ["throughput"]["value"]))
- except (KeyError, TypeError):
- # No data, ignore
- continue
- if data_lst:
- tbl_item.append({"data": (eval(operation)(data_lst)) /
- 1000000})
- else:
- tbl_item.append({"data": None})
- elif cmd == "operation":
- operation = args[0]
- try:
- nr1 = float(tbl_item[int(args[1])]["data"])
- nr2 = float(tbl_item[int(args[2])]["data"])
- if nr1 and nr2:
- tbl_item.append({"data": eval(operation)(nr1, nr2)})
- else:
- tbl_item.append({"data": None})
- except (IndexError, ValueError, TypeError):
- logging.error("No data for {0}".format(tbl_item[0]["data"]))
- tbl_item.append({"data": None})
- continue
- else:
- logging.error("Not supported command {0}. Skipping the table.".
- format(cmd))
- return None
- tbl_lst.append(tbl_item)
-
- # Sort the table according to the relative change
- tbl_lst.sort(key=lambda rel: rel[-1]["data"], reverse=True)
-
- # Create the tables and write them to the files
- file_names = [
- "{0}_ndr_top{1}".format(table["output-file"], table["output-file-ext"]),
- "{0}_pdr_top{1}".format(table["output-file"], table["output-file-ext"]),
- "{0}_ndr_low{1}".format(table["output-file"], table["output-file-ext"]),
- "{0}_pdr_low{1}".format(table["output-file"], table["output-file-ext"])
- ]
-
- for file_name in file_names:
- logging.info(" Writing the file '{0}'".format(file_name))
- with open(file_name, "w") as file_handler:
- file_handler.write(",".join(header) + "\n")
- for item in tbl_lst:
- if isinstance(item[-1]["data"], float):
- rel_change = round(item[-1]["data"], 1)
- else:
- rel_change = item[-1]["data"]
- if "ndr_top" in file_name \
- and "ndr" in item[0]["data"] \
- and rel_change >= 10.0:
- _write_line_to_file(file_handler, item)
- elif "pdr_top" in file_name \
- and "pdr" in item[0]["data"] \
- and rel_change >= 10.0:
- _write_line_to_file(file_handler, item)
- elif "ndr_low" in file_name \
- and "ndr" in item[0]["data"] \
- and rel_change < 10.0:
- _write_line_to_file(file_handler, item)
- elif "pdr_low" in file_name \
- and "pdr" in item[0]["data"] \
- and rel_change < 10.0:
- _write_line_to_file(file_handler, item)
-
- logging.info(" Done.")
-
-
-def _read_csv_template(file_name):
- """Read the template from a .csv file.
-
- :param file_name: Name / full path / relative path of the file to read.
- :type file_name: str
- :returns: Data from the template as list (lines) of lists (items on line).
- :rtype: list
- :raises: PresentationError if it is not possible to read the file.
- """
-
- try:
- with open(file_name, 'r') as csv_file:
- tmpl_data = list()
- for line in csv_file:
- tmpl_data.append(line[:-1].split(","))
- return tmpl_data
- except IOError as err:
- raise PresentationError(str(err), level="ERROR")
-
-
def table_performance_comparison(table, input_data):
"""Generate the table(s) with algorithm: table_performance_comparison
specified in the specification file.
try:
header = ["Test case", ]
+ if table["include-tests"] == "MRR":
+ hdr_param = "Receive Rate"
+ else:
+ hdr_param = "Throughput"
+
history = table.get("history", None)
if history:
for item in history:
header.extend(
- ["{0} Throughput [Mpps]".format(item["title"]),
+ ["{0} {1} [Mpps]".format(item["title"], hdr_param),
"{0} Stdev [Mpps]".format(item["title"])])
header.extend(
- ["{0} Throughput [Mpps]".format(table["reference"]["title"]),
+ ["{0} {1} [Mpps]".format(table["reference"]["title"], hdr_param),
"{0} Stdev [Mpps]".format(table["reference"]["title"]),
- "{0} Throughput [Mpps]".format(table["compare"]["title"]),
+ "{0} {1} [Mpps]".format(table["compare"]["title"], hdr_param),
"{0} Stdev [Mpps]".format(table["compare"]["title"]),
- "Change [%]"])
+ "Delta [%]"])
header_str = ",".join(header) + "\n"
except (AttributeError, KeyError) as err:
logging.error("The model is invalid, missing parameter: {0}".
for job, builds in table["reference"]["data"].items():
for build in builds:
for tst_name, tst_data in data[job][str(build)].iteritems():
- if tbl_dict.get(tst_name, None) is None:
+ tst_name_mod = tst_name.replace("-ndrpdrdisc", "").\
+ replace("-ndrpdr", "").replace("-pdrdisc", "").\
+ replace("-ndrdisc", "").replace("-pdr", "").\
+ replace("-ndr", "").\
+ replace("1t1c", "1c").replace("2t1c", "1c").\
+ replace("2t2c", "2c").replace("4t2c", "2c").\
+ replace("4t4c", "4c").replace("8t4c", "4c")
+ if tbl_dict.get(tst_name_mod, None) is None:
name = "{0}-{1}".format(tst_data["parent"].split("-")[0],
"-".join(tst_data["name"].
- split("-")[1:]))
- tbl_dict[tst_name] = {"name": name,
- "ref-data": list(),
- "cmp-data": list()}
+ split("-")[:-1]))
+ if "comparison across testbeds" in table["title"].lower():
+ name = name.\
+ replace("1t1c", "1c").replace("2t1c", "1c").\
+ replace("2t2c", "2c").replace("4t2c", "2c").\
+ replace("4t4c", "4c").replace("8t4c", "4c")
+ tbl_dict[tst_name_mod] = {"name": name,
+ "ref-data": list(),
+ "cmp-data": list()}
try:
- tbl_dict[tst_name]["ref-data"].\
- append(tst_data["throughput"]["value"])
+ # TODO: Re-work when NDRPDRDISC tests are not used
+ if table["include-tests"] == "MRR":
+ tbl_dict[tst_name_mod]["ref-data"]. \
+ append(tst_data["result"]["receive-rate"].avg)
+ elif table["include-tests"] == "PDR":
+ if tst_data["type"] == "PDR":
+ tbl_dict[tst_name_mod]["ref-data"]. \
+ append(tst_data["throughput"]["value"])
+ elif tst_data["type"] == "NDRPDR":
+ tbl_dict[tst_name_mod]["ref-data"].append(
+ tst_data["throughput"]["PDR"]["LOWER"])
+ elif table["include-tests"] == "NDR":
+ if tst_data["type"] == "NDR":
+ tbl_dict[tst_name_mod]["ref-data"]. \
+ append(tst_data["throughput"]["value"])
+ elif tst_data["type"] == "NDRPDR":
+ tbl_dict[tst_name_mod]["ref-data"].append(
+ tst_data["throughput"]["NDR"]["LOWER"])
+ else:
+ continue
except TypeError:
pass # No data in output.xml for this test
for job, builds in table["compare"]["data"].items():
for build in builds:
for tst_name, tst_data in data[job][str(build)].iteritems():
+ tst_name_mod = tst_name.replace("-ndrpdrdisc", ""). \
+ replace("-ndrpdr", "").replace("-pdrdisc", ""). \
+ replace("-ndrdisc", "").replace("-pdr", ""). \
+ replace("-ndr", "").\
+ replace("1t1c", "1c").replace("2t1c", "1c").\
+ replace("2t2c", "2c").replace("4t2c", "2c").\
+ replace("4t4c", "4c").replace("8t4c", "4c")
try:
- tbl_dict[tst_name]["cmp-data"].\
- append(tst_data["throughput"]["value"])
+ # TODO: Re-work when NDRPDRDISC tests are not used
+ if table["include-tests"] == "MRR":
+ tbl_dict[tst_name_mod]["cmp-data"]. \
+ append(tst_data["result"]["receive-rate"].avg)
+ elif table["include-tests"] == "PDR":
+ if tst_data["type"] == "PDR":
+ tbl_dict[tst_name_mod]["cmp-data"]. \
+ append(tst_data["throughput"]["value"])
+ elif tst_data["type"] == "NDRPDR":
+ tbl_dict[tst_name_mod]["cmp-data"].append(
+ tst_data["throughput"]["PDR"]["LOWER"])
+ elif table["include-tests"] == "NDR":
+ if tst_data["type"] == "NDR":
+ tbl_dict[tst_name_mod]["cmp-data"]. \
+ append(tst_data["throughput"]["value"])
+ elif tst_data["type"] == "NDRPDR":
+ tbl_dict[tst_name_mod]["cmp-data"].append(
+ tst_data["throughput"]["NDR"]["LOWER"])
+ else:
+ continue
except KeyError:
pass
except TypeError:
- tbl_dict.pop(tst_name, None)
+ tbl_dict.pop(tst_name_mod, None)
if history:
for item in history:
for job, builds in item["data"].items():
for build in builds:
for tst_name, tst_data in data[job][str(build)].iteritems():
- if tbl_dict.get(tst_name, None) is None:
+ tst_name_mod = tst_name.replace("-ndrpdrdisc", ""). \
+ replace("-ndrpdr", "").replace("-pdrdisc", ""). \
+ replace("-ndrdisc", "").replace("-pdr", ""). \
+ replace("-ndr", "").\
+ replace("1t1c", "1c").replace("2t1c", "1c").\
+ replace("2t2c", "2c").replace("4t2c", "2c").\
+ replace("4t4c", "4c").replace("8t4c", "4c")
+ if tbl_dict.get(tst_name_mod, None) is None:
continue
- if tbl_dict[tst_name].get("history", None) is None:
- tbl_dict[tst_name]["history"] = OrderedDict()
- if tbl_dict[tst_name]["history"].get(item["title"],
+ if tbl_dict[tst_name_mod].get("history", None) is None:
+ tbl_dict[tst_name_mod]["history"] = OrderedDict()
+ if tbl_dict[tst_name_mod]["history"].get(item["title"],
None) is None:
- tbl_dict[tst_name]["history"][item["title"]] = \
+ tbl_dict[tst_name_mod]["history"][item["title"]] = \
list()
try:
- tbl_dict[tst_name]["history"][item["title"]].\
- append(tst_data["throughput"]["value"])
+ # TODO: Re-work when NDRPDRDISC tests are not used
+ if table["include-tests"] == "MRR":
+ tbl_dict[tst_name_mod]["history"][item["title"
+ ]].append(tst_data["result"]["receive-rate"].
+ avg)
+ elif table["include-tests"] == "PDR":
+ if tst_data["type"] == "PDR":
+ tbl_dict[tst_name_mod]["history"][
+ item["title"]].\
+ append(tst_data["throughput"]["value"])
+ elif tst_data["type"] == "NDRPDR":
+ tbl_dict[tst_name_mod]["history"][item[
+ "title"]].append(tst_data["throughput"][
+ "PDR"]["LOWER"])
+ elif table["include-tests"] == "NDR":
+ if tst_data["type"] == "NDR":
+ tbl_dict[tst_name_mod]["history"][
+ item["title"]].\
+ append(tst_data["throughput"]["value"])
+ elif tst_data["type"] == "NDRPDR":
+ tbl_dict[tst_name_mod]["history"][item[
+ "title"]].append(tst_data["throughput"][
+ "NDR"]["LOWER"])
+ else:
+ continue
except (TypeError, KeyError):
pass
# Sort the table according to the relative change
tbl_lst.sort(key=lambda rel: rel[-1], reverse=True)
- # Generate tables:
- # All tests in csv:
- tbl_names = ["{0}-ndr-1t1c-full{1}".format(table["output-file"],
- table["output-file-ext"]),
- "{0}-ndr-2t2c-full{1}".format(table["output-file"],
- table["output-file-ext"]),
- "{0}-ndr-4t4c-full{1}".format(table["output-file"],
- table["output-file-ext"]),
- "{0}-pdr-1t1c-full{1}".format(table["output-file"],
- table["output-file-ext"]),
- "{0}-pdr-2t2c-full{1}".format(table["output-file"],
- table["output-file-ext"]),
- "{0}-pdr-4t4c-full{1}".format(table["output-file"],
- table["output-file-ext"])
- ]
- for file_name in tbl_names:
- logging.info(" Writing file: '{0}'".format(file_name))
- with open(file_name, "w") as file_handler:
- file_handler.write(header_str)
- for test in tbl_lst:
- if (file_name.split("-")[-3] in test[0] and # NDR vs PDR
- file_name.split("-")[-2] in test[0]): # cores
- test[0] = "-".join(test[0].split("-")[:-1])
- file_handler.write(",".join([str(item) for item in test]) +
- "\n")
-
- # All tests in txt:
- tbl_names_txt = ["{0}-ndr-1t1c-full.txt".format(table["output-file"]),
- "{0}-ndr-2t2c-full.txt".format(table["output-file"]),
- "{0}-ndr-4t4c-full.txt".format(table["output-file"]),
- "{0}-pdr-1t1c-full.txt".format(table["output-file"]),
- "{0}-pdr-2t2c-full.txt".format(table["output-file"]),
- "{0}-pdr-4t4c-full.txt".format(table["output-file"])
- ]
-
- for i, txt_name in enumerate(tbl_names_txt):
- logging.info(" Writing file: '{0}'".format(txt_name))
- convert_csv_to_pretty_txt(tbl_names[i], txt_name)
-
- # Selected tests in csv:
- input_file = "{0}-ndr-1t1c-full{1}".format(table["output-file"],
- table["output-file-ext"])
- with open(input_file, "r") as in_file:
- lines = list()
- for line in in_file:
- lines.append(line)
-
- output_file = "{0}-ndr-1t1c-top{1}".format(table["output-file"],
- table["output-file-ext"])
- logging.info(" Writing file: '{0}'".format(output_file))
- with open(output_file, "w") as out_file:
- out_file.write(header_str)
- for i, line in enumerate(lines[1:]):
- if i == table["nr-of-tests-shown"]:
- break
- out_file.write(line)
-
- output_file = "{0}-ndr-1t1c-bottom{1}".format(table["output-file"],
- table["output-file-ext"])
- logging.info(" Writing file: '{0}'".format(output_file))
- with open(output_file, "w") as out_file:
- out_file.write(header_str)
- for i, line in enumerate(lines[-1:0:-1]):
- if i == table["nr-of-tests-shown"]:
- break
- out_file.write(line)
-
- input_file = "{0}-pdr-1t1c-full{1}".format(table["output-file"],
- table["output-file-ext"])
- with open(input_file, "r") as in_file:
- lines = list()
- for line in in_file:
- lines.append(line)
-
- output_file = "{0}-pdr-1t1c-top{1}".format(table["output-file"],
- table["output-file-ext"])
- logging.info(" Writing file: '{0}'".format(output_file))
- with open(output_file, "w") as out_file:
- out_file.write(header_str)
- for i, line in enumerate(lines[1:]):
- if i == table["nr-of-tests-shown"]:
- break
- out_file.write(line)
-
- output_file = "{0}-pdr-1t1c-bottom{1}".format(table["output-file"],
- table["output-file-ext"])
- logging.info(" Writing file: '{0}'".format(output_file))
- with open(output_file, "w") as out_file:
- out_file.write(header_str)
- for i, line in enumerate(lines[-1:0:-1]):
- if i == table["nr-of-tests-shown"]:
- break
- out_file.write(line)
-
-
-def table_performance_comparison_mrr(table, input_data):
- """Generate the table(s) with algorithm: table_performance_comparison_mrr
- specified in the specification file.
-
- :param table: Table to generate.
- :param input_data: Data to process.
- :type table: pandas.Series
- :type input_data: InputData
- """
-
- logging.info(" Generating the table {0} ...".
- format(table.get("title", "")))
-
- # Transform the data
- logging.info(" Creating the data set for the {0} '{1}'.".
- format(table.get("type", ""), table.get("title", "")))
- data = input_data.filter_data(table, continue_on_error=True)
-
- # Prepare the header of the tables
- try:
- header = ["Test case",
- "{0} Throughput [Mpps]".format(table["reference"]["title"]),
- "{0} stdev [Mpps]".format(table["reference"]["title"]),
- "{0} Throughput [Mpps]".format(table["compare"]["title"]),
- "{0} stdev [Mpps]".format(table["compare"]["title"]),
- "Change [%]"]
- header_str = ",".join(header) + "\n"
- except (AttributeError, KeyError) as err:
- logging.error("The model is invalid, missing parameter: {0}".
- format(err))
- return
-
- # Prepare data to the table:
- tbl_dict = dict()
- for job, builds in table["reference"]["data"].items():
- for build in builds:
- for tst_name, tst_data in data[job][str(build)].iteritems():
- if tbl_dict.get(tst_name, None) is None:
- name = "{0}-{1}".format(tst_data["parent"].split("-")[0],
- "-".join(tst_data["name"].
- split("-")[1:]))
- tbl_dict[tst_name] = {"name": name,
- "ref-data": list(),
- "cmp-data": list()}
- try:
- tbl_dict[tst_name]["ref-data"].\
- append(tst_data["result"]["receive-rate"].avg)
- except TypeError:
- pass # No data in output.xml for this test
-
- for job, builds in table["compare"]["data"].items():
- for build in builds:
- for tst_name, tst_data in data[job][str(build)].iteritems():
- try:
- tbl_dict[tst_name]["cmp-data"].\
- append(tst_data["result"]["receive-rate"].avg)
- except KeyError:
- pass
- except TypeError:
- tbl_dict.pop(tst_name, None)
-
- tbl_lst = list()
- for tst_name in tbl_dict.keys():
- item = [tbl_dict[tst_name]["name"], ]
- data_t = tbl_dict[tst_name]["ref-data"]
- if data_t:
- item.append(round(mean(data_t) / 1000000, 2))
- item.append(round(stdev(data_t) / 1000000, 2))
- else:
- item.extend([None, None])
- data_t = tbl_dict[tst_name]["cmp-data"]
- if data_t:
- item.append(round(mean(data_t) / 1000000, 2))
- item.append(round(stdev(data_t) / 1000000, 2))
- else:
- item.extend([None, None])
- if item[1] is not None and item[3] is not None and item[1] != 0:
- item.append(int(relative_change(float(item[1]), float(item[3]))))
- if len(item) == 6:
- tbl_lst.append(item)
-
- # Sort the table according to the relative change
- tbl_lst.sort(key=lambda rel: rel[-1], reverse=True)
+ # Generate csv tables:
+ csv_file = "{0}.csv".format(table["output-file"])
+ with open(csv_file, "w") as file_handler:
+ file_handler.write(header_str)
+ for test in tbl_lst:
+ file_handler.write(",".join([str(item) for item in test]) + "\n")
- # Generate tables:
- # All tests in csv:
- tbl_names = ["{0}-1t1c-full{1}".format(table["output-file"],
- table["output-file-ext"]),
- "{0}-2t2c-full{1}".format(table["output-file"],
- table["output-file-ext"]),
- "{0}-4t4c-full{1}".format(table["output-file"],
- table["output-file-ext"])
- ]
- for file_name in tbl_names:
- logging.info(" Writing file: '{0}'".format(file_name))
- with open(file_name, "w") as file_handler:
- file_handler.write(header_str)
- for test in tbl_lst:
- if file_name.split("-")[-2] in test[0]: # cores
- test[0] = "-".join(test[0].split("-")[:-1])
- file_handler.write(",".join([str(item) for item in test]) +
- "\n")
-
- # All tests in txt:
- tbl_names_txt = ["{0}-1t1c-full.txt".format(table["output-file"]),
- "{0}-2t2c-full.txt".format(table["output-file"]),
- "{0}-4t4c-full.txt".format(table["output-file"])
- ]
-
- for i, txt_name in enumerate(tbl_names_txt):
- logging.info(" Writing file: '{0}'".format(txt_name))
- convert_csv_to_pretty_txt(tbl_names[i], txt_name)
+ convert_csv_to_pretty_txt(csv_file, "{0}.txt".format(table["output-file"]))
def table_performance_trending_dashboard(table, input_data):
continue
if tbl_dict.get(tst_name, None) is None:
name = "{0}-{1}".format(tst_data["parent"].split("-")[0],
- "-".join(tst_data["name"].
- split("-")[1:]))
+ tst_data["name"])
tbl_dict[tst_name] = {"name": name,
"data": OrderedDict()}
try:
- tbl_dict[tst_name]["data"][str(build)] = \
+ tbl_dict[tst_name]["data"][str(build)] = \
tst_data["result"]["receive-rate"]
except (TypeError, KeyError):
pass # No data in output.xml for this test
continue
if tbl_dict.get(tst_name, None) is None:
name = "{0}-{1}".format(tst_data["parent"].split("-")[0],
- "-".join(tst_data["name"].
- split("-")[1:]))
+ tst_data["name"])
tbl_dict[tst_name] = {"name": name,
"data": OrderedDict()}
try: