in cpc/include/cpc_sketch_impl.hpp [223:262]
void cpc_sketch_alloc<A>::update_windowed(uint32_t row_col) {
if (window_offset > 56) throw std::logic_error("wrong window offset");
const uint32_t k = 1 << lg_k;
const uint64_t c32pre = static_cast<uint64_t>(num_coupons) << 5;
if (c32pre < 3 * k) throw std::logic_error("c32pre < 3 * k"); // C < 3K/32, in other words flavor >= HYBRID
const uint64_t c8pre = static_cast<uint64_t>(num_coupons) << 3;
const uint64_t w8pre = static_cast<uint64_t>(window_offset) << 3;
if (c8pre >= (27 + w8pre) * k) throw std::logic_error("c8pre is wrong"); // C < (K * 27/8) + (K * window_offset)
bool is_novel = false;
const uint8_t col = row_col & 63;
if (col < window_offset) { // track the surprising 0's "before" the window
is_novel = surprising_value_table.maybe_delete(row_col); // inverted logic
} else if (col < window_offset + 8) { // track the 8 bits inside the window
if (col < window_offset) throw std::logic_error("col < window_offset");
const uint32_t row = row_col >> 6;
const uint8_t old_bits = sliding_window[row];
const uint8_t new_bits = old_bits | (1 << (col - window_offset));
if (new_bits != old_bits) {
sliding_window[row] = new_bits;
is_novel = true;
}
} else { // track the surprising 1's "after" the window
if (col < window_offset + 8) throw std::logic_error("col < window_offset + 8");
is_novel = surprising_value_table.maybe_insert(row_col); // normal logic
}
if (is_novel) {
num_coupons++;
update_hip(row_col);
const uint64_t c8post = static_cast<uint64_t>(num_coupons) << 3;
if (c8post >= (27 + w8pre) * k) {
move_window();
if (window_offset < 1 || window_offset > 56) throw std::logic_error("wrong window offset");
const uint64_t w8post = static_cast<uint64_t>(window_offset) << 3;
if (c8post >= (27 + w8post) * k) throw std::logic_error("c8pre is wrong"); // C < (K * 27/8) + (K * window_offset)
}
}
}