in cpp/src/req_error_vs_rank_profile_impl.hpp [41:88]
void req_error_vs_rank_profile<T>::run() {
const size_t lg_stream_len = 25;
const size_t plot_points = 100;
const size_t num_trials = 10000;
const bool hra = true;
const uint16_t k = 12;
const uint16_t error_sketch_k = 1000;
size_t stream_len = 1 << lg_stream_len;
std::vector<T> values(stream_len);
std::vector<double> plot_ranks(plot_points);
for (size_t i = 0; i < plot_points; ++i) plot_ranks[i] = static_cast<double>(i) / (plot_points - 1);
std::vector<kll_sketch<double>> error_distributions(plot_points);
std::generate(error_distributions.begin(), error_distributions.end(), []{return kll_sketch<double>(error_sketch_k);});
std::cout << "Trials: " << num_trials << "\n";
for (size_t t = 1; t <= num_trials; ++t) {
if (t % 10 == 0) std::cout << "trial " << t << "\n";
std::generate(values.begin(), values.end(), [this]{return sample();});
// req_sketch<T> sketch(k, hra);
tdigest<T> sketch(100);
for (auto value: values) sketch.update(value);
std::sort(values.begin(), values.end());
for (size_t i = 0; i < plot_points; ++i) {
const T quantile = get_quantile(values, values.size(), plot_ranks[i]);
// const double true_rank = get_rank(values, values.size(), quantile, INCLUSIVE);
const double true_rank = get_rank(values, values.size(), quantile, MIDPOINT);
error_distributions[i].update(sketch.get_rank(quantile) - true_rank);
}
}
std::cout << "Rank\t-3SD\t-2SD\t-1SD\tMed\t+1SD\t+2SD\t+3SD\n";
for (size_t i = 0; i < plot_points; ++i) {
std::cout << plot_ranks[i] << "\t";
std::cout << error_distributions[i].get_quantile(M3SD) << "\t";
std::cout << error_distributions[i].get_quantile(M2SD) << "\t";
std::cout << error_distributions[i].get_quantile(M1SD) << "\t";
std::cout << error_distributions[i].get_quantile(0.5) << "\t";
std::cout << error_distributions[i].get_quantile(P1SD) << "\t";
std::cout << error_distributions[i].get_quantile(P2SD) << "\t";
std::cout << error_distributions[i].get_quantile(P3SD) << "\n";
}
}