|
@@ -0,0 +1,101 @@
|
|
|
+"""Converts performance data files (as produced by utils.py) to LaTeX charts."""
|
|
|
+
|
|
|
+import utils
|
|
|
+
|
|
|
+# Generated LaTeX is based on the accepted answer to
|
|
|
+# http://tex.stackexchange.com/questions/101320/grouped-bar-chart
|
|
|
+
|
|
|
+# pylint: disable=I0011,W0141
|
|
|
+
|
|
|
+LATEX_COLORS = [
|
|
|
+ ('chartBlue', 0x4F81BD),
|
|
|
+ ('chartRed', 0xC0504D),
|
|
|
+ ('chartGreen', 0x9BBB59),
|
|
|
+ ('chartPurple', 0x9F4C7C)
|
|
|
+]
|
|
|
+
|
|
|
+LATEX_HEADER = r"""\documentclass[12pt,a4paper,onecolumn,openright]{report}
|
|
|
+\usepackage{xcolor}
|
|
|
+\usepackage{pgfplots}
|
|
|
+\usepackage{tikz}
|
|
|
+\usepgfplotslibrary{units}
|
|
|
+
|
|
|
+% Define bar chart colors
|
|
|
+%"""
|
|
|
+
|
|
|
+LATEX_DOCUMENT_HEADER = r"""\begin{document}
|
|
|
+\begin{tikzpicture}"""
|
|
|
+
|
|
|
+LATEX_DOCUMENT_FOOTER = r"""\end{tikzpicture}
|
|
|
+\end{document}"""
|
|
|
+
|
|
|
+def encode_latex_string(value):
|
|
|
+ """Encodes the given string as a LaTeX string."""
|
|
|
+ # I guess this is good enough for now. This may need to be
|
|
|
+ # revisited if we encounter more complicated names.
|
|
|
+ return value.replace('_', '\\_')
|
|
|
+
|
|
|
+def assemble_latex_chart(optimization_levels, color_defs, test_names, data):
|
|
|
+ """Assembles a LaTeX chart from the given components."""
|
|
|
+ lines = []
|
|
|
+ lines.append(LATEX_HEADER)
|
|
|
+ for color in color_defs:
|
|
|
+ lines.append(r'\definecolor{%s}{HTML}{%X}' % color)
|
|
|
+ lines.append(LATEX_DOCUMENT_HEADER)
|
|
|
+ lines.append(r"""
|
|
|
+ \begin{axis}[
|
|
|
+ width = 0.85*\textwidth,
|
|
|
+ height = 8cm,
|
|
|
+ major x tick style = transparent,
|
|
|
+ ybar=2*\pgflinewidth,
|
|
|
+ bar width=14pt,
|
|
|
+ ymajorgrids = true,
|
|
|
+ ylabel = {Run time},
|
|
|
+ symbolic x coords={%s},
|
|
|
+ xtick = data,
|
|
|
+ scaled y ticks = false,
|
|
|
+ enlarge x limits=0.25,
|
|
|
+ ymin=0,
|
|
|
+ y unit=s,
|
|
|
+ legend cell align=left,
|
|
|
+ legend style={
|
|
|
+ at={(1,1.05)},
|
|
|
+ anchor=south east,
|
|
|
+ column sep=1ex
|
|
|
+ }
|
|
|
+ ]""" % ','.join(map(encode_latex_string, test_names)))
|
|
|
+ for color_name, points in data:
|
|
|
+ lines.append(r"""
|
|
|
+ \addplot[style={%s,fill=%s,mark=none}]
|
|
|
+ coordinates {%s};""" % (
|
|
|
+ color_name, color_name,
|
|
|
+ ' '.join([('(%s,%s)' % (encode_latex_string(name), measurement))
|
|
|
+ for name, measurement in points])))
|
|
|
+ lines.append(r"""
|
|
|
+ \legend{%s}""" % ','.join(map(encode_latex_string, optimization_levels)))
|
|
|
+ lines.append(r"""
|
|
|
+ \end{axis}""")
|
|
|
+ lines.append(LATEX_DOCUMENT_FOOTER)
|
|
|
+ return '\n'.join(lines)
|
|
|
+
|
|
|
+def create_latex_chart(perf_data):
|
|
|
+ """Creates a LaTeX chart for the given performance data."""
|
|
|
+ unused_colors = LATEX_COLORS[:]
|
|
|
+ opt_levels = []
|
|
|
+ color_defs = []
|
|
|
+ test_names = []
|
|
|
+ data = []
|
|
|
+ for optimization_level, measurements in perf_data:
|
|
|
+ color = unused_colors.pop(0)
|
|
|
+ color_name, _ = color
|
|
|
+ opt_levels.append(optimization_level)
|
|
|
+ color_defs.append(color)
|
|
|
+ data.append((color_name, measurements))
|
|
|
+ for name, _ in measurements:
|
|
|
+ if name not in test_names:
|
|
|
+ test_names.append(name)
|
|
|
+
|
|
|
+ return assemble_latex_chart(opt_levels, color_defs, test_names, data)
|
|
|
+
|
|
|
+if __name__ == '__main__':
|
|
|
+ print(create_latex_chart(utils.parse_perf_data(utils.DEFAULT_PERF_FILE_NAME)))
|