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}")