"""ПОВТОР-ТЕСТ ОДНОГО СУДЬИ: то же задание, ТА ЖЕ раскладка, новый судья. $0. ⚠ Заведено адверсариальным ревью 07.08. Проходы 1 и 2 различаются РАСКЛАДКОЙ меток, поэтому их расхождение смешивает судейский шум с позиционным. Здесь раскладка держится постоянной, значит разность — чистый судейский шум. Это единственный контроль амендмента («разброс судьи на повторе»), который до сих пор не был измерен ни разу. """ import statistics as st, sys from pathlib import Path sys.path.insert(0, str(Path(__file__).parent)) import absjudge as A # 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, strict=True)) / ((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}")