41 double eps = (observations(0) == 0.0) ? 1e-8 : std::abs(observations(0)) * 1e-8;
43 N = observations.size();
44 bool is_even = ((N % 2) == 0);
50 if(std::abs(observations(i) - observations(0)) > eps) {
62 start2 = (is_even) ? N / 2 : (N / 2) + 1;
65 sum1 = observations.head(start2).sum();
67 sum2 = observations.segment(start2, N - start2).sum();
73 while(std::abs((sum1 / (start2 - start1)) - (sum2 / (N - start2))) > prec && start1 < N - 2) {
79 sum1 -= observations(start1);
80 sum1 += observations(start2);
81 sum2 -= observations(start2);
85 sum1 -= observations(start1);
93 double mean_tot = (sum1 + sum2) / (N - start1);
95 if(observations(start1) < mean_tot) {
96 while(observations(start1) < mean_tot && start1 < N - 1)
100 while(observations(start1) > mean_tot && start1 < N - 1)
128 m_is_converged(false),
129 m_mean(observations.mean()),
130 m_squared_norm(observations.squaredNorm()) {
133 double z_alpha = sqrt(2.0) * boost::math::erf_inv(conf);
141 std::tie(found_rho, rho, CoVar0) =
_calc_rho(observations);
150 double var_of_mean = (CoVar0 / N) * (1.0 + rho) / (1.0 - rho);
157 return (X - vmean).dot(Y - vmean) / X.size();
171 if(std::abs(CoVar0 / m_mean) < 1e-8 || CoVar0 == 0.0) {
173 return std::make_tuple(
true, pow(2.0, -1.0 / 1), CoVar0);
181 double cov =
covariance(observations.segment(0, range_size), observations.segment(i, range_size),
m_mean);
183 if(std::abs(cov / CoVar0) <= 0.5) {
184 return std::make_tuple(
true, pow(2.0, (-1.0 / i)), CoVar0);
189 return std::make_tuple(
false, 0.0, CoVar0);
MCDataConvergence()
Default constructor.
MCData::size_type size_type
MCDataEquilibration()
Default constructor.
MCData::size_type size_type
size_type m_equil_samples
double covariance(const Eigen::VectorXd &X, const Eigen::VectorXd &Y, double mean)
std::tuple< bool, double, double > _calc_rho(const Eigen::VectorXd &observations)
Try to find rho = pow(2.0, -1.0/i), using min i such that CoVar[i]/CoVar[0] <= 0.5.