in cpc/utils.go [545:597]
func putSparseHybridHip(mem []byte, lgK int, numCoupons, svLengthInts int, kxp, hipAccum float64, seedHash int16, svStream []int) error {
// Set the format.
format := CpcFormatSparseHybridHip
preInts := byte(getDefinedPreInts(format))
fiCol := byte(0)
flags := byte((int(format) << 2) | compressedFlagMask)
// Check that mem has enough capacity: 4 bytes per preInt + 4 bytes per sv integer.
if err := checkCapacity(len(mem), 4*(int(preInts)+svLengthInts)); err != nil {
return err
}
// Write the low preamble fields.
if err := putFirst8(mem, preInts, byte(lgK), fiCol, flags, seedHash); err != nil {
return err
}
// Write the high preamble fields.
offset, err := getHiFieldOffset(format, hiFieldNumCoupons)
if err != nil {
return err
}
binary.LittleEndian.PutUint32(mem[offset:], uint32(numCoupons))
offset, err = getHiFieldOffset(format, hiFieldSVLengthInts)
if err != nil {
return err
}
binary.LittleEndian.PutUint32(mem[offset:], uint32(svLengthInts))
offset, err = getHiFieldOffset(format, hiFieldKXP)
if err != nil {
return err
}
binary.LittleEndian.PutUint64(mem[offset:], math.Float64bits(kxp))
offset, err = getHiFieldOffset(format, hiFieldHipAccum)
if err != nil {
return err
}
binary.LittleEndian.PutUint64(mem[offset:], math.Float64bits(hipAccum))
// Write the SV stream into memory.
offset, err = getSvStreamOffset(mem)
if err != nil {
return err
}
for i := 0; i < svLengthInts; i++ {
binary.LittleEndian.PutUint32(mem[offset+4*i:], uint32(svStream[i]))
}
return nil
}