File size: 2,969 Bytes
96b4304
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
"""Turn the printed val_acc / kl* / spread* into a statement about uniformity.

kl* and spread* both measure non-uniformity inside the candidate set but they
weight it very differently, so the pair of them pins down more than either
alone. spread* is bounded in [0,1] and barely moves when one candidate is
crushed; kl* = KL(Uniform(S) || q) diverges as any candidate goes to zero.
A single skew cannot produce a high spread* and a high kl* at once, so the
observed pair implies a minority of cells with a near-zeroed candidate.
"""
import numpy as np
from scipy.optimize import brentq

OUT = 0.0039      # val_acc == out* == 1 - mass*
KL = 0.5138       # kl*
SPREAD = 0.9156   # spread*


def skew_two(x, k):
    """q with one candidate at x, the rest sharing (1-x) uniformly."""
    q = np.full(k, (1.0 - x) / (k - 1))
    q[0] = x
    return q


def kl_u(q):
    k = len(q)
    return float(np.sum((1.0 / k) * np.log((1.0 / k) / np.maximum(q, 1e-300))))


def spread_of(q):
    k = len(q)
    h = float(-np.sum(q * np.log(np.maximum(q, 1e-300))))
    return h / np.log(k)


print(f"current eval: val_acc(out*) {OUT}   kl* {KL}   spread* {SPREAD}")
print(f"\nidentity check: excess* = log(1/mass*) + kl*")
leak = np.log(1.0 / (1.0 - OUT))
print(f"  leak = log(1/{1 - OUT:.4f}) = {leak:.4f}")
print(f"  leak + kl* = {leak + KL:.4f}   (log prints excess* ~ 0.518)")
print(f"  -> {leak / (leak + KL) * 100:.1f}% of excess is leakage, "
      f"{KL / (leak + KL) * 100:.1f}% is non-uniformity inside S")

print(f"\nreading 1: if EVERY cell had the same skew, kl*={KL} means")
for k in (2, 3, 4):
    lo, hi = 1e-12, 1.0 / k - 1e-12
    x = brentq(lambda z: kl_u(skew_two(z, k)) - KL, lo, hi)
    q = skew_two(x, k)
    print(f"  |S|={k}: one candidate at {x:.4f}, others {q[1]:.3f} each "
          f"-> spread would be {spread_of(q):.3f}")
print(f"  but measured spread* is {SPREAD}, far higher. So the cells are NOT")
print("  all uniformly skewed: most are near-flat and a few are crushed.")

print(f"\nreading 2: two populations. fraction f of cells have one candidate")
print(f"  pushed to eps, the rest ({1:.0%}-f) are exactly uniform.")
print(f"  {'|S|':>4}  {'f (crushed cells)':>18}  {'eps':>10}  "
      f"{'that candidate gets':>20}")
for k in (2, 3, 4):
    def resid(le):
        eps = np.exp(le)
        q = skew_two(eps, k)
        sB, kB = spread_of(q), kl_u(q)
        f = (1.0 - SPREAD) / max(1.0 - sB, 1e-12)
        return f * kB - KL
    le = brentq(resid, np.log(1e-14), np.log(1.0 / k - 1e-9))
    eps = np.exp(le)
    q = skew_two(eps, k)
    f = (1.0 - SPREAD) / (1.0 - spread_of(q))
    print(f"  {k:>4}  {f * 100:>17.1f}%  {eps:>10.2e}  "
          f"{1 / eps:>17.0f}x less than uniform")

print(f"\nreading 3: effective number of candidates actually used")
for k, share in ((2, 0.42), (3, 0.29), (4, 0.16), (5, 0.13)):
    print(f"  |S|={k} (~{share:.0%} of multi cells): model spreads over "
          f"{k ** SPREAD:.2f} of {k} candidates")