func()

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
}