perf2tex.py 3.1 KB

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