SPB Git

spb/wp29_uqo

Public
2.7 KB · 69 lines python
1"""Regenerates out/results.json and out/counterexample.csv from data/ only (deterministic)."""2import json, os3import numpy as np, pandas as pd4from scipy import stats56ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))7D = os.path.join(ROOT, "data"); O = os.path.join(ROOT, "out")89props = pd.read_csv(os.path.join(D, "propositions.csv"))10design = pd.read_csv(os.path.join(D, "design.csv"))11issues = []12if sorted(props["id"]) != ["A", "B"]:13    issues.append({"issue": "unexpected proposition ids", "handling": "stopped"})14par = dict(zip(design["parameter"], design["value"]))15seed, n = int(par["seed"]), int(par["n"])1617# Counterexample to A: X ~ N(0,1), S independent Rademacher, Y = S*X.18# Y ~ N(0,1) by symmetry of N(0,1); X+Y = (1+S)X equals 0 w.p. 1/2 and 2X otherwise.19rng = np.random.default_rng(seed)20x = rng.standard_normal(n)21s = rng.choice(np.array([-1.0, 1.0]), size=n)22y = s * x23z = x + y24pd.DataFrame({"x": x, "y": y}).to_csv(os.path.join(O, "counterexample.csv"), index=False)2526def ks_fitted(v):27    return float(stats.kstest(v, "norm", args=(v.mean(), v.std(ddof=1))).statistic)2829cv = {30    "construction": "X ~ N(0,1); S independent of X with P(S=1)=P(S=-1)=1/2; Y = S*X. "31                    "Then Y ~ N(0,1), but X+Y = (1+S)X equals 0 with probability 1/2 and 2X otherwise "32                    "(an atom at 0 plus a continuous part: neither constant nor normal).",33    "n": int(n), "seed": seed,34    "mean_x": float(x.mean()), "sd_x": float(x.std(ddof=1)),35    "mean_y": float(y.mean()), "sd_y": float(y.std(ddof=1)),36    "mean_sum": float(z.mean()), "sd_sum": float(z.std(ddof=1)),37    "ks_sum_vs_normal": ks_fitted(z),38}39# Supplementary diagnostics40extra = {41    "ks_x_vs_normal": ks_fitted(x), "ks_y_vs_normal": ks_fitted(y),42    "frac_sum_exactly_zero": float(np.mean(z == 0.0)),43    "corr_xy": float(np.corrcoef(x, y)[0, 1]),44    "ks_critical_5pct": float(1.358 / np.sqrt(n)),45}46# Baseline (proposition B illustration): independent X', Y' ~ N(0,1) drawn from the same rng stream after the counterexample.47xb = rng.standard_normal(n); yb = rng.standard_normal(n)48baseline = {"baseline_indep_ks_sum_vs_normal": ks_fitted(xb + yb),49            "baseline_indep_sd_sum": float((xb + yb).std(ddof=1))}5051res = {52    "task_id": "F5-conf-03",53    "statement_true": False,54    "counterexample_provided": True,55    "counterexample_values": cv,56    "statement_b_true": True,57    "feasibility": "complete",58    "feasibility_reason": None,59    "data_issues": issues,60    "n_input_rows": {"propositions.csv": int(len(props)), "design.csv": int(len(design))},61    "n_analysed": int(n),62    "random_seed": seed,63    "diagnostics": extra,64    **baseline,65}66with open(os.path.join(O, "results.json"), "w") as f:67    json.dump(res, f, indent=2)68print(json.dumps(res, indent=2))69
Files · main
Menu

Theme