UTI: Normalize trending data
[csit.git] / resources / tools / dash / app / pal / report / graphs.py
index 42ae079..0543193 100644 (file)
@@ -24,6 +24,23 @@ import hdrh.histogram
 import hdrh.codec
 
 
+_NORM_FREQUENCY = 2.0  # [GHz]
+_FREQURENCY = {  # [GHz]
+    "2n-aws": 1.000,
+    "2n-dnv": 2.000,
+    "2n-clx": 2.300,
+    "2n-icx": 2.600,
+    "2n-skx": 2.500,
+    "2n-tx2": 2.500,
+    "2n-zn2": 2.900,
+    "3n-alt": 3.000,
+    "3n-aws": 1.000,
+    "3n-dnv": 2.000,
+    "3n-icx": 2.600,
+    "3n-skx": 2.500,
+    "3n-tsh": 2.200
+}
+
 _VALUE = {
     "mrr": "result_receive_rate_rate_values",
     "ndr": "result_ndr_lower_rate_value",
@@ -51,16 +68,15 @@ _LAT_HDRH = (  # Do not change the order
 PERCENTILE_MAX = 99.999501
 
 _GRAPH_LAT_HDRH_DESC = {
-    u"result_latency_forward_pdr_0_hdrh": u"No-load.",
-    u"result_latency_reverse_pdr_0_hdrh": u"No-load.",
-    u"result_latency_forward_pdr_10_hdrh": u"Low-load, 10% PDR.",
-    u"result_latency_reverse_pdr_10_hdrh": u"Low-load, 10% PDR.",
-    u"result_latency_forward_pdr_50_hdrh": u"Mid-load, 50% PDR.",
-    u"result_latency_reverse_pdr_50_hdrh": u"Mid-load, 50% PDR.",
-    u"result_latency_forward_pdr_90_hdrh": u"High-load, 90% PDR.",
-    u"result_latency_reverse_pdr_90_hdrh": u"High-load, 90% PDR."
+    "result_latency_forward_pdr_0_hdrh": "No-load.",
+    "result_latency_reverse_pdr_0_hdrh": "No-load.",
+    "result_latency_forward_pdr_10_hdrh": "Low-load, 10% PDR.",
+    "result_latency_reverse_pdr_10_hdrh": "Low-load, 10% PDR.",
+    "result_latency_forward_pdr_50_hdrh": "Mid-load, 50% PDR.",
+    "result_latency_reverse_pdr_50_hdrh": "Mid-load, 50% PDR.",
+    "result_latency_forward_pdr_90_hdrh": "High-load, 90% PDR.",
+    "result_latency_reverse_pdr_90_hdrh": "High-load, 90% PDR."
 }
-REG_EX_VPP_VERSION = re.compile(r"^(\d{2}).(\d{2})-(rc0|rc1|rc2|release$)")
 
 
 def _get_color(idx: int) -> str:
@@ -83,10 +99,15 @@ def get_short_version(version: str, dut_type: str="vpp") -> str:
         return version
 
     s_version = str()
-    groups = re.search(pattern=REG_EX_VPP_VERSION, string=version)
+    groups = re.search(
+        pattern=re.compile(r"^(\d{2}).(\d{2})-(rc0|rc1|rc2|release$)"),
+        string=version
+    )
     if groups:
         try:
-            s_version = f"{groups.group(1)}.{groups.group(2)}_{groups.group(3)}"
+            s_version = \
+                f"{groups.group(1)}.{groups.group(2)}.{groups.group(3)}".\
+                    replace("release", "rls")
         except IndexError:
             pass
 
@@ -132,14 +153,16 @@ def select_iterative_data(data: pd.DataFrame, itm:dict) -> pd.DataFrame:
         f"^.*[.|-]{nic}.*{itm['framesize']}-{core}-{drv}{itm['test']}-{ttype}$"
     df = df[
         (df.job.str.endswith(f"{topo}-{arch}")) &
-        (df.dut_version.str.contains(itm["dutver"].replace("_", "-"))) &
+        (df.dut_version.str.contains(itm["dutver"].replace(".r", "-r").\
+            replace("rls", "release"))) &
         (df.test_id.str.contains(regex_test, regex=True))
     ]
 
     return df
 
 
-def graph_iterative(data: pd.DataFrame, sel:dict, layout: dict) -> tuple:
+def graph_iterative(data: pd.DataFrame, sel:dict, layout: dict,
+        normalize: bool) -> tuple:
     """
     """
 
@@ -151,15 +174,25 @@ def graph_iterative(data: pd.DataFrame, sel:dict, layout: dict) -> tuple:
     lat_traces = list()
     y_lat_max = 0
     x_lat = list()
+    show_latency = False
+    show_tput = False
     for idx, itm in enumerate(sel):
         itm_data = select_iterative_data(data, itm)
+        if itm_data.empty:
+            continue
+        phy = itm["phy"].split("-")
+        topo_arch = f"{phy[0]}-{phy[1]}" if len(phy) == 4 else str()
+        norm_factor = (_NORM_FREQUENCY / _FREQURENCY[topo_arch]) \
+            if normalize else 1.0
         if itm["testtype"] == "mrr":
-            y_data = itm_data[_VALUE[itm["testtype"]]].to_list()[0]
-            if y_data.size > 0:
+            y_data_raw = itm_data[_VALUE[itm["testtype"]]].to_list()[0]
+            y_data = [y * norm_factor for y in y_data_raw]
+            if len(y_data) > 0:
                 y_tput_max = \
                     max(y_data) if max(y_data) > y_tput_max else y_tput_max
         else:
-            y_data = itm_data[_VALUE[itm["testtype"]]].to_list()
+            y_data_raw = itm_data[_VALUE[itm["testtype"]]].to_list()
+            y_data = [y * norm_factor for y in y_data_raw]
             if y_data:
                 y_tput_max = \
                     max(y_data) if max(y_data) > y_tput_max else y_tput_max
@@ -169,7 +202,7 @@ def graph_iterative(data: pd.DataFrame, sel:dict, layout: dict) -> tuple:
             name=(
                 f"{idx + 1}. "
                 f"({nr_of_samples:02d} "
-                f"run{u's' if nr_of_samples > 1 else u''}) "
+                f"run{'s' if nr_of_samples > 1 else ''}) "
                 f"{itm['id']}"
             ),
             hoverinfo=u"y+name",
@@ -178,10 +211,11 @@ def graph_iterative(data: pd.DataFrame, sel:dict, layout: dict) -> tuple:
             marker=dict(color=_get_color(idx))
         )
         tput_traces.append(go.Box(**tput_kwargs))
+        show_tput = True
 
-        show_latency = False
         if itm["testtype"] == "pdr":
-            y_lat = itm_data[_VALUE["pdr-lat"]].to_list()
+            y_lat_row = itm_data[_VALUE["pdr-lat"]].to_list()
+            y_lat = [y * norm_factor for y in y_lat_row]
             if y_lat:
                 y_lat_max = max(y_lat) if max(y_lat) > y_lat_max else y_lat_max
             nr_of_samples = len(y_lat)
@@ -193,7 +227,7 @@ def graph_iterative(data: pd.DataFrame, sel:dict, layout: dict) -> tuple:
                     f"run{u's' if nr_of_samples > 1 else u''}) "
                     f"{itm['id']}"
                 ),
