textmachine/eval/role_topology/_retest.py

38 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""ПОВТОР-ТЕСТ ОДНОГО СУДЬИ: то же задание, ТА ЖЕ раскладка, новый судья. $0.
⚠ Заведено адверсариальным ревью 07.08. Проходы 1 и 2 различаются РАСКЛАДКОЙ меток, поэтому их
расхождение смешивает судейский шум с позиционным. Здесь раскладка держится постоянной, значит
разность — чистый судейский шум. Это единственный контроль амендмента («разброс судьи на
повторе»), который до сих пор не был измерен ни разу.
"""
import json, statistics as st, sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent))
import absjudge as A # noqa: E402
import bakeoff as BO # noqa: E402
A.PASS = "retest"
A.ingest()
r = A._by_unit()
A.PASS = "abs2"
b = A._by_unit()
common = sorted(set(r) & set(b))
d = [r[u][k]["errors"] - b[u][k]["errors"] for u in common for k in r[u] if k in b[u]]
# ⚠ ПРОВЕРЯТЬ НАДО РАСКЛАДКУ, А НЕ ТОЛЬКО ТЕКСТ. Ревью 07.08: печаталось «раскладка и текст
# тождественны», а сверялся только хеш текста — тот же тест давал True и на проходах с ЗАВЕДОМО
# разной раскладкой. Здесь сверяется и подпись текста, и номер слота.
sig = all(r[u][k]["sig"] == b[u][k]["sig"] for u in common for k in r[u] if k in b[u])
slot = all(r[u][k]["slot"] == b[u][k]["slot"] for u in common for k in r[u] if k in b[u])
print(f"\nединиц {len(common)} · клеток {len(d)} · текст тождествен: {sig} · РАСКЛАДКА тождественна: {slot}")
print(f" средняя разность {st.mean(d):+.2f} · sd {st.pstdev(d):.2f}")
print(f"σ ОДНОГО СУДЬИ на повторе = {st.pstdev(d) / 2 ** 0.5:.2f}")
xs = [r[u][k]["errors"] for u in common for k in r[u] if k in b[u]]
ys = [b[u][k]["errors"] for u in common for k in r[u] if k in b[u]]
mx, my = st.mean(xs), st.mean(ys)
print(f" корреляция повтора: r={sum((a-mx)*(c-my) for a, c in zip(xs, ys)) / ((sum((a-mx)**2 for a in xs)*sum((c-my)**2 for c in ys))**0.5):+.3f}")
for a_, b_, w in A.FAMILY:
m1 = [r[u][b_]["errors"] - r[u][a_]["errors"] for u in common if a_ in r[u] and b_ in r[u]]
m2 = [b[u][b_]["errors"] - b[u][a_]["errors"] for u in common if a_ in b[u] and b_ in b[u]]
if m1:
print(f" {a_ + ' vs ' + b_:14s} повтор {st.mean(m1):+6.2f} исходно {st.mean(m2):+6.2f}"
f" |Δ| {abs(st.mean(m1)-st.mean(m2)):.2f}")