perf2tex.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. """Converts performance data files (as produced by utils.py) to LaTeX charts."""
  2. import utils
  3. # Generated LaTeX is based on the accepted answer to
  4. # http://tex.stackexchange.com/questions/101320/grouped-bar-chart
  5. # pylint: disable=I0011,W0141
  6. LATEX_COLORS = [
  7. ('chartBlue', 0x4F81BD),
  8. ('chartRed', 0xC0504D),
  9. ('chartGreen', 0x9BBB59),
  10. ('chartPurple', 0x9F4C7C),
  11. ('chartDarkYellow', 0xCCCC00)
  12. ]
  13. LATEX_HEADER = r"""\documentclass[12pt,a4paper,onecolumn,openright]{report}
  14. \usepackage{xcolor}
  15. \usepackage{pgfplots}
  16. \usepackage{tikz}
  17. \usepgfplotslibrary{units}
  18. % Define bar chart colors
  19. %"""
  20. LATEX_DOCUMENT_HEADER = r"""\begin{document}
  21. \begin{tikzpicture}"""
  22. LATEX_DOCUMENT_FOOTER = r"""\end{tikzpicture}
  23. \end{document}"""
  24. def encode_latex_string(value):
  25. """Encodes the given string as a LaTeX string."""
  26. # I guess this is good enough for now. This may need to be
  27. # revisited if we encounter more complicated names.
  28. return '{%s}' % value.replace('_', '\\_')
  29. def assemble_latex_chart(optimization_levels, color_defs, test_names, data):
  30. """Assembles a LaTeX chart from the given components."""
  31. lines = []
  32. lines.append(LATEX_HEADER)
  33. for color in color_defs:
  34. lines.append(r'\definecolor{%s}{HTML}{%X}' % color)
  35. lines.append(LATEX_DOCUMENT_HEADER)
  36. lines.append(r"""
  37. \begin{axis}[
  38. width = 0.85*\textwidth,
  39. height = 8cm,
  40. major x tick style = transparent,
  41. ybar=2*\pgflinewidth,
  42. bar width=14pt,
  43. ymajorgrids = true,
  44. ylabel = {Run time},
  45. symbolic x coords={%s},
  46. xtick = data,
  47. scaled y ticks = false,
  48. enlarge x limits=0.25,
  49. ymin=0,
  50. y unit=s,
  51. legend cell align=left,
  52. legend style={
  53. at={(1,1.05)},
  54. anchor=south east,
  55. column sep=1ex
  56. }
  57. ]""" % ','.join(map(encode_latex_string, test_names)))
  58. for color_name, points in data:
  59. lines.append(r"""
  60. \addplot[style={%s,fill=%s,mark=none}]
  61. coordinates {%s};""" % (
  62. color_name, color_name,
  63. ' '.join([('(%s,%s)' % (encode_latex_string(name), measurement))
  64. for name, measurement in points])))
  65. lines.append(r"""
  66. \legend{%s}""" % ','.join(map(encode_latex_string, optimization_levels)))
  67. lines.append(r"""
  68. \end{axis}""")
  69. lines.append(LATEX_DOCUMENT_FOOTER)
  70. return '\n'.join(lines)
  71. def create_latex_chart(perf_data):
  72. """Creates a LaTeX chart for the given performance data."""
  73. unused_colors = LATEX_COLORS[:]
  74. opt_levels = []
  75. color_defs = []
  76. test_names = []
  77. data = []
  78. for optimization_level, measurements in perf_data:
  79. color = unused_colors.pop(0)
  80. color_name, _ = color
  81. opt_levels.append(optimization_level)
  82. color_defs.append(color)
  83. data.append((color_name, measurements))
  84. for name, _ in measurements:
  85. if name not in test_names:
  86. test_names.append(name)
  87. return assemble_latex_chart(opt_levels, color_defs, test_names, data)
  88. if __name__ == '__main__':
  89. print(create_latex_chart(utils.parse_perf_data(utils.DEFAULT_PERF_FILE_NAME)))