Interlevel Betti Token Transformer / toy_verify.py

✓✓ Beats tuned baseline

Raw ⬇ ZIP
 1import json
 2import numpy as np
 3from toposcan import gf2_rank, betti_graph, interlevel_betti, grid_tokens
 4
 5
 6def wedge_triangles(q, level=0.35):
 7    """q triangles sharing vertex 0; each contributes one independent cycle."""
 8    edges = []
 9    h = [0.0]
10    for j in range(q):
11        u, v = 1 + 2*j, 2 + 2*j
12        h.extend([level, level])
13        edges.extend([(0, u), (u, v), (v, 0)])
14    return len(h), edges, np.asarray(h)
15
16
17def direct_formula_check(rng):
18    # Verify beta0=n-rank(B0)-rank(B1), beta1=n1-rank(B1) on random graphs.
19    rows = []
20    for n in [4, 7, 10]:
21        for _ in range(20):
22            edges = [(u, v) for u in range(n) for v in range(u+1, n)
23                     if rng.random() < 0.28]
24            b0, b1 = betti_graph(n, edges)
25            B1 = np.zeros((n, len(edges)), dtype=np.uint8)
26            for j, (u, v) in enumerate(edges):
27                B1[u, j] = B1[v, j] = 1
28            rank = gf2_rank(B1)
29            predicted = (n-rank, len(edges)-rank)
30            rows.append((b0, b1) == predicted)
31    return {"cases": len(rows), "passed": int(sum(rows))}
32
33
34def main():
35    rng = np.random.default_rng(7)
36    results = {"formula_check": direct_formula_check(rng)}
37
38    # Prediction 1: each added independent cycle adds exactly one to beta1.
39    scaling = []
40    for q in range(1, 7):
41        n, edges, h = wedge_triangles(q)
42        (b0, b1), _ = interlevel_betti(n, edges, h, 0.0, 0.36)
43        scaling.append({"q": q, "observed_beta1": b1, "predicted_beta1": q})
44    results["cycle_scaling"] = scaling
45
46    # Prediction 2: beta1 turns on exactly when the upper interval reaches
47    # the common upper-star edge value .35.
48    n, edges, h = wedge_triangles(3)
49    transition = []
50    for hi in [0.20, 0.34, 0.35, 0.36, 0.50]:
51        (b0, b1), (nv, ne) = interlevel_betti(n, edges, h, 0.0, hi)
52        transition.append({"hi": hi, "observed_beta1": b1,
53                           "predicted_beta1": 0 if hi < 0.35 else 3,
54                           "vertices": nv, "edges": ne})
55    results["window_transition"] = transition
56
57    # Prediction 3: with fixed hi=.50, perturbations below the .15 margin
58    # cannot change token beta1; once the margin is crossed, positive shifts
59    # remove all cycle edges from this interval.
60    robustness = []
61    for eps in [0.00, 0.05, 0.14, 0.15, 0.16, 0.25]:
62        hp = h + eps
63        (b0, b1), _ = interlevel_betti(n, edges, hp, 0.0, 0.50)
64        robustness.append({"epsilon": eps, "observed_beta1": b1,
65                           "predicted_beta1": 3 if eps < 0.15 else 0})
66    results["perturbation_margin"] = robustness
67
68    # Exercise the shared-grid token representation and report its shape.
69    tokens = grid_tokens(n, edges, h, np.linspace(0, 1, 11), m=4, stride=2)
70    results["token_example"] = {"shape": list(tokens.shape),
71                                 "tokens": tokens.tolist()}
72
73    # Aggregate exact prediction success, excluding floating boundary cases
74    # where representation of .35/.15 can decide inclusion.
75    scaling_ok = all(x["observed_beta1"] == x["predicted_beta1"] for x in scaling)
76    transition_ok = all(x["observed_beta1"] == x["predicted_beta1"]
77                        for x in transition)
78    robust_ok = all(x["observed_beta1"] == x["predicted_beta1"]
79                    for x in robustness if x["epsilon"] != 0.15)
80    results["prediction_summary"] = {
81        "scaling_exact": scaling_ok,
82        "transition_exact": transition_ok,
83        "submargin_robust_exact": robust_ok,
84        "boundary_case_epsilon_0.15_observed": robustness[3]["observed_beta1"],
85        "boundary_tolerance_note": "At equality, closed interval inclusion is expected; epsilon=.15 is reported separately."
86    }
87    print(json.dumps(results, indent=2))
88
89
90if __name__ == "__main__":
91    main()