in cpc/cpc_sketch.go [273:331]
func (c *CpcSketch) updateWindowed(rowCol int) error {
if c.windowOffset < 0 || c.windowOffset > 56 {
return fmt.Errorf("windowOffset < 0 || windowOffset > 56")
}
k := uint64(1) << c.lgK
c32pre := c.numCoupons << 5
if c32pre < (3 * k) {
return fmt.Errorf("C < 3K/32")
}
c8pre := c.numCoupons << 3
w8pre := uint64(c.windowOffset << 3)
if c8pre >= ((uint64(27) + w8pre) * k) {
return fmt.Errorf("C >= (K * 27/8) + (K * windowOffset)")
}
isNovel := false //novel if new coupon
err := error(nil)
col := rowCol & 63
if col < c.windowOffset { // track the surprising 0's "before" the window
isNovel, err = c.pairTable.maybeDelete(rowCol)
if err != nil {
return err
}
} else if col < (c.windowOffset + 8) { // track the 8 bits inside the window
row := rowCol >> 6
oldBits := c.slidingWindow[row]
newBits := oldBits | (1 << (col - c.windowOffset))
if newBits != oldBits {
c.slidingWindow[row] = newBits
isNovel = true
}
} else { // track the surprising 1's "after" the window
isNovel, err = c.pairTable.maybeInsert(rowCol)
if err != nil {
return err
}
}
if isNovel {
c.numCoupons++
c.updateHIP(rowCol)
c8post := c.numCoupons << 3
if c8post >= ((27 + w8pre) * k) {
if err := c.modifyOffset(c.windowOffset + 1); err != nil {
return err
}
if c.windowOffset < 1 || c.windowOffset > 56 {
return fmt.Errorf("windowOffset < 1 || windowOffset > 56")
}
w8post := uint64(c.windowOffset << 3)
if c8post >= ((uint64(27) + w8post) * k) {
return fmt.Errorf("C < (K * 27/8) + (K * windowOffset)")
}
}
}
return nil
}