Hermite-critical residual initialization / experiment.py

Failed on benchmark

Raw ⬇ ZIP
  1import json, math, random
  2from pathlib import Path
  3import numpy as np
  4
  5SEED = 3112
  6
  7
  8def cov_long_memory(n, alpha):
  9    i = np.arange(n)
 10    return (1.0 + np.abs(i[:, None] - i[None, :])) ** (-alpha)
 11
 12
 13def correlated_gaussian(n, alpha, rng):
 14    C = cov_long_memory(n, alpha)
 15    return np.linalg.cholesky(C + 1e-10 * np.eye(n)) @ rng.standard_normal(n)
 16
 17
 18def hermite_prob(x, q):
 19    if q == 1: return x
 20    if q == 2: return x*x - 1.0
 21    if q == 3: return x*x*x - 3.0*x
 22    raise ValueError('q must be 1, 2, or 3')
 23
 24
 25def hermite_unit(x, q):
 26    # For standard Gaussian input, E[He_q(G)^2] = q!.
 27    return hermite_prob(x, q) / math.sqrt(math.factorial(q))
 28
 29
 30def slope(x, y):
 31    return float(np.polyfit(np.log(np.asarray(x)), np.log(np.asarray(y)), 1)[0])
 32
 33
 34def scaling_check(alpha=0.4, q=1, max_n=512, trials=160, rng=None):
 35    # No per-path centering: centering would force sum(z)==0 and destroy
 36    # exactly the phenomenon being measured.
 37    rng = np.random.default_rng(SEED + q) if rng is None else rng
 38    ns = np.array([16, 32, 64, 128, 256, max_n])
 39    variances = []
 40    means = []
 41    for n in ns:
 42        sums = []
 43        for _ in range(trials):
 44            g = correlated_gaussian(n, alpha, rng)
 45            sums.append(np.sum(hermite_unit(g, q)))
 46        variances.append(np.var(sums, ddof=1))
 47        means.append(np.mean(sums))
 48    H = 1.0 - alpha*q/2.0
 49    observed_H = slope(ns, variances) / 2.0
 50    rms_scaled = [float(np.sqrt(v) / n**H) for n, v in zip(ns, variances)]
 51    # For Gaussian g, Cov(He_q(g_i)/sqrt(q!), He_q(g_j)/sqrt(q!))=rho(|i-j|)^q.
 52    exact_variances = []
 53    for n in ns:
 54        rho = (1.0 + np.arange(n)) ** (-alpha)
 55        exact_variances.append(float(n + 2.0 * sum((n-j) * rho[j]**q for j in range(1, n))))
 56    exact_H = slope(ns, exact_variances) / 2.0
 57    return {'q': q, 'theory_H': H, 'observed_H': observed_H, 'exact_finite_n_H': exact_H,
 58            'ns': ns.tolist(), 'sum_variance': [float(v) for v in variances],
 59            'exact_sum_variance': exact_variances,
 60            'scaled_sum_rms': rms_scaled,
 61            'rms_ratio_last_first': rms_scaled[-1] / rms_scaled[0],
 62            'sum_means': [float(x) for x in means]}
 63
 64
 65def residual_stability(alpha=0.4, n_trials=300, dims=32, rng=None):
 66    rng = np.random.default_rng(SEED + 99) if rng is None else rng
 67    depths = [32, 64, 128, 256]
 68    out = {}
 69    for kind in ['critical_correlated', 'iid_sqrt', 'correlated_inverse_sqrt', 'correlated_wrong_inverse']:
 70        vals = []
 71        for L in depths:
 72            final = []
 73            for _ in range(n_trials):
 74                if kind == 'critical_correlated':
 75                    z = correlated_gaussian(L, alpha, rng)
 76                    lam = L ** (-(1-alpha/2))
 77                elif kind == 'iid_sqrt':
 78                    z = rng.standard_normal(L)
 79                    lam = L ** -0.5
 80                elif kind == 'correlated_inverse_sqrt':
 81                    z = correlated_gaussian(L, alpha, rng)
 82                    lam = L ** -0.5
 83                else:
 84                    z = correlated_gaussian(L, alpha, rng)
 85                    lam = L ** -1.0
 86                h = rng.standard_normal(dims)
 87                for zl in z:
 88                    h = h + lam * zl * np.tanh(h)
 89                final.append(np.mean(h*h))
 90            vals.append((float(np.mean(final)), float(np.std(final, ddof=1)/math.sqrt(n_trials))))
 91        out[kind] = {'depths': depths, 'mean_final_variance': [x[0] for x in vals],
 92                     'sem': [x[1] for x in vals]}
 93    return out
 94
 95
 96def main():
 97    random.seed(SEED); np.random.seed(SEED)
 98    checks = [scaling_check(q=q) for q in (1, 2)]
 99    stability = residual_stability()
100    report = {'seed': SEED, 'alpha': 0.4, 'checks': checks, 'stability': stability}
101    Path('results.json').write_text(json.dumps(report, indent=2))
102    print(json.dumps(report, indent=2))
103
104if __name__ == '__main__':
105    main()