| 7467 | } |
| 7468 | |
| 7469 | double outlier_variance(Estimate<double> mean, Estimate<double> stddev, int n) { |
| 7470 | double sb = stddev.point; |
| 7471 | double mn = mean.point / n; |
| 7472 | double mg_min = mn / 2.; |
| 7473 | double sg = std::min(mg_min / 4., sb / std::sqrt(n)); |
| 7474 | double sg2 = sg * sg; |
| 7475 | double sb2 = sb * sb; |
| 7476 | |
| 7477 | auto c_max = [n, mn, sb2, sg2](double x) -> double { |
| 7478 | double k = mn - x; |
| 7479 | double d = k * k; |
| 7480 | double nd = n * d; |
| 7481 | double k0 = -n * nd; |
| 7482 | double k1 = sb2 - n * sg2 + nd; |
| 7483 | double det = k1 * k1 - 4 * sg2 * k0; |
| 7484 | return (int)(-2. * k0 / (k1 + std::sqrt(det))); |
| 7485 | }; |
| 7486 | |
| 7487 | auto var_out = [n, sb2, sg2](double c) { |
| 7488 | double nc = n - c; |
| 7489 | return (nc / n) * (sb2 - nc * sg2); |
| 7490 | }; |
| 7491 | |
| 7492 | return std::min(var_out(1), var_out(std::min(c_max(0.), c_max(mg_min)))) / sb2; |
| 7493 | } |
| 7494 | |
| 7495 | bootstrap_analysis analyse_samples(double confidence_level, int n_resamples, std::vector<double>::iterator first, std::vector<double>::iterator last) { |
| 7496 | CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS |