#pragma once

#include <cstddef>

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
