in cpc/cpc_sketch.go [435:482]
func (c *CpcSketch) modifyOffset(newOffset int) error {
if newOffset < 0 || newOffset > 56 {
return fmt.Errorf("newOffset < 0 || newOffset > 56")
}
if newOffset != (c.windowOffset + 1) {
return fmt.Errorf("newOffset != (c.windowOffset + 1)")
}
if c.slidingWindow == nil || c.pairTable == nil {
return fmt.Errorf("slidingWindow == nil || pairTable == nil")
}
k := 1 << c.lgK
bitMatrix, err := c.bitMatrixOfSketch()
if err != nil {
return err
}
if (newOffset & 0x7) == 0 {
c.refreshKXP(bitMatrix)
}
c.pairTable.clear()
maskForClearingWindow := (0xFF << newOffset) ^ -1
maskForFlippingEarlyZone := (1 << newOffset) - 1
allSurprisesORed := uint64(0)
for i := 0; i < k; i++ {
pattern := bitMatrix[i]
c.slidingWindow[i] = byte((pattern >> newOffset) & 0xFF)
pattern &= uint64(maskForClearingWindow)
pattern ^= uint64(maskForFlippingEarlyZone)
allSurprisesORed |= pattern
for pattern != 0 {
col := bits.TrailingZeros64(pattern)
pattern ^= 1 << col
rowCol := (i << 6) | col
isNovel, err := c.pairTable.maybeInsert(rowCol)
if err != nil {
return err
}
if !isNovel {
return nil
}
}
}
c.windowOffset = newOffset
c.fiCol = bits.TrailingZeros64(allSurprisesORed)
if c.fiCol > newOffset {
c.fiCol = newOffset
}
return nil
}