results.py

3.2 kB · python · 86 lines

1from fractions import Fraction2from collections import defaultdict3from .catalog import load_catalog, _data_dir4from .structure import determination_report, invariant_keys5from .average import (6    expected_average_sensitivity,7    variance_average_sensitivity,8)910# HEADLINE RESULTS - ONE SCRIPT, EVERY CLAIM AS A NUMBER THAT HELD1112def q1_determination():13    out = {}14    for D in (3, 4):15        rows = load_catalog(D, _data_dir())16        out[D] = determination_report(rows)17    return out1819def q1_minimal_witness():20    rows = load_catalog(4, _data_dir())21    groups = defaultdict(list)22    for r in rows:23        sig = (r["genus"], r["gf2_degree"], r["popcount"], tuple(r["fill_fingerprint"]))24        groups[sig].append(r)25    witnesses = []26    for sig, members in groups.items():27        if len(members) < 2:28            continue29        if len({x["block_sensitivity"] for x in members}) > 1:30            names = [x["name"] for x in members]31            vals = sorted({x["block_sensitivity"] for x in members})32            witnesses.append((sig, names, vals, len(members)))33    witnesses.sort(key=lambda w: w[3])34    return witnesses3536def q2_certificate_equals_block_sensitivity():37    out = {}38    for D in (3, 4):39        rows = load_catalog(D, _data_dir())40        out[D] = all(r["certificate"] == r["block_sensitivity"] for r in rows)41    return out4243def q2_huang_boundary():44    rows = load_catalog(4, _data_dir())45    return [(r["name"], r["real_degree"], r["sensitivity"], r["anf"])46            for r in rows if r["real_degree"] == r["sensitivity"] ** 2 and r["sensitivity"] >= 2]4748def q2_sensitivity_blocksensitivity_gap():49    rows = load_catalog(4, _data_dir())50    best = max(r["block_sensitivity"] - r["sensitivity"] for r in rows)51    holders = [(r["name"], r["sensitivity"], r["block_sensitivity"], r["anf"])52               for r in rows if r["block_sensitivity"] - r["sensitivity"] == best]53    return best, holders5455def q3_average_sensitivity():56    out = {}57    for D in range(1, 9):58        out[D] = (expected_average_sensitivity(D), variance_average_sensitivity(D))59    return out6061if __name__ == "__main__":62    print("=" * 70)63    print("Q1 - geometry-to-complexity determination (coarsest key per measure)")64    for D, rep in q1_determination().items():65        print(f"  D={D}:")66        for m, det in rep.items():67            print(f"     {m:22s} -> {det}")68    print()69    print("Q1 - minimal collision witness (same full invariants, different bs):")70    for sig, names, vals, n in q1_minimal_witness()[:3]:71        print(f"     {names} bs={vals}  invariants={sig}")72    print()73    print("=" * 70)74    print("Q2 - C(f) = bs(f) for every design:", q2_certificate_equals_block_sensitivity())75    print("Q2 - Huang boundary deg = s^2 (s>=2):")76    for nm, deg, s, anf in q2_huang_boundary():77        print(f"     {nm}: deg={deg} s={s} (s^2={s*s})  anf={anf}")78    gap, holders = q2_sensitivity_blocksensitivity_gap()79    print(f"Q2 - max bs - s = {gap}:")80    for nm, s, bs, anf in holders:81        print(f"     {nm}: s={s} bs={bs}  anf={anf}")82    print()83    print("=" * 70)84    print("Q3 - average sensitivity I(f) under uniform-over-designs:")85    for D, (mean, var) in q3_average_sensitivity().items():86        print(f"     D={D}: E[I]={mean}  Var[I]={var}={float(var):.5f}")