in sampling/include/var_opt_sketch_impl.hpp [1334:1377]
uint32_t var_opt_sketch<T, A>::validate_and_get_target_size(uint32_t preamble_longs, uint32_t k, uint64_t n,
uint32_t h, uint32_t r, resize_factor rf) {
if (k == 0 || k > MAX_K) {
throw std::invalid_argument("k must be at least 1 and less than 2^31 - 1");
}
uint32_t array_size;
if (n <= k) {
if (preamble_longs != PREAMBLE_LONGS_WARMUP) {
throw std::invalid_argument("Possible corruption: deserializing with n <= k but not in warmup mode. "
"Found n = " + std::to_string(n) + ", k = " + std::to_string(k));
}
if (n != h) {
throw std::invalid_argument("Possible corruption: deserializing in warmup mode but n != h. "
"Found n = " + std::to_string(n) + ", h = " + std::to_string(h));
}
if (r > 0) {
throw std::invalid_argument("Possible corruption: deserializing in warmup mode but r > 0. "
"Found r = " + std::to_string(r));
}
const uint32_t ceiling_lg_k = to_log_2(ceiling_power_of_2(k));
const uint32_t min_lg_size = to_log_2(ceiling_power_of_2(h));
const uint32_t initial_lg_size = starting_sub_multiple(ceiling_lg_k, rf, min_lg_size);
array_size = get_adjusted_size(k, 1 << initial_lg_size);
if (array_size == k) { // if full size, need to leave 1 for the gap
++array_size;
}
} else { // n > k
if (preamble_longs != PREAMBLE_LONGS_FULL) {
throw std::invalid_argument("Possible corruption: deserializing with n > k but not in full mode. "
"Found n = " + std::to_string(n) + ", k = " + std::to_string(k));
}
if (h + r != k) {
throw std::invalid_argument("Possible corruption: deserializing in full mode but h + r != n. "
"Found h = " + std::to_string(h) + ", r = " + std::to_string(r) + ", n = " + std::to_string(n));
}
array_size = k + 1;
}
return array_size;
}