# Copyright 2022 The IREE Authors
#
# Licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
import pandas as pd
_LEGEND_0 = ">10.0x better"
_LEGEND_1 = ">2.0x, <=10.0x better"
_LEGEND_2 = ">=1.0x, <=2.0x better"
_LEGEND_3 = ">1.0x, <1.15x worse"
_LEGEND_4 = ">=1.15x, <2.0x worse"
_LEGEND_5 = ">=2.0x, <10.x worse"
_LEGEND_6 = ">=10.0x worse"
def get_table_css():
styles = [
dict(selector="tr:hover", props=[("background", "#f4f4f4")]),
dict(selector="tbody tr", props=[("background-color", "#ffffff")]),
dict(selector="tbody td", props=[("border", "1px solid #dddfe1")]),
dict(
selector="th",
props=[
("background-color", "#54585d"),
("color", "#ffffff"),
("font-weight", "bold"),
("border", "1px solid #54585d"),
("padding", "10px"),
],
),
dict(selector="td", props=[("padding", "10px")]),
dict(
selector="",
props=[
("border-collapse", "collapse"),
("font-family", "Tahoma, Geneva, sans-serif"),
],
),
dict(
selector="caption",
props=[
("text-align", "center"),
("padding", "10px"),
("font-weight", "bold"),
("font-size", "1.2em"),
("color", "#636363"),
],
),
]
return styles
def style_legend(v):
if _LEGEND_0 in v:
props = "background-color: #0277BD;"
elif _LEGEND_1 in v:
props = "background-color: #2E7D32;"
elif _LEGEND_2 in v:
props = "background-color: #66BB6A;"
elif _LEGEND_3 in v:
props = "background-color: #FBC02D;"
elif _LEGEND_4 in v:
props = "background-color: #E57373;"
elif _LEGEND_5 in v:
props = "background-color: #C62828;"
else:
props = "background-color: #880E4F"
return props
def generate_header_and_legend(version_html):
html = ""
html = html + version_html
legend = pd.DataFrame(columns=[""])
legend.loc[len(legend)] = [_LEGEND_0]
legend.loc[len(legend)] = [_LEGEND_1]
legend.loc[len(legend)] = [_LEGEND_2]
legend.loc[len(legend)] = [_LEGEND_3]
legend.loc[len(legend)] = [_LEGEND_4]
legend.loc[len(legend)] = [_LEGEND_5]
legend.loc[len(legend)] = [_LEGEND_6]
styled_legend = legend.style.set_table_styles(get_table_css())
styled_legend.set_caption("Legend")
styled_legend = styled_legend.set_properties(**{"color": "#ffffff"})
styled_legend = styled_legend.set_properties(**{"width": "200px"})
styled_legend = styled_legend.applymap(style_legend)
styled_legend = styled_legend.hide(axis="index")
styled_legend = styled_legend.hide(axis="columns")
html = html + styled_legend.to_html() + "
"
return html
def style_speedup(v):
if v > 10.0:
props = "background-color: #0277BD;"
elif v > 2.0:
props = "background-color: #2E7D32;"
elif v >= 1.0:
props = "background-color: #66BB6A;"
else:
props = "background-color: #FBC02D;"
return props
def style_slowdown(v):
if v >= 10.0:
props = "background-color: #880E4F"
elif v >= 2.0:
props = "background-color: #C62828;"
elif v > 1.15:
props = "background-color: #E57373;"
else:
props = "background-color: #FBC02D;"
return props
def style_performance(v):
if "faster" in v:
return style_speedup(float(v.split("x")[0]))
else:
return style_slowdown(float(v.split("x")[0]))
def style_latency(v):
if v == "nan":
return "color: #636363"
if "faster" in v:
return style_speedup(float(v.split("x")[0]))
else:
return style_slowdown(float(v.split("x")[0]))
def style_memory(v):
if v == "nan":
return "color: #636363"
if "smaller" in v:
return style_speedup(float(v.split("x")[0]))
else:
return style_slowdown(float(v.split("x")[0]))
def format_latency_comparison(iree_latency, baseline_latency):
if iree_latency == 0 or baseline_latency == 0:
return "nan"
speedup = baseline_latency / iree_latency
slowdown = iree_latency / baseline_latency
faster_label = "{:.2f}x faster"
slower_label = "{:.2f}x slower"
latency = (
faster_label.format(speedup)
if speedup >= 1.0
else slower_label.format(slowdown)
)
return latency
def format_memory_comparison(iree_memory, baseline_memory):
if iree_memory == 0 or baseline_memory == 0:
return "nan"
smaller = baseline_memory / iree_memory
larger = iree_memory / baseline_memory
smaller_label = "{:.2f}x smaller"
larger_label = "{:0.2f}x larger"
memory = (
smaller_label.format(smaller) if smaller >= 1.0 else larger_label.format(larger)
)
return memory