static char* test_logarithmic_values() { load_histograms(); struct hdr_log_iter iter; int index; hdr_log_iter_init(&iter, raw_histogram, 10000, 2.0); index = 0; while(hdr_log_iter_next(&iter)) { long count_added_in_this_bucket = iter.count_added_in_this_iteration_step; if (index == 0) { mu_assert("Raw Logarithmic 10 msec bucket # 0 added a count of 10000", 10000 == count_added_in_this_bucket); } else if (index == 14) { mu_assert("Raw Logarithmic 10 msec bucket # 14 added a count of 1", 1 == count_added_in_this_bucket); } else { mu_assert("Raw Logarithmic 10 msec bucket added a count of 0", 0 == count_added_in_this_bucket); } index++; } mu_assert("Should of seen 14 values", index - 1 == 14); hdr_log_iter_init(&iter, cor_histogram, 10000, 2.0); index = 0; int total_added_count = 0; while (hdr_log_iter_next(&iter)) { long count_added_in_this_bucket = iter.count_added_in_this_iteration_step; if (index == 0) { mu_assert("Corrected Logarithmic 10 msec bucket # 0 added a count of 10001", 10001 == count_added_in_this_bucket); } total_added_count += count_added_in_this_bucket; index++; } mu_assert("Should of seen 14 values", index - 1 == 14); mu_assert("Should of seen count of 20000", total_added_count == 20000); return 0; }
ERL_NIF_TERM _hi_next(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { hi_ctx_t* ctx = NULL; ErlNifResourceType* ctx_type = get_hi_ctx_type(env); if (argc != 1 || ctx_type == NULL || !enif_get_resource(env, argv[0], ctx_type, (void **)&ctx)) { return enif_make_badarg(env); } if (ctx != NULL && ctx->type == HDR_ITER_REC) { // skip until first non-zero index bool has_next = false; while (ctx->iter != NULL && (has_next = hdr_recorded_iter_next(ctx->iter))) { struct hdr_recorded_iter* x = ((struct hdr_recorded_iter*)ctx->iter); struct hdr_iter iter = x->iter; if (0 != iter.count_at_index) { int64_t stp = x->count_added_in_this_iteration_step; int32_t bdx = iter.bucket_index; int64_t sdx = iter.sub_bucket_index; int64_t val = iter.value_from_index; int64_t cat = iter.count_at_index; int64_t cto = iter.count_to_index; int64_t heq = iter.highest_equivalent_value; return enif_make_tuple2(env, ATOM_RECORD, enif_make_list(env, 7, enif_make_tuple2(env, ATOM_BUCKET_IDX, enif_make_int(env,bdx)), enif_make_tuple2(env, ATOM_SUB_BUCKET_IDX, enif_make_long(env,sdx)), enif_make_tuple2(env, ATOM_VAL_FROM_IDX, enif_make_long(env,val)), enif_make_tuple2(env, ATOM_VAL_AT_IDX, enif_make_long(env,cat)), enif_make_tuple2(env, ATOM_COUNT_AT_IDX, enif_make_long(env,cto)), enif_make_tuple2(env, ATOM_HIGHEST_EQUIV_VAL, enif_make_long(env,heq)), enif_make_tuple2(env, ATOM_STEP_COUNT, enif_make_long(env,stp)))); } } } if (ctx != NULL && ctx->type == HDR_ITER_LIN) { // skip until first non-zero index bool has_next = false; while (ctx->iter != NULL && (has_next = hdr_linear_iter_next(ctx->iter))) { struct hdr_linear_iter* x = ((struct hdr_linear_iter*)ctx->iter); struct hdr_iter iter = x->iter; if (0 != iter.count_at_index) { int64_t stp = x->count_added_in_this_iteration_step; int32_t vub = x->value_units_per_bucket; int64_t nvl = x->next_value_reporting_level; int64_t nve = x->next_value_reporting_level_lowest_equivalent; int32_t bdx = iter.bucket_index; int64_t sdx = iter.sub_bucket_index; int64_t val = iter.value_from_index; int64_t cat = iter.count_at_index; int64_t cto = iter.count_to_index; int64_t heq = iter.highest_equivalent_value; return enif_make_tuple2(env, ATOM_LINEAR, enif_make_list(env, 10, enif_make_tuple2(env, ATOM_BUCKET_IDX, enif_make_int(env,bdx)), enif_make_tuple2(env, ATOM_SUB_BUCKET_IDX, enif_make_long(env,sdx)), enif_make_tuple2(env, ATOM_VAL_FROM_IDX, enif_make_long(env,val)), enif_make_tuple2(env, ATOM_VAL_AT_IDX, enif_make_long(env,cat)), enif_make_tuple2(env, ATOM_COUNT_AT_IDX, enif_make_long(env,cto)), enif_make_tuple2(env, ATOM_HIGHEST_EQUIV_VAL, enif_make_long(env,heq)), enif_make_tuple2(env, ATOM_VAL_UNITS_PER_BUCKET, enif_make_int(env,vub)), enif_make_tuple2(env, ATOM_STEP_COUNT, enif_make_long(env,stp)), enif_make_tuple2(env, ATOM_NEXT_VAL_REP_LVL, enif_make_long(env,nvl)), enif_make_tuple2(env, ATOM_NEXT_VAL_REP_LVL_LOW_EQUIV, enif_make_long(env,nve)))); } } } if (ctx != NULL && ctx->type == HDR_ITER_LOG) { // skip until first non-zero index bool has_next = false; while (ctx->iter != NULL && (has_next = hdr_log_iter_next(ctx->iter))) { struct hdr_log_iter* x = (struct hdr_log_iter*)ctx->iter; struct hdr_iter iter = x->iter; if (0 != iter.count_at_index) { int64_t stp = x->count_added_in_this_iteration_step; int32_t vfb = x->value_units_first_bucket; double lgb = x->log_base; int64_t nvl = x->next_value_reporting_level; int64_t nve = x->next_value_reporting_level_lowest_equivalent; int32_t bdx = iter.bucket_index; int64_t sdx = iter.sub_bucket_index; int64_t val = iter.value_from_index; int64_t cat = iter.count_at_index; int64_t cto = iter.count_to_index; int64_t heq = iter.highest_equivalent_value; return enif_make_tuple2(env, ATOM_LOGARITHMIC, enif_make_list(env, 11, enif_make_tuple2(env, ATOM_BUCKET_IDX, enif_make_int(env,bdx)), enif_make_tuple2(env, ATOM_SUB_BUCKET_IDX, enif_make_long(env,sdx)), enif_make_tuple2(env, ATOM_VAL_FROM_IDX, enif_make_long(env,val)), enif_make_tuple2(env, ATOM_VAL_AT_IDX, enif_make_long(env,cat)), enif_make_tuple2(env, ATOM_COUNT_AT_IDX, enif_make_long(env,cto)), enif_make_tuple2(env, ATOM_HIGHEST_EQUIV_VAL, enif_make_long(env,heq)), enif_make_tuple2(env, ATOM_VAL_UNITS_FIRST_BUCKET, enif_make_int(env,vfb)), enif_make_tuple2(env, ATOM_STEP_COUNT, enif_make_long(env,stp)), enif_make_tuple2(env, ATOM_LOG_BASE, enif_make_double(env,lgb)), enif_make_tuple2(env, ATOM_NEXT_VAL_REP_LVL, enif_make_long(env,nvl)), enif_make_tuple2(env, ATOM_NEXT_VAL_REP_LVL_LOW_EQUIV, enif_make_long(env,nve)))); } } } if (ctx != NULL && ctx->type == HDR_ITER_PCT) { // skip until first non-zero index bool has_next = false; while (ctx->iter != NULL && (has_next = hdr_percentile_iter_next(ctx->iter))) { struct hdr_percentile_iter* x = (struct hdr_percentile_iter*)ctx->iter; struct hdr_iter iter = x->iter; if (0 != iter.count_at_index) { bool slv = x->seen_last_value; int32_t tph = x->ticks_per_half_distance; double pti = x->percentile_to_iterate_to; double pct = x->percentile; int32_t bdx = iter.bucket_index; int64_t sdx = iter.sub_bucket_index; int64_t val = iter.value_from_index; int64_t cat = iter.count_at_index; int64_t cto = iter.count_to_index; int64_t heq = iter.highest_equivalent_value; return enif_make_tuple2(env, ATOM_PERCENTILE, enif_make_list(env, 10, enif_make_tuple2(env, ATOM_BUCKET_IDX, enif_make_int(env,bdx)), enif_make_tuple2(env, ATOM_SUB_BUCKET_IDX, enif_make_long(env,sdx)), enif_make_tuple2(env, ATOM_VAL_FROM_IDX, enif_make_long(env,val)), enif_make_tuple2(env, ATOM_VAL_AT_IDX, enif_make_long(env,cat)), enif_make_tuple2(env, ATOM_COUNT_AT_IDX, enif_make_long(env,cto)), enif_make_tuple2(env, ATOM_HIGHEST_EQUIV_VAL, enif_make_long(env,heq)), enif_make_tuple2(env, ATOM_SEEN_LAST_VAL, enif_make_atom(env,slv ? "true" : "false")), enif_make_tuple2(env, ATOM_PERCENTILE_TO_ITERATE_TO, enif_make_double(env,pti)), enif_make_tuple2(env, ATOM_PERCENTILE, enif_make_double(env,pct)), enif_make_tuple2(env, ATOM_TICKS_PER_HALF_DISTANCE, enif_make_int(env,tph)))); } } } return enif_make_tuple2( env, ATOM_FALSE, enif_make_tuple(env,0) ); }