| """Fresh CPU-only protection sweep for Claims 1, 2, and 4. |
| |
| All posterior, MFVI, predictive-variance, and temperature calculations below |
| are closed form. The script deliberately adds dimensions, seeds, and two |
| larger random-feature regimes to the earlier page evidence. |
| """ |
| import json |
| import numpy as np |
|
|
|
|
| def linear_grid(): |
| c1_ok = c2_ok = 0 |
| c1_total = c2_total = 0 |
| margins = [] |
| identity_err = [] |
| for d in (2, 4, 8, 16, 32, 64, 128): |
| for seed in range(10): |
| rng = np.random.default_rng(9000 + 100 * d + seed) |
| n = 3 * d + 7 |
| X = rng.normal(size=(n, d)) |
| sigma = 10.0 ** rng.uniform(-1.5, 1.5) |
| alpha = 10.0 ** rng.uniform(-2.0, 2.0) |
| A = X.T @ X / sigma**2 + alpha * np.eye(d) |
| Sigma = np.linalg.inv(A) |
| mf = 1.0 / np.diag(A) |
| Sdiag = np.diag(mf) |
|
|
| |
| |
| w, V = np.linalg.eigh(Sigma) |
| u_min, u_max = V[:, 0], V[:, -1] |
| pred_min = u_min @ (Sdiag - Sigma) @ u_min |
| pred_max = u_max @ (Sdiag - Sigma) @ u_max |
| if np.all(np.diag(Sigma) >= mf) and pred_min >= -1e-12 and pred_max <= 1e-12: |
| c1_ok += 1 |
| c1_total += 1 |
| margins.append(float(pred_min)) |
|
|
| |
| lhs = np.trace((X.T @ X / n) @ (Sigma - Sdiag)) |
| rhs = -(sigma**2 * alpha / n) * (np.trace(Sigma) - np.sum(mf)) |
| if lhs <= 1e-12: |
| c2_ok += 1 |
| c2_total += 1 |
| identity_err.append(abs(float(lhs - rhs))) |
|
|
| return { |
| "claim1_cells": c1_total, |
| "claim1_pass": c1_ok, |
| "claim1_min_eigen_direction_margin_min": min(margins), |
| "claim2_cells": c2_total, |
| "claim2_pass": c2_ok, |
| "claim2_identity_abs_error_max": max(identity_err), |
| } |
|
|
|
|
| def correlated_grid(): |
| """A second, correlated-design regime for the two linear claims.""" |
| c1_ok = c2_ok = 0 |
| c1_total = c2_total = 0 |
| margins = [] |
| errors = [] |
| for d in (8, 32, 64): |
| for rho in (0.0, 0.5, 0.9, 0.99): |
| cov = (1.0-rho)*np.eye(d) + rho*np.ones((d, d)) |
| L = np.linalg.cholesky(cov) |
| for seed in range(4): |
| rng = np.random.default_rng(19000 + d*100 + int(100*rho) + seed) |
| X = rng.normal(size=(2*d+11, d)) @ L.T |
| sigma, alpha = 0.4 + 0.1*seed, 0.2 + 0.3*rho |
| n = len(X) |
| A = X.T @ X / sigma**2 + alpha*np.eye(d) |
| Sigma = np.linalg.inv(A) |
| mf = 1.0/np.diag(A) |
| w, V = np.linalg.eigh(Sigma) |
| lo, hi = V[:, 0], V[:, -1] |
| p_lo = lo @ (np.diag(mf)-Sigma) @ lo |
| p_hi = hi @ (np.diag(mf)-Sigma) @ hi |
| c1_ok += int(np.all(np.diag(Sigma) >= mf) and p_lo >= -1e-12 and p_hi <= 1e-12) |
| c1_total += 1 |
| margins.append(float(p_lo)) |
| lhs = np.trace((X.T@X/n) @ (Sigma-np.diag(mf))) |
| rhs = -(sigma**2*alpha/n)*(np.trace(Sigma)-np.sum(mf)) |
| c2_ok += int(lhs <= 1e-12) |
| c2_total += 1 |
| errors.append(abs(float(lhs-rhs))) |
| return {"claim1_cells": c1_total, "claim1_pass": c1_ok, |
| "claim1_min_eigen_direction_margin_min": min(margins), |
| "claim2_cells": c2_total, "claim2_pass": c2_ok, |
| "claim2_identity_abs_error_max": max(errors)} |
|
|
|
|
| def rank_one_grid(): |
| """A rank-one design regime, where the trace identity remains exact.""" |
| passed = 0 |
| errors = [] |
| for d in (3, 7, 15, 31, 63): |
| for seed in range(8): |
| rng = np.random.default_rng(27000 + d*100 + seed) |
| n = 2*d + 5 |
| direction = rng.normal(size=d) |
| direction /= np.linalg.norm(direction) |
| X = rng.normal(size=(n, 1)) @ direction[None, :] |
| sigma, alpha = 0.3 + 0.05*seed, 0.1 + 0.02*d |
| A = X.T@X/sigma**2 + alpha*np.eye(d) |
| Sigma = np.linalg.inv(A) |
| mf = 1.0/np.diag(A) |
| lhs = np.trace((X.T@X/n) @ (Sigma-np.diag(mf))) |
| rhs = -(sigma**2*alpha/n)*(np.trace(Sigma)-np.sum(mf)) |
| passed += int(lhs <= 1e-12) |
| errors.append(abs(float(lhs-rhs))) |
| return {"claim2_cells": 40, "claim2_pass": passed, |
| "claim2_identity_abs_error_max": max(errors)} |
|
|
|
|
| def features(x, d, seed): |
| rng = np.random.default_rng(seed) |
| q = d // 2 |
| W = rng.normal(size=q) * 2.0 |
| b = rng.uniform(0.0, 2.0 * np.pi, size=q) |
| z = np.outer(x, W) + b |
| return np.concatenate((np.cos(z), np.sin(z)), axis=1) / np.sqrt(q) |
|
|
|
|
| def temperature_regime(n, d, noise, alpha, shift, seeds): |
| Ts = np.exp(np.linspace(np.log(0.03), np.log(12.0), 80)) |
| tin, too = [], [] |
| for seed in seeds: |
| rng = np.random.default_rng(12000 + seed + 17 * n + d) |
| xtr = rng.uniform(-1.0, 1.0, n) |
| Phi = features(xtr, d, seed + 700) |
| w = rng.normal(size=d) * 0.5 |
| y = Phi @ w + rng.normal(0.0, noise, n) |
| A = Phi.T @ Phi / noise**2 + np.eye(d) / alpha |
| Sigma = np.linalg.inv(A) |
| mu = Sigma @ Phi.T @ y / noise**2 |
| mf = 1.0 / np.diag(A) |
| for name, x in (("id", rng.uniform(-1.0, 1.0, 240)), |
| ("ood", shift + rng.uniform(-1.0, 1.0, 240))): |
| P = features(x, d, seed + 700) |
| yt = P @ w + rng.normal(0.0, noise, len(x)) |
| mean = P @ mu |
| base = (P * P) @ mf |
| vals = [] |
| for T in Ts: |
| var = T * base + noise**2 |
| vals.append(np.mean(-0.5 * np.log(2.0 * np.pi * var) |
| - 0.5 * (yt - mean)**2 / var)) |
| (tin if name == "id" else too).append(float(Ts[int(np.argmax(vals))])) |
| return { |
| "n": n, "d": d, "noise": noise, "alpha": alpha, "ood_shift": shift, |
| "seeds": len(seeds), |
| "id_median_T": float(np.median(tin)), |
| "ood_median_T": float(np.median(too)), |
| "id_below_1": int(sum(t < 1.0 for t in tin)), |
| "ood_above_1": int(sum(t > 1.0 for t in too)), |
| "id_values": tin, "ood_values": too, |
| } |
|
|
|
|
| def main(): |
| out = {"linear": linear_grid(), "correlated_linear": correlated_grid(), |
| "rank_one_linear": rank_one_grid(), "temperature": [ |
| temperature_regime(80, 80, 0.15, 1.0, 4.0, range(16)), |
| temperature_regime(120, 80, 0.12, 0.7, 5.0, range(16, 32)), |
| ]} |
| print(json.dumps(out, sort_keys=True, indent=2)) |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|