Checker ((exclusive)): Hmc
ess_ratio = ess / total_samples if np.any(ess_ratio < ess_ratio_threshold): results["warnings"].append(f"Low ESS/total_samples (< {ess_ratio_threshold})")
print("HMC Checker Report") print("=" * 40) print(f"Overall status: {'✅ PASS' if report['passed'] else '❌ FAIL'}") if report["warnings"]: print("\n⚠️ Warnings:") for w in report["warnings"]: print(f" - {w}") if report["failures"]: print("\n❌ Failures:") for f in report["failures"]: print(f" - {f}") You could also wrap it as:
# 2. ESS / total samples ess = az.ess(inference_data).to_array().values n_samples = inference_data.posterior.sizes["draw"] n_chains = inference_data.posterior.sizes["chain"] total_samples = n_samples * n_chains hmc checker
# 6. Energy plot check (text summary) if hasattr(inference_data, "sample_stats") and hasattr(inference_data.sample_stats, "energy"): energy = inference_data.sample_stats.energy.values # simple check: coefficient of variation across chains chain_means = energy.mean(axis=1) cv = np.std(chain_means) / np.mean(chain_means) if cv > 0.1: results["warnings"].append(f"Energy means vary across chains (CV={cv:.3f})")
# 1. R-hat rhat = az.rhat(inference_data).to_array().values if np.any(rhat > rhat_threshold): results["failures"].append(f"R-hat > {rhat_threshold} for some parameters") results["passed"] = False ess_ratio = ess / total_samples if np
# For demo, create dummy data import pymc as pm with pm.Model(): x = pm.Normal("x") trace = pm.sample(1000, chains=2, return_inferencedata=True)
# 5. BFMI if hasattr(inference_data, "sample_stats") and hasattr(inference_data.sample_stats, "bfmi"): bfmi = inference_data.sample_stats.bfmi.values.mean() if bfmi < bfmi_threshold: results["failures"].append(f"BFMI = {bfmi:.2f} < {bfmi_threshold}") results["passed"] = False R-hat rhat = az
return results if name == " main ": # Load your inference data # idata = az.from_netcdf("my_model.nc")