func putSparseHybridHip()

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
}