#!/usr/bin/env python3 """Bewertet gespeicherte Mathe-Laeufe mit dem korrigierten Vergleich neu. Der erste Durchgang wertete Antworten als falsch, die nur anders geschrieben waren: `\\frac43` gegen `\\frac{4}{3}`, `x=5` gegen `5`, `.35625` gegen `0,35625`. Von acht als falsch gewerteten abgeschlossenen Antworten war genau eine wirklich falsch. Kostet keine GPU-Zeit — die Modellantworten liegen in den Berichten. Die Originaldateien bleiben unangetastet, das Ergebnis kommt daneben. """ import glob import json import os import sys sys.path.insert(0, "/mnt/models/qwen38-prep") import bench_mathe as M QUELLE = "/mnt/models/qwen38-prep/mathe-math500" ZIEL = "/mnt/models/qwen38-prep/mathe-math500-neubewertet" def main(): os.makedirs(ZIEL, exist_ok=True) print(f"{'Modell':<26}{'vorher':>9}{'nachher':>9}{'Δ':>7} korrigierte Fälle") for p in sorted(glob.glob(os.path.join(QUELLE, "*.json"))): d = json.load(open(p)) geaendert = [] for x in d["aufgaben"]: # Nur Antworten, die ueberhaupt eine Ausgabe hatten. Wo das Modell # ins Limit lief, gibt es nichts neu zu bewerten. g, e = x.get("gegeben"), x.get("erwartet") if not g or not e: continue neu = M.stimmt(g, e) if neu != x["ok"]: geaendert.append((x.get("level"), g, e, x["ok"], neu)) x["ok"] = neu x["neubewertet"] = True ok_n = sum(1 for x in d["aufgaben"] if x["ok"]) nach_level = {} for x in d["aufgaben"]: lv = x.get("level") if lv is not None: s = nach_level.setdefault(str(lv), [0, 0]) s[1] += 1 s[0] += 1 if x["ok"] else 0 vorher = d["quote"] d["quote_vor_neubewertung"] = vorher d["bestanden"] = ok_n d["quote"] = round(ok_n / d["n"] * 100, 1) d["nach_level"] = {k: v for k, v in sorted(nach_level.items())} d["neubewertet"] = len(geaendert) json.dump(d, open(os.path.join(ZIEL, os.path.basename(p)), "w"), ensure_ascii=False, indent=1) print(f"{d['modell'][:25]:<26}{vorher:>8.1f}%{d['quote']:>8.1f}%" f"{d['quote']-vorher:>+6.1f} {len(geaendert)}") for lv, g, e, alt, neu in geaendert[:3]: print(f" L{lv} {g[:30]!r} == {e[:30]!r}") print(f"\ngeschrieben nach {ZIEL}") if __name__ == "__main__": main()