From 2ec12ddb027225ab45affa494ec739c417f44727 Mon Sep 17 00:00:00 2001 From: Derek Feichtinger Date: Mon, 6 Jul 2026 15:12:45 +0200 Subject: [PATCH] implement generic way of storing metric vectors in aggregation Already move sdev to use the new field instead of specialized hardcoded fields. --- slurm-eff-tool.py | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/slurm-eff-tool.py b/slurm-eff-tool.py index 8957af0..727a609 100755 --- a/slurm-eff-tool.py +++ b/slurm-eff-tool.py @@ -482,9 +482,7 @@ class OutputRow: waste_CPU: float | None # CPU h waste_Mem: float | None waste_total: float | None - _cpu_eff_values: list[float] = field(default_factory=list, repr=False) - _mem_eff_values: list[float] = field(default_factory=list, repr=False) - _time_eff_values: list[float] = field(default_factory=list, repr=False) + vectors: dict[str, list[int | float]] # here we can store full vectors of the aggreg. def as_dict(self, sdev: bool = False) -> dict[str, Any]: d: dict[str, Any] = { @@ -516,9 +514,9 @@ class OutputRow: } if sdev: for col, vals in [ - ("CPU_Eff", self._cpu_eff_values), - ("Mem_Eff", self._mem_eff_values), - ("Time_Eff", self._time_eff_values), + ("CPU_Eff", self.vectors['cpu_eff']), + ("Mem_Eff", self.vectors['mem_eff']), + ("Time_Eff", self.vectors['time_eff']), ]: d[f"{col}_sdev"] = stdev_or_none(vals) d[f"{col}_max"] = max(vals) if vals else None @@ -1016,9 +1014,9 @@ def make_single_row(rec: JobRecord, dflt_mpcpu: float) -> OutputRow: waste_Mem=waste_mem, waste_CPU=waste_cpu, waste_total=waste_total, - _cpu_eff_values=[rec.cpu_eff] if rec.cpu_eff is not None else [], - _mem_eff_values=[rec.mem_eff] if rec.mem_eff is not None else [], - _time_eff_values=[rec.time_eff] if rec.time_eff is not None else [], + vectors = {"cpu_eff": [rec.cpu_eff] if rec.cpu_eff is not None else [], + "mem_eff": [rec.mem_eff] if rec.mem_eff is not None else [], + "time_eff": [rec.time_eff] if rec.time_eff is not None else []}, ) @@ -1073,7 +1071,14 @@ def make_aggregate_row(records: list[JobRecord], username: str, partition: str, waste_cpu = count * walltime * (100-cpu_efficiency)/100 * first.cpus waste_total = waste_cpu + waste_mem/dflt_mpcpu - + + vectors: dict[str, list[int | float]] = { + "cpu_eff": [r.cpu_eff for r in records if r.cpu_eff is not None], + "mem_eff": [r.mem_eff for r in records if r.mem_eff is not None], + "time_eff": [r.time_eff for r in records if r.time_eff is not None], + } + + return OutputRow( username=username, JobID="", @@ -1100,9 +1105,7 @@ def make_aggregate_row(records: list[JobRecord], username: str, partition: str, waste_Mem=waste_mem, waste_CPU=waste_cpu, waste_total=waste_total, - _cpu_eff_values=cpu_eff_vals, - _mem_eff_values=mem_eff_vals, - _time_eff_values=time_eff_vals, + vectors = vectors, ) def resolve_column_name(name: str) -> str: