"""完全合格（全チェック合格）の人数差を、フィッシャーの正確検定（両側）で見る。"""
import json, sys
from math import comb
from materials import row_checks


def fisher(a, n1, b, n2):
    """a/n1 と b/n2 の合格数の差。両側p値。"""
    k, N = a + b, n1 + n2
    def p(x):
        return comb(n1, x) * comb(n2, k - x) / comb(N, k)
    p0 = p(a)
    return sum(p(x) for x in range(max(0, k - n2), min(n1, k) + 1) if p(x) <= p0 + 1e-12)


def passes(path):
    d = {}
    for l in open(path):
        r = json.loads(l)
        d.setdefault(r["cond"], []).append(all(row_checks(r).values()))
    return d


if __name__ == "__main__":
    d = passes(sys.argv[1])
    pairs = [("E1", "E2"), ("E2", "E3"), ("E2", "E5"), ("E2", "E4"), ("E2", "E6"), ("E7", "E4"), ("E7", "E6"),
             ("R1", "R3"), ("R2", "R3"), ("R1", "R2"), ("R4", "R3"), ("R5", "R4"), ("R1", "R4")]
    for x, y in pairs:
        if x in d and y in d:
            a, b = sum(d[x]), sum(d[y])
            print(f"{x} {a}/{len(d[x])}  vs  {y} {b}/{len(d[y])}   p={fisher(a, len(d[x]), b, len(d[y])):.4f}")
