mirror of
https://gitlab.com/pulsechaincom/erigon-pulse.git
synced 2025-01-04 01:54:28 +00:00
f2549ad6ec
* Integration of recsplit * Add tables * Print bucket by bucket * Not to print all keys * Print correct bitSize * switch to []byte * Optimisation * Fix * Fix lint * Performance improvements * Print bucket info * Add tracing * Fixed split Co-authored-by: Alex Sharp <alexsharp@Alexs-MacBook-Pro.local> Co-authored-by: Alexey Sharp <alexeysharp@Alexeys-iMac.local>
241 lines
13 KiB
Go
241 lines
13 KiB
Go
/*
|
|
Copyright 2021 Erigon contributors
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package recsplit
|
|
|
|
import (
|
|
"io"
|
|
"math/bits"
|
|
)
|
|
|
|
// Optimal Golomb-Rice parameters for leaves
|
|
var bijMemo []uint32 = []uint32{0, 0, 0, 1, 3, 4, 5, 7, 8, 10, 11, 12, 14, 15, 16, 18, 19, 21, 22, 23, 25, 26, 28, 29, 30}
|
|
|
|
// GolombRice can build up the golomb-rice encoding of the sequeuce of numbers, as well as read the numbers back from it.
|
|
type GolombRice struct {
|
|
bitCount int // Speficic to the builder - number of bits added to the encoding so far
|
|
data []uint64 // Present in the builder and in the reader
|
|
currFixedOffset int // Specific to the reader
|
|
currWindowUnary uint64
|
|
currPtrUnary int
|
|
validLowerBitsUnary int
|
|
}
|
|
|
|
// appendUnaryAll adds the unary encoding of specified sequence of numbers to the end of the
|
|
// current encoding
|
|
func (g *GolombRice) appendUnaryAll(unary []uint64) {
|
|
bitInc := 0
|
|
for _, u := range unary {
|
|
// Each number u uses u+1 bits for its unary representation
|
|
bitInc += int(u) + 1
|
|
}
|
|
targetSize := (g.bitCount + bitInc + 63) / 64
|
|
for len(g.data) < targetSize {
|
|
g.data = append(g.data, 0)
|
|
}
|
|
|
|
for _, u := range unary {
|
|
g.bitCount += int(u)
|
|
appendPtr := g.bitCount / 64
|
|
g.data[appendPtr] |= uint64(1) << (g.bitCount & 63)
|
|
g.bitCount++
|
|
}
|
|
}
|
|
|
|
// appendFixed encodes the next value using specified Golomb parameter. Since we are using Golomb-Rice encoding,
|
|
// all Golomb parameters are powers of two. Therefore we input log2 of golomb parameter, rather than golomn paramter itself,
|
|
// for convinience
|
|
func (g *GolombRice) appendFixed(v uint64, log2golomb int) {
|
|
if log2golomb == 0 {
|
|
return
|
|
}
|
|
lowerBits := v & ((uint64(1) << log2golomb) - 1) // Extract the part of the number that will be encoded using truncated binary encoding
|
|
usedBits := g.bitCount & 63 // How many bits of the last element of b.data is used by previous value
|
|
targetSize := (g.bitCount + log2golomb + 63) / 64
|
|
//fmt.Printf("g.bitCount = %d, log2golomb = %d, targetSize = %d\n", g.bitCount, log2golomb, targetSize)
|
|
for len(g.data) < targetSize {
|
|
g.data = append(g.data, 0)
|
|
}
|
|
appendPtr := g.bitCount / 64 // The index in b.data corresponding to the last element used by previous value, or if previous values fits perfectly, the index of the next free element
|
|
curWord := g.data[appendPtr]
|
|
curWord |= uint64(lowerBits) << usedBits // curWord now contains the new value potentially combined with the part of the previous value
|
|
if usedBits+log2golomb > 64 {
|
|
// New value overflows to the next element
|
|
g.data[appendPtr] = curWord
|
|
appendPtr++
|
|
curWord = uint64(lowerBits) >> (64 - usedBits) // curWord now contains the part of the new value that overflows
|
|
}
|
|
g.data[appendPtr] = curWord
|
|
g.bitCount += log2golomb
|
|
}
|
|
|
|
// bits returns currrent number of bits in the compact encoding of the hash function representation
|
|
func (g GolombRice) Bits() int {
|
|
return g.bitCount
|
|
}
|
|
|
|
func (g *GolombRice) ReadReset(bitPos int, unaryOffset int) {
|
|
g.currFixedOffset = bitPos
|
|
unaryPos := bitPos + unaryOffset
|
|
g.currPtrUnary = unaryPos / 64
|
|
g.currWindowUnary = g.data[g.currPtrUnary] >> (unaryPos & 63)
|
|
g.currPtrUnary++
|
|
g.validLowerBitsUnary = 64 - (unaryPos & 63)
|
|
}
|
|
|
|
func (g *GolombRice) SkipSubtree(nodes int, fixedLen int) {
|
|
if nodes <= 0 {
|
|
panic("nodes <= 0")
|
|
}
|
|
missing := nodes
|
|
var cnt int
|
|
for cnt = bits.OnesCount64(g.currWindowUnary); cnt < missing; cnt = bits.OnesCount64(g.currWindowUnary) {
|
|
g.currWindowUnary = g.data[g.currPtrUnary]
|
|
g.currPtrUnary++
|
|
missing -= cnt
|
|
g.validLowerBitsUnary = 64
|
|
}
|
|
cnt = select64(g.currWindowUnary, missing-1)
|
|
g.currWindowUnary >>= cnt
|
|
g.currWindowUnary >>= 1
|
|
g.validLowerBitsUnary -= cnt + 1
|
|
|
|
g.currFixedOffset += fixedLen
|
|
}
|
|
|
|
// Required by select64
|
|
var kSelectInByte []byte = []byte{
|
|
8, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
|
8, 8, 8, 1, 8, 2, 2, 1, 8, 3, 3, 1, 3, 2, 2, 1, 8, 4, 4, 1, 4, 2, 2, 1, 4, 3, 3, 1, 3, 2, 2, 1, 8, 5, 5, 1, 5, 2, 2, 1, 5, 3, 3, 1, 3, 2, 2, 1, 5, 4, 4, 1, 4, 2, 2, 1, 4, 3, 3, 1, 3, 2, 2, 1,
|
|
8, 6, 6, 1, 6, 2, 2, 1, 6, 3, 3, 1, 3, 2, 2, 1, 6, 4, 4, 1, 4, 2, 2, 1, 4, 3, 3, 1, 3, 2, 2, 1, 6, 5, 5, 1, 5, 2, 2, 1, 5, 3, 3, 1, 3, 2, 2, 1, 5, 4, 4, 1, 4, 2, 2, 1, 4, 3, 3, 1, 3, 2, 2, 1,
|
|
8, 7, 7, 1, 7, 2, 2, 1, 7, 3, 3, 1, 3, 2, 2, 1, 7, 4, 4, 1, 4, 2, 2, 1, 4, 3, 3, 1, 3, 2, 2, 1, 7, 5, 5, 1, 5, 2, 2, 1, 5, 3, 3, 1, 3, 2, 2, 1, 5, 4, 4, 1, 4, 2, 2, 1, 4, 3, 3, 1, 3, 2, 2, 1,
|
|
7, 6, 6, 1, 6, 2, 2, 1, 6, 3, 3, 1, 3, 2, 2, 1, 6, 4, 4, 1, 4, 2, 2, 1, 4, 3, 3, 1, 3, 2, 2, 1, 6, 5, 5, 1, 5, 2, 2, 1, 5, 3, 3, 1, 3, 2, 2, 1, 5, 4, 4, 1, 4, 2, 2, 1, 4, 3, 3, 1, 3, 2, 2, 1,
|
|
8, 8, 8, 8, 8, 8, 8, 2, 8, 8, 8, 3, 8, 3, 3, 2, 8, 8, 8, 4, 8, 4, 4, 2, 8, 4, 4, 3, 4, 3, 3, 2, 8, 8, 8, 5, 8, 5, 5, 2, 8, 5, 5, 3, 5, 3, 3, 2, 8, 5, 5, 4, 5, 4, 4, 2, 5, 4, 4, 3, 4, 3, 3, 2,
|
|
8, 8, 8, 6, 8, 6, 6, 2, 8, 6, 6, 3, 6, 3, 3, 2, 8, 6, 6, 4, 6, 4, 4, 2, 6, 4, 4, 3, 4, 3, 3, 2, 8, 6, 6, 5, 6, 5, 5, 2, 6, 5, 5, 3, 5, 3, 3, 2, 6, 5, 5, 4, 5, 4, 4, 2, 5, 4, 4, 3, 4, 3, 3, 2,
|
|
8, 8, 8, 7, 8, 7, 7, 2, 8, 7, 7, 3, 7, 3, 3, 2, 8, 7, 7, 4, 7, 4, 4, 2, 7, 4, 4, 3, 4, 3, 3, 2, 8, 7, 7, 5, 7, 5, 5, 2, 7, 5, 5, 3, 5, 3, 3, 2, 7, 5, 5, 4, 5, 4, 4, 2, 5, 4, 4, 3, 4, 3, 3, 2,
|
|
8, 7, 7, 6, 7, 6, 6, 2, 7, 6, 6, 3, 6, 3, 3, 2, 7, 6, 6, 4, 6, 4, 4, 2, 6, 4, 4, 3, 4, 3, 3, 2, 7, 6, 6, 5, 6, 5, 5, 2, 6, 5, 5, 3, 5, 3, 3, 2, 6, 5, 5, 4, 5, 4, 4, 2, 5, 4, 4, 3, 4, 3, 3, 2,
|
|
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, 8, 8, 8, 8, 8, 8, 8, 4, 8, 8, 8, 4, 8, 4, 4, 3, 8, 8, 8, 8, 8, 8, 8, 5, 8, 8, 8, 5, 8, 5, 5, 3, 8, 8, 8, 5, 8, 5, 5, 4, 8, 5, 5, 4, 5, 4, 4, 3,
|
|
8, 8, 8, 8, 8, 8, 8, 6, 8, 8, 8, 6, 8, 6, 6, 3, 8, 8, 8, 6, 8, 6, 6, 4, 8, 6, 6, 4, 6, 4, 4, 3, 8, 8, 8, 6, 8, 6, 6, 5, 8, 6, 6, 5, 6, 5, 5, 3, 8, 6, 6, 5, 6, 5, 5, 4, 6, 5, 5, 4, 5, 4, 4, 3,
|
|
8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 7, 8, 7, 7, 3, 8, 8, 8, 7, 8, 7, 7, 4, 8, 7, 7, 4, 7, 4, 4, 3, 8, 8, 8, 7, 8, 7, 7, 5, 8, 7, 7, 5, 7, 5, 5, 3, 8, 7, 7, 5, 7, 5, 5, 4, 7, 5, 5, 4, 5, 4, 4, 3,
|
|
8, 8, 8, 7, 8, 7, 7, 6, 8, 7, 7, 6, 7, 6, 6, 3, 8, 7, 7, 6, 7, 6, 6, 4, 7, 6, 6, 4, 6, 4, 4, 3, 8, 7, 7, 6, 7, 6, 6, 5, 7, 6, 6, 5, 6, 5, 5, 3, 7, 6, 6, 5, 6, 5, 5, 4, 6, 5, 5, 4, 5, 4, 4, 3,
|
|
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5, 8, 8, 8, 8, 8, 8, 8, 5, 8, 8, 8, 5, 8, 5, 5, 4,
|
|
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 8, 8, 8, 8, 8, 8, 8, 6, 8, 8, 8, 6, 8, 6, 6, 4, 8, 8, 8, 8, 8, 8, 8, 6, 8, 8, 8, 6, 8, 6, 6, 5, 8, 8, 8, 6, 8, 6, 6, 5, 8, 6, 6, 5, 6, 5, 5, 4,
|
|
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 7, 8, 7, 7, 4, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 7, 8, 7, 7, 5, 8, 8, 8, 7, 8, 7, 7, 5, 8, 7, 7, 5, 7, 5, 5, 4,
|
|
8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 7, 8, 7, 7, 6, 8, 8, 8, 7, 8, 7, 7, 6, 8, 7, 7, 6, 7, 6, 6, 4, 8, 8, 8, 7, 8, 7, 7, 6, 8, 7, 7, 6, 7, 6, 6, 5, 8, 7, 7, 6, 7, 6, 6, 5, 7, 6, 6, 5, 6, 5, 5, 4,
|
|
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5,
|
|
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 8, 8, 8, 8, 8, 8, 8, 6, 8, 8, 8, 6, 8, 6, 6, 5,
|
|
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 7, 8, 7, 7, 5,
|
|
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 7, 8, 7, 7, 6, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 7, 8, 7, 7, 6, 8, 8, 8, 7, 8, 7, 7, 6, 8, 7, 7, 6, 7, 6, 6, 5,
|
|
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
|
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6,
|
|
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7,
|
|
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 7, 8, 7, 7, 6,
|
|
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
|
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
|
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
|
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7}
|
|
|
|
const (
|
|
kOnesStep4 uint64 = 0x1111111111111111
|
|
kOnesStep8 uint64 = 0x0101010101010101
|
|
kLAMBDAsStep8 uint64 = 0x80 * kOnesStep8
|
|
)
|
|
|
|
/** Returns the index of the k-th 1-bit in the 64-bit word x.
|
|
* @param x 64-bit word.
|
|
* @param k 0-based rank (`k = 0` returns the position of the first 1-bit).
|
|
*
|
|
* Uses the broadword selection algorithm by Vigna [1], improved by Gog and Petri [2] and Vigna [3].
|
|
* Facebook's Folly implementation [4].
|
|
*
|
|
* [1] Sebastiano Vigna. Broadword Implementation of Rank/Select Queries. WEA, 2008
|
|
*
|
|
* [2] Simon Gog, Matthias Petri. Optimized succinct data structures for massive data. Softw. Pract.
|
|
* Exper., 2014
|
|
*
|
|
* [3] Sebastiano Vigna. MG4J 5.2.1. http://mg4j.di.unimi.it/
|
|
*
|
|
* [4] Facebook Folly library: https://github.com/facebook/folly
|
|
*
|
|
*/
|
|
func select64(x uint64, k int) int {
|
|
s := x
|
|
s = s - ((s & (0xA * kOnesStep4)) >> 1)
|
|
s = (s & (0x3 * kOnesStep4)) + ((s >> 2) & (0x3 * kOnesStep4))
|
|
s = (s + (s >> 4)) & (0xF * kOnesStep8)
|
|
byteSums := s * kOnesStep8
|
|
|
|
kStep8 := uint64(k) * kOnesStep8
|
|
geqKStep8 := (((kStep8 | kLAMBDAsStep8) - byteSums) & kLAMBDAsStep8)
|
|
place := bits.OnesCount64(geqKStep8) * 8
|
|
byteRank := uint64(k) - (((byteSums << 8) >> place) & uint64(0xFF))
|
|
return place + int(kSelectInByte[((x>>place)&0xFF)|(byteRank<<8)])
|
|
}
|
|
|
|
func (g *GolombRice) ReadNext(log2golomb int) uint64 {
|
|
var result uint64
|
|
|
|
if g.currWindowUnary == 0 {
|
|
result += uint64(g.validLowerBitsUnary)
|
|
g.currWindowUnary = g.data[g.currPtrUnary]
|
|
g.currPtrUnary++
|
|
g.validLowerBitsUnary = 64
|
|
for g.currWindowUnary == 0 {
|
|
result += 64
|
|
g.currWindowUnary = g.data[g.currPtrUnary]
|
|
g.currPtrUnary++
|
|
}
|
|
}
|
|
|
|
pos := bits.TrailingZeros64(g.currWindowUnary)
|
|
|
|
g.currWindowUnary >>= pos
|
|
g.currWindowUnary >>= 1
|
|
g.validLowerBitsUnary -= pos + 1
|
|
|
|
result += uint64(pos)
|
|
result <<= log2golomb
|
|
|
|
idx64 := g.currFixedOffset >> 6
|
|
var fixed uint64
|
|
shift := g.currFixedOffset & 63
|
|
fixed = g.data[idx64] >> shift
|
|
if shift+log2golomb > 64 {
|
|
fixed |= g.data[idx64+1] << (64 - shift)
|
|
}
|
|
result |= fixed & ((uint64(1) << log2golomb) - 1)
|
|
g.currFixedOffset += log2golomb
|
|
return result
|
|
}
|
|
|
|
// Data returns the binary representation of the Golomb-Rice code that is built
|
|
func (g GolombRice) Data() []uint64 {
|
|
return g.data
|
|
}
|
|
|
|
// Write outputs the state of golomb rice encoding into a writer, which can be recovered later by Read
|
|
func (g GolombRice) Write(w io.Writer) error {
|
|
return nil
|
|
}
|
|
|
|
// Read inputs the state of golomb rice encoding from a reader s
|
|
func (g *GolombRice) Read(r io.Reader) error {
|
|
return nil
|
|
}
|