in cpc/streaming_validation.go [93:162]
func (sv *StreamingValidation) doTrialsAtLgKAtN(lgK int, n int64) {
var sumC, sumIconEst, sumHipEst float64
// We'll create sketches once outside the loop, but we reset them each trial.
// Also create a BitMatrix to compare the set bits.
sketch, _ := NewCpcSketch(lgK, internal.DEFAULT_UPDATE_SEED)
matrix := NewBitMatrixWithSeed(lgK, internal.DEFAULT_UPDATE_SEED)
for t := 0; t < sv.trials; t++ {
sketch.reset()
matrix.Reset()
for i := int64(0); i < n; i++ {
sv.vIn += common.InverseGoldenU64
in := sv.vIn
// Update the CPC sketch
_ = sketch.UpdateUint64(in)
// Update the BitMatrix
matrix.Update(int64(in))
}
// Accumulate sums
sumC += float64(sketch.numCoupons)
sumIconEst += iconEstimate(lgK, sketch.numCoupons)
sumHipEst += sketch.hipEstAccum
// Check that the number of coupons matches the matrix
if matrix.GetNumCoupons() != sketch.numCoupons {
panic(fmt.Sprintf("Mismatch in numCoupons: bitMatrix=%d, cpcSketch=%d",
matrix.GetNumCoupons(), sketch.numCoupons))
}
// Check that the actual bit matrix matches
bitMat, err := sketch.bitMatrixOfSketch()
if err != nil {
panic(fmt.Sprintf("bitMatrixOfSketch error: %v", err))
}
mat2 := matrix.GetMatrix()
// Compare row by row
if len(bitMat) != len(mat2) {
panic(fmt.Sprintf("Mismatch: bitMatrixOfSketch len=%d, matrix.GetMatrix len=%d",
len(bitMat), len(mat2)))
}
for i := range bitMat {
if bitMat[i] != mat2[i] {
panic(fmt.Sprintf("Mismatch at row %d: bitMat=%x, mat2=%x", i, bitMat[i], mat2[i]))
}
}
}
// final state from the last trial
finC := sketch.numCoupons
finFlavor := sketch.getFlavor()
finOff := sketch.windowOffset
avgC := sumC / float64(sv.trials)
avgIconEst := sumIconEst / float64(sv.trials)
avgHipEst := sumHipEst / float64(sv.trials)
// Print the row
sv.printf(
sv.dfmt,
lgK,
sv.trials,
n,
finC,
finFlavor.String(),
finOff,
avgC,
avgIconEst,
avgHipEst,
)
}