-                hoverinfo=u"y+name",
+                hoverinfo="all",
                 boxpoints="all",
                 jitter=0.3,
                 marker=dict(color=_get_color(idx))
@@ -204,25 +238,27 @@ def graph_iterative(data: pd.DataFrame, sel:dict, layout: dict) -> tuple:
         else:
             lat_traces.append(go.Box())
 
-    pl_tput = deepcopy(layout["plot-throughput"])
-    pl_tput[u"xaxis"][u"tickvals"] = [i for i in range(len(sel))]
-    pl_tput[u"xaxis"][u"ticktext"] = [str(i + 1) for i in range(len(sel))]
-    if y_tput_max:
-        pl_tput[u"yaxis"][u"range"] = [0, (int(y_tput_max / 1e6) + 1) * 1e6]
-    fig_tput = go.Figure(data=tput_traces, layout=pl_tput)
+    if show_tput:
+        pl_tput = deepcopy(layout["plot-throughput"])
+        pl_tput["xaxis"]["tickvals"] = [i for i in range(len(sel))]
+        pl_tput["xaxis"]["ticktext"] = [str(i + 1) for i in range(len(sel))]
+        if y_tput_max:
+            pl_tput["yaxis"]["range"] = [0, (int(y_tput_max / 1e6) + 1) * 1e6]
+        fig_tput = go.Figure(data=tput_traces, layout=pl_tput)
 
     if show_latency:
         pl_lat = deepcopy(layout["plot-latency"])
