import csv
from pathlib import Path
import glmm
from _oracle import TOL_BETA_REL, TOL_LOGLIK_ABS_GLMM, TOL_SE_HESSIAN_REL, TOL_STDDEV_REL, check_abs, check_rel, load_golden
DATA_PATH = Path(__file__).resolve().parents[3] / "validation" / "data" / "empirical" / "cbpp.csv"
with open(DATA_PATH, newline="") as f:
rows = list(csv.DictReader(f))
incidence = [float(r["incidence"]) for r in rows]
size = [float(r["size"]) for r in rows]
data = {
"prop": [i / s for i, s in zip(incidence, size)],
"period": [r["period"] for r in rows],
"herd": [r["herd"] for r in rows],
}
fit = glmm.fit(data, "prop ~ period + (1 | herd)", family="binomial", weights=size)
print("converged:", fit.converged, " singular:", fit.singular)
fit.summary()
sd, _corr = fit.stddev_corr(0)
print("herd stddev:", sd[0])
print("loglik:", fit.loglik)
print("\noracle cross-check vs goldens/cbpp_agq_k1.json (manifest rung 5, nagq=1):")
g = load_golden("cbpp_agq_k1")
est = g["estimates"]
for i, name in enumerate(g["coef_names"]):
check_rel(f"beta[{name}]", fit.beta[i], est["beta"][i], TOL_BETA_REL)
for i, name in enumerate(g["coef_names"]):
check_rel(f"se_hessian[{name}]", fit.se[i], est["se_hessian"][i], TOL_SE_HESSIAN_REL)
check_rel("herd stddev", sd[0], est["varcomp"][0]["stddev"][0], TOL_STDDEV_REL)
check_abs("loglik", fit.loglik, est["loglik"], TOL_LOGLIK_ABS_GLMM)