#pragma once #include namespace fn::ds { // Diagnosticos multi-chain para MCMC. Las cadenas estan dispuestas como // chains[m * n + i] (row-major: m chains, n samples cada una). Todas las // cadenas deben tener la misma longitud n. // // rhat: Gelman-Rubin estandar. R_hat = sqrt(((n-1)*W + B) / (n*W)) donde // W = within-chain variance promedio, B = between-chain variance. // Convergencia tipica: R_hat < 1.01. double rhat(const double* chains, std::size_t m, std::size_t n); // rhat_split: variante moderna (Stan / pymc) que parte cada cadena en dos // mitades antes de computar R_hat sobre 2m sub-cadenas. Detecta no-mixing // en cadenas que parecen estables pero estan stuck en distintos modos. double rhat_split(const double* chains, std::size_t m, std::size_t n); // ess_basic: Effective Sample Size por cadena, suma sobre cadenas. // ESS_chain = n / tau_int(chain), ESS_total = sum_chains. // Conservador para multi-chain (no usa la varianza between). double ess_basic(const double* chains, std::size_t m, std::size_t n, std::size_t max_lag = 200, double cutoff = 0.05); } // namespace fn::ds