123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- """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),
- ('chartDarkYellow', 0xCCCC00)
- ]
- 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 '{%s}' % 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)))
|