33 struct measure_auto_corr_time {
35 measure_auto_corr_time(qmc_data
const &_data,
double &_auto_corr_time,
bool &_auto_corr_time_converged)
36 : data(_data), auto_corr_time(_auto_corr_time), auto_corr_time_converged(_auto_corr_time_converged) {}
38 void accumulate(mc_weight_t sign) {
40 log_accs[1] << data.config.size();
43 void collect_results(mpi::communicator
const &comm) {
49 constexpr int min_samples = 64;
50 constexpr double n_sigma = 2.0;
54 auto_corr_time_converged =
true;
56 auto d_tau = [](
double tau,
long M) {
return (tau + 0.5) * std::sqrt(2.0 /
static_cast<double>(M - 1)); };
58 for (
auto &log_acc : log_accs) {
59 auto [mean, errs, taus, effs] = log_acc.mean_errors_and_taus(comm, min_samples);
64 auto_corr_time_converged =
false;
69 if (!std::isfinite(taus.back()))
continue;
71 double const tau_a = taus.back();
72 auto_corr_time = std::max(auto_corr_time, tau_a);
75 auto const n = taus.size();
76 if (n < 2 || !std::isfinite(taus[n - 2])) {
77 auto_corr_time_converged =
false;
80 double const tau_b = taus[n - 2];
81 if (tau_a - tau_b > n_sigma * d_tau(tau_a, effs[n - 1])) auto_corr_time_converged =
false;
87 double &auto_corr_time;
88 bool &auto_corr_time_converged;
91 std::vector<triqs::stat::log_binning<dcomplex>> log_accs = {2, {dcomplex{0.0}, -1}};