#!/usr/bin/env python3 """Wertet die drei Einlauf-Messungen gegeneinander aus. Die drei Laeufe unterscheiden sich in genau einer Sache voneinander, deshalb ist jeder Paarvergleich direkt lesbar. Verglichen wird gepaart (McNemar), weil alle drei dieselben 150 Aufgaben bearbeiten — nur die Aufgaben, bei denen genau einer der beiden Laeufe besteht, tragen ueberhaupt Information. """ import glob import itertools import json import math import os import sys ZIEL = "/mnt/models/qwen38-prep/einlauf" def mcnemar(a, b): ids = set(a) & set(b) n01 = sum(1 for i in ids if a[i] and not b[i]) n10 = sum(1 for i in ids if b[i] and not a[i]) n = n01 + n10 if n == 0: return n01, n10, 1.0 p = sum(math.comb(n, k) for k in range(min(n01, n10) + 1)) / 2 ** n * 2 return n01, n10, min(1.0, p) def main(): laeufe = {} for p in sorted(glob.glob(os.path.join(ZIEL, "*.json"))): d = json.load(open(p)) laeufe[os.path.basename(p)[0]] = d if not laeufe: print("keine Ergebnisse gefunden") return 1 print(f"{'':<3}{'Lauf':<40}{'Quote':>9}{'am Limit':>10}{'Schleifen':>11}{'Token':>9}") for k in sorted(laeufe): d = laeufe[k] leer = sum(1 for x in d["aufgaben"] if not x.get("gegeben") and x.get("abbruch") != "length") print(f"{k.upper():<3}{d['modell'][:39]:<40}" f"{d['bestanden']:>4}/{d['n']} {d['quote']:>5.1f}%" f"{d.get('am_limit', 0):>8}" f"{leer:>11}" f"{d.get('tokens_je_aufgabe', 0):>9.0f}") print("\nGepaarte Vergleiche (exakter McNemar):") # Nur Paare, die sich in GENAU einer Sache unterscheiden, sind erklaerbar. # a/c und u/v trennen Reasoning, a/u und c/v trennen das Modell. Die # Diagonalen (a/v, c/u) aendern zwei Dinge zugleich und werden deshalb # ausdruecklich als nicht interpretierbar markiert, statt sie wegzulassen — # weglassen laedt dazu ein, sie spaeter doch zu zitieren. erklaerung = { ("a", "c"): "Reasoning-Effekt, Basismodell", ("a", "u"): "Preis der Entzensierung, mit Reasoning", ("c", "v"): "Preis der Entzensierung, ohne Reasoning", ("u", "v"): "Reasoning-Effekt, entzensiert", ("a", "v"): "NICHT interpretierbar (Modell UND Reasoning verschieden)", ("c", "u"): "NICHT interpretierbar (Modell UND Reasoning verschieden)", } for x, y in itertools.combinations(sorted(laeufe), 2): A = {t["id"]: t["ok"] for t in laeufe[x]["aufgaben"]} B = {t["id"]: t["ok"] for t in laeufe[y]["aufgaben"]} n01, n10, p = mcnemar(A, B) was = erklaerung.get((x, y), "") stern = " *" if p < 0.05 else "" print(f" {x.upper()} vs {y.upper()}: {n01}:{n10} p = {p:.4f}{stern}" f" {was}") print("\nZum Vergleich der Messung vom 17.08.: 138/150 = 92,0 % " "(8.000 Token, kein DRY)") return 0 if __name__ == "__main__": sys.exit(main())