From 8b1fcca4c9ad7937ded07bce6cf78b5ff009be96 Mon Sep 17 00:00:00 2001 From: Mika Date: Thu, 11 Dec 2025 11:56:25 +0000 Subject: [PATCH] Add off_by_3_fix/src/off_by_3_fix/core.py --- off_by_3_fix/src/off_by_3_fix/core.py | 50 +++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 off_by_3_fix/src/off_by_3_fix/core.py diff --git a/off_by_3_fix/src/off_by_3_fix/core.py b/off_by_3_fix/src/off_by_3_fix/core.py new file mode 100644 index 0000000..03aba26 --- /dev/null +++ b/off_by_3_fix/src/off_by_3_fix/core.py @@ -0,0 +1,50 @@ +import json +import logging +from typing import List, Dict + +try: + import trace_agg # vorhandenes Modul, falls für Analyse benötigt +except ImportError: + trace_agg = None # optionaler Fallback, falls Modul zur Laufzeit nicht vorhanden ist + + +def fix_off_by_3(trace_data: List[Dict]) -> List[Dict]: + """Korrigiert den Off-By-3-Fehler in Trace-Daten. + + Wandelt Float-Bucket-Grenzen in Integer-Buckets um, um Rundungsfehler + bei der Gruppenaggregation zu vermeiden. + + Args: + trace_data: Liste von Trace-Daten mit möglichen Float-Buckets. + + Returns: + Liste von korrigierten Trace-Daten mit Integer-Buckets. + """ + if not isinstance(trace_data, list): + raise ValueError("trace_data muss eine Liste von Dicts sein.") + + corrected = [] + for entry in trace_data: + if not isinstance(entry, dict): + raise ValueError("Jeder Eintrag in trace_data muss ein Dict sein.") + + group = entry.get("group") + bucket = entry.get("bucket") + value = entry.get("value") + + if group is None or bucket is None or value is None: + raise ValueError("Einträge müssen 'group', 'bucket' und 'value' enthalten.") + + # Primäre Korrektur: Float-Grenzen in stabile Integer-Buckets umwandeln + try: + bucket_int = int(round(bucket)) + except (TypeError, ValueError): + raise ValueError(f"Bucket-Wert ungültig: {bucket}") + + corrected.append({ + "group": str(group), + "bucket": bucket_int, + "value": float(value) + }) + + return corrected