diff --git a/src/feelpp/benchmarking/dashboardRenderer/core/treeBuilder.py b/src/feelpp/benchmarking/dashboardRenderer/core/treeBuilder.py index f927a0893..a487fa9da 100644 --- a/src/feelpp/benchmarking/dashboardRenderer/core/treeBuilder.py +++ b/src/feelpp/benchmarking/dashboardRenderer/core/treeBuilder.py @@ -134,7 +134,7 @@ def render( self, base_path:str ) -> None: super().render(base_path,None,renderLeaves=False) self.leaf_repository.render(base_path) - def patchTemplateInfo( self, patches:list[str], targets:str, prefix:str, save:bool = False ): + def patchTemplateInfo( self, patches:List[str], targets:str, prefix:str, save:bool = False ): """ Applies template patches to specific leaf components based on the given target criteria. diff --git a/src/feelpp/benchmarking/dashboardRenderer/repository/leafLoader.py b/src/feelpp/benchmarking/dashboardRenderer/repository/leafLoader.py index 08070643f..3f7e3b2cc 100644 --- a/src/feelpp/benchmarking/dashboardRenderer/repository/leafLoader.py +++ b/src/feelpp/benchmarking/dashboardRenderer/repository/leafLoader.py @@ -59,7 +59,7 @@ def __init__(self, location:str, template_info: TemplateInfo) -> None: if not os.path.exists( location ): warnings.warn(f"{location} does not contain any files") - def load(self,repository:Repository, parent_ids:list[str]) -> None: + def load(self,repository:Repository, parent_ids:List[str]) -> None: """ Load local leaf components (in the filesystem) into the repository. It iterates over subdirectories in the `self.location`, treating each as a separate leaf component, and uses the `ViewFactory` to create a view for it. diff --git a/src/feelpp/benchmarking/dashboardRenderer/schemas/dashboardSchema.py b/src/feelpp/benchmarking/dashboardRenderer/schemas/dashboardSchema.py index aa0f1bc8c..858524ae4 100644 --- a/src/feelpp/benchmarking/dashboardRenderer/schemas/dashboardSchema.py +++ b/src/feelpp/benchmarking/dashboardRenderer/schemas/dashboardSchema.py @@ -124,11 +124,11 @@ def castNodeTemplateInfo(cls,v): class DashboardSchema(BaseModel): - dashboard_metadata:Optional[Union[dict[str,str],TemplateInfo]] = TemplateInfo(data={}) + dashboard_metadata:Optional[Union[Dict[str,str],TemplateInfo]] = TemplateInfo(data={}) component_map: Union[ComponentMap,Dict] - components: Dict[str,Dict[str, Union[dict[str,str],TemplateInfo]]] + components: Dict[str,Dict[str, Union[Dict[str,str],TemplateInfo]]] views : Optional[Dict[str,Union[Dict,str]]] = None - repositories : Optional[Dict[str,Union[dict[str,str],TemplateInfo]]] = None + repositories : Optional[Dict[str,Union[Dict[str,str],TemplateInfo]]] = None template_defaults: Optional[TemplateDefaults] = TemplateDefaults() @model_validator(mode="after") diff --git a/src/feelpp/benchmarking/json_report/figures/schemas/plot.py b/src/feelpp/benchmarking/json_report/figures/schemas/plot.py index 81150fcfc..d0624269e 100644 --- a/src/feelpp/benchmarking/json_report/figures/schemas/plot.py +++ b/src/feelpp/benchmarking/json_report/figures/schemas/plot.py @@ -4,7 +4,7 @@ class PlotAxis(BaseModel): parameter: str label:Optional[str] = None - filter:Optional[Union[str,list[str],dict[str,str],list[dict[str,str]]]] = [] + filter:Optional[Union[str,List[str],Dict[str,str],List[Dict[str,str]]]] = [] @field_validator("filter",mode="after") @classmethod diff --git a/src/feelpp/benchmarking/json_report/figures/templates/tikz/groupedBarChart.tex.j2 b/src/feelpp/benchmarking/json_report/figures/templates/tikz/groupedBarChart.tex.j2 index 3b031fdd4..b68d28657 100644 --- a/src/feelpp/benchmarking/json_report/figures/templates/tikz/groupedBarChart.tex.j2 +++ b/src/feelpp/benchmarking/json_report/figures/templates/tikz/groupedBarChart.tex.j2 @@ -23,9 +23,9 @@ ybar, legend style={at={(0.5,-0.1)},anchor=north} ] - {% for var,name in zip(variables,names) %} + {% for var in variables %} \addplot table [x expr=\coordindex, y={{ var }}] {{'{#2}'}} ; - \addlegendentry{ {{name}} } + \addlegendentry{ {{var}} } {% endfor %} \end{axis} diff --git a/src/feelpp/benchmarking/json_report/figures/templates/tikz/scatterChart.tex.j2 b/src/feelpp/benchmarking/json_report/figures/templates/tikz/scatterChart.tex.j2 index dc0d831b5..85c7b2bcb 100644 --- a/src/feelpp/benchmarking/json_report/figures/templates/tikz/scatterChart.tex.j2 +++ b/src/feelpp/benchmarking/json_report/figures/templates/tikz/scatterChart.tex.j2 @@ -21,10 +21,10 @@ xticklabels from table={{'{#2}'}}{{'{'}}{{xaxis.parameter}}{{'}'}}, cycle list name=color list, legend style={at={(0.5,-0.1)},anchor=north} ] - {% for var,name in zip(variables,names) %} + {% for var in variables %} {% if var not in fill_lines %} \addplot table [x expr=\coordindex, y={{ var }}] {{'{#2}'}} ; - \addlegendentry{ {{name}} } + \addlegendentry{ {{var}} } {% endif %} {% endfor %} diff --git a/src/feelpp/benchmarking/json_report/figures/templates/tikz/stackedBarChart.tex.j2 b/src/feelpp/benchmarking/json_report/figures/templates/tikz/stackedBarChart.tex.j2 index 13eced053..80e6f9d4f 100644 --- a/src/feelpp/benchmarking/json_report/figures/templates/tikz/stackedBarChart.tex.j2 +++ b/src/feelpp/benchmarking/json_report/figures/templates/tikz/stackedBarChart.tex.j2 @@ -41,10 +41,10 @@ {% if i > 1 %} \resetstackedplots {% endif %} - {% for var,name,color in zip(variables,names, colors) %} + {% for var,color in zip(variables, colors) %} \addplot+[ybar, bar width=0.2,point meta=y,draw=black,fill={{color}}{% if i > 1 %}, forget plot{% endif %} ] table [x expr=\coordindex+0.25*{{i}}, y={{ var }}] {\data{{i | inttouniquestr}}} ; {% if i == 1%} - \addlegendentry{ {{name}} } + \addlegendentry{ {{var}} } {% endif %} {% endfor %} {% endfor %} diff --git a/src/feelpp/benchmarking/json_report/figures/tikzFigures.py b/src/feelpp/benchmarking/json_report/figures/tikzFigures.py index ea8fb682a..0a88f52a4 100644 --- a/src/feelpp/benchmarking/json_report/figures/tikzFigures.py +++ b/src/feelpp/benchmarking/json_report/figures/tikzFigures.py @@ -47,6 +47,7 @@ def createMultiindexFigure(self, df, **args): xaxis = self.config.xaxis, yaxis = self.config.yaxis, caption = self.config.title, + variables = df.columns.to_list(), secondary_axis = self.config.secondary_axis, anim_dimension_values = [str(dim) for dim in anim_dim_values], csv_filenames = [f"{dim}.csv" for dim in anim_dim_values], @@ -64,6 +65,7 @@ def createSimpleFigure(self, df, **args): xaxis = self.config.xaxis, yaxis = self.config.yaxis, caption = self.config.title, + variables = df.columns.to_list(), csv_filenames = [f"{self.config.title}.csv"], **args ) diff --git a/src/feelpp/benchmarking/json_report/figures/transformationFactory.py b/src/feelpp/benchmarking/json_report/figures/transformationFactory.py index 2f49b578d..969ca7f6c 100644 --- a/src/feelpp/benchmarking/json_report/figures/transformationFactory.py +++ b/src/feelpp/benchmarking/json_report/figures/transformationFactory.py @@ -1,4 +1,5 @@ import pandas as pd +import numpy as np class TransformationStrategy: @@ -153,8 +154,26 @@ def calculate(self,df): return pd.DataFrame(columns=["optimal","half-optimal"]) if isinstance(pivot.index, pd.MultiIndex): - pivot = pivot.xs(pivot.index.get_level_values(self.dimensions["xaxis"].parameter).min(),level=self.dimensions["xaxis"].parameter,axis=0) / pivot - pivot["optimal"] = pivot.index.get_level_values(self.dimensions["xaxis"].parameter) / pivot.index.get_level_values(self.dimensions["xaxis"].parameter).min() + lvl = self.dimensions["xaxis"].parameter + outer = [n for n in pivot.index.names if n != lvl] + group_level = outer[0] if len(outer) == 1 else outer + + results = [] + + for key, subdf in pivot.groupby(level=group_level): + vals = subdf.index.get_level_values(lvl) + ref = np.nanmin(vals) + + base = subdf.xs(ref, level=lvl, axis=0) + speed = base / subdf + + speed["optimal"] = vals / ref + speed["half-optimal"] = (speed["optimal"] - 1) / 2 + 1 + + results.append(speed) + + pivot = pd.concat(results) + else: pivot = pivot.loc[pivot.index.min(),:] / pivot pivot["optimal"] = pivot.index / pivot.index.min() diff --git a/src/feelpp/benchmarking/json_report/schemas/jsonReport.py b/src/feelpp/benchmarking/json_report/schemas/jsonReport.py index 07fe90c00..f51aab761 100644 --- a/src/feelpp/benchmarking/json_report/schemas/jsonReport.py +++ b/src/feelpp/benchmarking/json_report/schemas/jsonReport.py @@ -117,7 +117,7 @@ def coerceListInput( cls, values ): else: raise TypeError(f"Expected dict or list at root, got {type(values)}") - def flattenContent(self, contents = None) -> list[Node]: + def flattenContent(self, contents = None) -> List[Node]: flattened = [] if contents is None: contents = self.contents