-        pl_lat[u"xaxis"][u"tickvals"] = [i for i in range(len(x_lat))]
-        pl_lat[u"xaxis"][u"ticktext"] = x_lat
+        pl_lat["xaxis"]["tickvals"] = [i for i in range(len(x_lat))]
+        pl_lat["xaxis"]["ticktext"] = x_lat
         if y_lat_max:
-            pl_lat[u"yaxis"][u"range"] = [0, (int(y_lat_max / 10) + 1) * 10]
+            pl_lat["yaxis"]["range"] = [0, (int(y_lat_max / 10) + 1) * 10]
         fig_lat = go.Figure(data=lat_traces, layout=pl_lat)
 
     return fig_tput, fig_lat
 
 
-def table_comparison(data: pd.DataFrame, sel:dict) -> pd.DataFrame:
+def table_comparison(data: pd.DataFrame, sel:dict,
+        normalize: bool) -> pd.DataFrame:
     """
     """
     table = pd.DataFrame(
@@ -295,7 +331,7 @@ def graph_hdrh_latency(data: dict, layout: dict) -> go.Figure:
             yaxis.append(item.value_iterated_to)
             hovertext.append(
                 f"<b>{_GRAPH_LAT_HDRH_DESC[lat_name]}</b><br>"
-                f"Direction: {(u'W-E', u'E-W')[idx % 2]}<br>"
+                f"Direction: {('W-E', 'E-W')[idx % 2]}<br>"
                 f"Percentile: {prev_perc:.5f}-{percentile:.5f}%<br>"
                 f"Latency: {item.value_iterated_to}uSec"
             )
@@ -304,7 +340,7 @@ def graph_hdrh_latency(data: dict, layout: dict) -> go.Figure:
             yaxis.append(item.value_iterated_to)
             hovertext.append(
                 f"<b>{_GRAPH_LAT_HDRH_DESC[lat_name]}</b><br>"
-                f"Direction: {(u'W-E', u'E-W')[idx % 2]}<br>"
+                f"Direction: {('W-E', 'E-W')[idx % 2]}<br>"
                 f"Percentile: {prev_perc:.5f}-{percentile:.5f}%<br>"
                 f"Latency: {item.value_iterated_to}uSec"
             )
@@ -316,16 +352,16 @@ def graph_hdrh_latency(data: dict, layout: dict) -> go.Figure:
                 x=xaxis,
                 y=yaxis,
                 name=_GRAPH_LAT_HDRH_DESC[lat_name],
-                mode=u"lines",
+                mode="lines",
                 legendgroup=_GRAPH_LAT_HDRH_DESC[lat_name],
                 showlegend=bool(idx % 2),
                 line=dict(
                     color=_get_color(int(idx/2)),
-                    dash=u"solid",
+                    dash="solid",
                     width=1 if idx % 2 else 2
                 ),
                 hovertext=hovertext,
-                hoverinfo=u"text"
+                hoverinfo="text"
             )
         )
     if traces: