SPB Git

spb/wp29_uqo

Public
3.0 KB · 82 lines python
1"""F5-conf-03: counterexample to proposition A and baseline check for B.23Run from workspace root: ~/wp29/venv/bin/python out/analysis.py4Reads only data/; writes out/results.json and out/counterexample.csv.5"""6import json7from pathlib import Path89import numpy as np10import pandas as pd11from scipy import stats1213ROOT = Path(__file__).resolve().parent.parent14DATA, OUT = ROOT / "data", ROOT / "out"1516props = pd.read_csv(DATA / "propositions.csv")17design = pd.read_csv(DATA / "design.csv")18data_issues = []19assert set(props["id"]) == {"A", "B"}, "propositions.csv must contain A and B"20par = dict(zip(design["parameter"], design["value"]))21seed, n = int(par["seed"]), int(par["n"])22assert n > 02324def summ(a):25    return float(np.mean(a)), float(np.std(a, ddof=1))2627def ks_vs_fitted_normal(s):28    m, sd = summ(s)29    return float(stats.kstest(s, "norm", args=(m, sd)).statistic)3031rng = np.random.default_rng(seed)32# Counterexample to A: X ~ N(0,1); S ~ Rademacher(+-1 w.p. 1/2) independent of X; Y = S*X.33# Y ~ N(0,1) by symmetry of N(0,1); X+Y = (1+S)X equals 0 w.p. 1/2 and 2X w.p. 1/2.34x = rng.standard_normal(n)35s = rng.choice(np.array([-1.0, 1.0]), size=n)36y = s * x37total = x + y3839pd.DataFrame({"x": x, "y": y}).to_csv(OUT / "counterexample.csv", index=False)4041mx, sx = summ(x); my, sy = summ(y); ms, ss = summ(total)42ks_sum = ks_vs_fitted_normal(total)43# Additional illustrative diagnostics (marginal KS vs fitted normal; atom at zero)44ks_x, ks_y = ks_vs_fitted_normal(x), ks_vs_fitted_normal(y)45frac_sum_zero = float(np.mean(total == 0.0))4647# Baseline for B (same evaluation rule): independent X, Y ~ N(0,1), separate stream48rng_b = np.random.default_rng([seed, 1])49xb, yb = rng_b.standard_normal(n), rng_b.standard_normal(n)50ks_b = ks_vs_fitted_normal(xb + yb)5152results = {53    "task_id": "F5-conf-03",54    "statement_true": False,55    "counterexample_provided": True,56    "counterexample_values": {57        "construction": ("X ~ N(0,1); S independent of X with P(S=1)=P(S=-1)=1/2; Y = S*X. "58                         "Then Y ~ N(0,1), Cov(X,Y)=0, and X+Y = (1+S)X is 0 with probability 1/2 "59                         "and 2X ~ N(0,4) with probability 1/2 (a non-degenerate mixture with an atom at 0, not normal)."),60        "n": int(n), "seed": seed,61        "mean_x": mx, "sd_x": sx, "mean_y": my, "sd_y": sy,62        "mean_sum": ms, "sd_sum": ss,63        "ks_sum_vs_normal": ks_sum,64    },65    "statement_b_true": True,66    "feasibility": "complete",67    "feasibility_reason": None,68    "data_issues": data_issues,69    "n_input_rows": {"propositions.csv": int(len(props)), "design.csv": int(len(design))},70    "n_analysed": int(n),71    "random_seed": seed,72    "diagnostic_ks_x_vs_normal": ks_x,73    "diagnostic_ks_y_vs_normal": ks_y,74    "diagnostic_frac_sum_exactly_zero": frac_sum_zero,75    "diagnostic_ks_critical_value_alpha_0.05": float(1.358 / np.sqrt(n)),76    "baseline_independent_ks_sum_vs_normal": ks_b,77    "baseline_independent_seed_spec": "numpy default_rng([seed, 1])",78}79with open(OUT / "results.json", "w") as f:80    json.dump(results, f, indent=2)81print(json.dumps(results, indent=2))82
Files · main
Menu

Theme