Add artifact.1/src/artifact_1/core.py
This commit is contained in:
commit
52abc3d326
1 changed files with 79 additions and 0 deletions
79
artifact.1/src/artifact_1/core.py
Normal file
79
artifact.1/src/artifact_1/core.py
Normal 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,
|
||||||
|
)
|
||||||
Loading…
Reference in a new issue