From 52abc3d326e4c56f25a11a473fdaed6ede42d5de Mon Sep 17 00:00:00 2001 From: Mika Date: Sun, 8 Mar 2026 11:31:06 +0000 Subject: [PATCH] Add artifact.1/src/artifact_1/core.py --- artifact.1/src/artifact_1/core.py | 79 +++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 artifact.1/src/artifact_1/core.py diff --git a/artifact.1/src/artifact_1/core.py b/artifact.1/src/artifact_1/core.py new file mode 100644 index 0000000..3a2a70b --- /dev/null +++ b/artifact.1/src/artifact_1/core.py @@ -0,0 +1,79 @@ +from __future__ import annotations + +import statistics +from dataclasses import dataclass +from typing import List + + +@dataclass +class RunData: + """Repräsentiert die Daten eines einzelnen Runs.""" + + run_id: str + healing_rate: float + overhead_ms: float + warn_rate: float + unknown_rate: float + + +@dataclass +class AggregatedResults: + """Aggregierte Zusammenfassung über mehrere Runs.""" + + total_runs: int + avg_healing_rate: float + peak_overhead: float + overall_warn_rate: float + + +def analyze_runs(run_data_list: List[RunData]) -> AggregatedResults: + """Analysiert eine Liste von RunData und gibt aggregierte Ergebnisse zurück. + + Parameters + ---------- + run_data_list : list[RunData] + Liste der zu analysierenden Laufdaten. + + Returns + ------- + AggregatedResults + Aggregierte Kennwerte über alle übergebenen Runs. + """ + + if not isinstance(run_data_list, list): + raise TypeError("run_data_list muss eine Liste von RunData sein.") + + if not run_data_list: + raise ValueError("run_data_list darf nicht leer sein.") + + for item in run_data_list: + if not isinstance(item, RunData): + raise TypeError(f"Alle Elemente in run_data_list müssen vom Typ RunData sein, nicht {type(item)}.") + + total_runs = len(run_data_list) + + healing_rates = [r.healing_rate for r in run_data_list] + overheads = [r.overhead_ms for r in run_data_list] + warn_rates = [r.warn_rate for r in run_data_list] + + # Validiere Zahlenbereiche + for r in run_data_list: + if not (0.0 <= r.healing_rate <= 1.0): + raise ValueError(f"Ungültige healing_rate in {r.run_id}: {r.healing_rate}") + if r.overhead_ms < 0: + raise ValueError(f"Negativer overhead_ms in {r.run_id}: {r.overhead_ms}") + if not (0.0 <= r.warn_rate <= 1.0): + raise ValueError(f"Ungültige warn_rate in {r.run_id}: {r.warn_rate}") + if not (0.0 <= r.unknown_rate <= 1.0): + raise ValueError(f"Ungültige unknown_rate in {r.run_id}: {r.unknown_rate}") + + avg_healing_rate = statistics.mean(healing_rates) + peak_overhead = max(overheads) + overall_warn_rate = statistics.mean(warn_rates) + + return AggregatedResults( + total_runs=total_runs, + avg_healing_rate=avg_healing_rate, + peak_overhead=peak_overhead, + overall_warn_rate=overall_warn_rate, + )