1"""F5-conf-03: counterexample to proposition A; regenerates out/results.json and out/counterexample.csv."""2import json, os3import numpy as np, pandas as pd4from scipy import stats56ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))7D, O = os.path.join(ROOT, "data"), os.path.join(ROOT, "out")8props = pd.read_csv(os.path.join(D, "propositions.csv"))9design = pd.read_csv(os.path.join(D, "design.csv"))10par = dict(zip(design["parameter"], design["value"]))11seed, n = int(par["seed"]), int(par["n"])1213issues = []14if set(props["id"]) != {"A", "B"}:15 issues.append({"issue": "unexpected proposition ids", "handling": "assessed as listed"})1617# Construction: X ~ N(0,1), S ~ Rademacher independent of X, Y = S*X.18rng = np.random.default_rng(seed)19x = rng.standard_normal(n)20s = rng.choice(np.array([-1.0, 1.0]), size=n)21y = s * x22z = x + y23pd.DataFrame({"x": x, "y": y}).to_csv(os.path.join(O, "counterexample.csv"), index=False)2425mz, sz = z.mean(), z.std(ddof=1)26ks = stats.kstest(z, "norm", args=(mz, sz)).statistic27ks_x = stats.kstest(x, "norm", args=(x.mean(), x.std(ddof=1)))28ks_y = stats.kstest(y, "norm", args=(y.mean(), y.std(ddof=1)))2930res = {31 "task_id": "F5-conf-03",32 "statement_true": False,33 "counterexample_provided": True,34 "counterexample_values": {35 "construction": "X ~ N(0,1); S ~ Rademacher (P(S=1)=P(S=-1)=1/2) independent of X; Y = S*X. "36 "Then Y ~ N(0,1) by symmetry, but X+Y = (1+S)X equals 0 with probability 1/2 "37 "and 2X otherwise (Var = 2), so X+Y has an atom at 0 and is neither normal nor constant.",38 "n": int(n), "seed": seed,39 "mean_x": float(x.mean()), "sd_x": float(x.std(ddof=1)),40 "mean_y": float(y.mean()), "sd_y": float(y.std(ddof=1)),41 "mean_sum": float(mz), "sd_sum": float(sz),42 "ks_sum_vs_normal": float(ks),43 "supplementary": {44 "share_sum_exactly_zero": float(np.mean(z == 0)),45 "ks_x_vs_fitted_normal": float(ks_x.statistic), "ks_x_pvalue": float(ks_x.pvalue),46 "ks_y_vs_fitted_normal": float(ks_y.statistic), "ks_y_pvalue": float(ks_y.pvalue),47 "corr_xy": float(np.corrcoef(x, y)[0, 1]),48 "excess_kurtosis_sum": float(stats.kurtosis(z)),49 },50 },51 "statement_b_true": True,52 "feasibility": "complete",53 "feasibility_reason": None,54 "data_issues": issues,55 "n_input_rows": {"propositions.csv": int(len(props)), "design.csv": int(len(design))},56 "n_analysed": int(n),57 "random_seed": seed,58}59with open(os.path.join(O, "results.json"), "w") as f:60 json.dump(res, f, indent=2)61print(json.dumps(res, indent=2))62