#pragma once

#include <cstddef>

namespace fn::ds {

// Autocorrelacion lag k de la serie x[0..n). r(k) = cov(x_t, x_{t+k}) / var(x).
// Definicion clasica con normalizacion sobre la varianza global. Devuelve
// 1.0 para k=0 si la serie tiene varianza > 0; si var = 0 devuelve 0 para
// todos los k.
//
// Si k >= n o n <= 1 devuelve 0.
double autocorr_lag(const double* x, std::size_t n, std::size_t k);

// Llena out[max_lag] con r(0), r(1), ..., r(max_lag-1). Util para ACF plots.
void autocorr_acf(const double* x, std::size_t n,
                  std::size_t max_lag, double* out);

// Integrated Autocorrelation Time (tau_int) — definicion de Sokal con
// truncado automatico cuando r(k) cae bajo el umbral. tau_int = 1 + 2 * sum
// de r(k) hasta k_cutoff. Util para estimar Effective Sample Size:
// ESS = n / tau_int.
//
// max_lag actua como cota dura. Si la ACF nunca cae bajo cutoff dentro de
// max_lag, devuelve 1 + 2*sum hasta max_lag-1 (estimacion conservadora).
double autocorr_tau(const double* x, std::size_t n,
                    std::size_t max_lag = 200,
                    double cutoff = 0.05);

} // namespace fn::ds
