Skip to content

Commit

Permalink
Fixing quantile again, check min_rank
Browse files Browse the repository at this point in the history
  • Loading branch information
armon committed Feb 28, 2016
1 parent 8c43e88 commit ea58c73
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 3 deletions.
6 changes: 3 additions & 3 deletions src/cm_quantile.c
Original file line number Diff line number Diff line change
Expand Up @@ -163,16 +163,16 @@ int cm_flush(cm_quantile *cm) {
* @return The value on success or 0.
*/
double cm_query(cm_quantile *cm, double quantile) {
uint64_t rank = floor(quantile * cm->num_values);
uint64_t rank = ceil(quantile * cm->num_values);
uint64_t min_rank=0;
uint64_t max_rank;
uint64_t threshold = floor(cm_threshold(cm, rank) / 2.);
uint64_t threshold = ceil(cm_threshold(cm, rank) / 2.);

cm_sample *prev = cm->samples;
cm_sample *current = cm->samples;
while (current) {
max_rank = min_rank + current->width + current->delta;
if (max_rank > rank + threshold) {
if (max_rank > rank + threshold || min_rank > rank) {
break;
}
min_rank += current->width;
Expand Down
1 change: 1 addition & 0 deletions tests/runner.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ int main(void)
tcase_add_test(tc2, test_cm_init_add_loop_destroy);
tcase_add_test(tc2, test_cm_init_query_destroy);
tcase_add_test(tc2, test_cm_init_add_query_destroy);
tcase_add_test(tc2, test_cm_init_add3_query_destroy);
tcase_add_test(tc2, test_cm_init_add_negative_query_destroy);
tcase_add_test(tc2, test_cm_init_add_loop_query_destroy);
tcase_add_test(tc2, test_cm_init_add_loop_tail_query_destroy);
Expand Down
27 changes: 27 additions & 0 deletions tests/test_cm_quantile.c
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,33 @@ START_TEST(test_cm_init_add_query_destroy)
}
END_TEST

START_TEST(test_cm_init_add3_query_destroy)
{
cm_quantile cm;
double quants[] = {0.5, 0.90, 0.99};
int res = init_cm_quantile(0.01, (double*)&quants, 3, &cm);
fail_unless(res == 0);

res = cm_add_sample(&cm, 100.0);
fail_unless(res == 0);

res = cm_add_sample(&cm, 200.0);
fail_unless(res == 0);

res = cm_add_sample(&cm, 300.0);
fail_unless(res == 0);

res = cm_flush(&cm);
fail_unless(res == 0);

double val = cm_query(&cm, 0.5);
fail_unless(val == 200.0);

res = destroy_cm_quantile(&cm);
fail_unless(res == 0);
}
END_TEST

START_TEST(test_cm_init_add_negative_query_destroy)
{
cm_quantile cm;
Expand Down

0 comments on commit ea58c73

Please sign in to comment.