38 lines
2.8 KiB
Python
38 lines
2.8 KiB
Python
"""ПОВТОР-ТЕСТ ОДНОГО СУДЬИ: то же задание, ТА ЖЕ раскладка, новый судья. $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}")
|