Add artifact.1/src/artifact_1/core.py

This commit is contained in:
Mika 2026-03-08 11:31:06 +00:00
commit 52abc3d326

View file

@ -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,
)