func()

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,
	)
}