in cpc/cpc_union.go [253:297]
func (u *CpcUnion) reduceUnionK(newLgK int) error {
if newLgK < u.lgK {
if u.bitMatrix != nil {
newK := 1 << newLgK
newMatrix := make([]uint64, newK)
orMatrixIntoMatrix(newMatrix, newLgK, u.bitMatrix, u.lgK)
u.bitMatrix = newMatrix
u.lgK = newLgK
} else {
oldSketch := u.accumulator
if oldSketch.numCoupons == 0 {
acc, err := NewCpcSketch(newLgK, oldSketch.seed)
if err != nil {
return err
}
u.accumulator = acc
u.lgK = newLgK
return nil
}
newSketch, err := NewCpcSketch(newLgK, oldSketch.seed)
if err != nil {
return err
}
if err := walkTableUpdatingSketch(newSketch, oldSketch.pairTable); err != nil {
return err
}
finalNewFlavor := newSketch.getFlavor()
if finalNewFlavor == CpcFlavorSparse {
u.accumulator = newSketch
u.lgK = newLgK
return nil
}
// The new sketch has graduated beyond sparse, so convert to bitMatrix.
bitMatrix, err := newSketch.bitMatrixOfSketch()
if err != nil {
return err
}
u.bitMatrix = bitMatrix
u.lgK = newLgK
// Ensure that the accumulator is cleared.
u.accumulator = nil
}
}
return nil
}