mirror of
https://github.com/Oxalide/vsphere-influxdb-go.git
synced 2023-10-10 11:36:51 +00:00
add vendoring with go dep
This commit is contained in:
5
vendor/github.com/influxdata/influxdb/pkg/README.md
generated
vendored
Normal file
5
vendor/github.com/influxdata/influxdb/pkg/README.md
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
pkg/ is a collection of utility packages used by the InfluxDB project without being specific to its internals.
|
||||
|
||||
Utility packages are kept separate from the InfluxDB core codebase to keep it as small and concise as possible. If some utilities grow larger and their APIs stabilize, they may be moved to their own repository under the InfluxDB organization, to facilitate re-use by other projects. However that is not the priority.
|
||||
|
||||
Because utility packages are small and neatly separated from the rest of the codebase, they are a good place to start for aspiring maintainers and contributors. Get in touch if you want to help maintain them!
|
131
vendor/github.com/influxdata/influxdb/pkg/bloom/bloom.go
generated
vendored
Normal file
131
vendor/github.com/influxdata/influxdb/pkg/bloom/bloom.go
generated
vendored
Normal file
@@ -0,0 +1,131 @@
|
||||
package bloom
|
||||
|
||||
// NOTE:
|
||||
// This package implements a limited bloom filter implementation based on
|
||||
// Will Fitzgerald's bloom & bitset packages. It's implemented locally to
|
||||
// support zero-copy memory-mapped slices.
|
||||
//
|
||||
// This also optimizes the filter by always using a bitset size with a power of 2.
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
"github.com/spaolacci/murmur3"
|
||||
)
|
||||
|
||||
// Filter represents a bloom filter.
|
||||
type Filter struct {
|
||||
k uint64
|
||||
b []byte
|
||||
mask uint64
|
||||
}
|
||||
|
||||
// NewFilter returns a new instance of Filter using m bits and k hash functions.
|
||||
// If m is not a power of two then it is rounded to the next highest power of 2.
|
||||
func NewFilter(m uint64, k uint64) *Filter {
|
||||
m = pow2(m)
|
||||
|
||||
return &Filter{
|
||||
k: k,
|
||||
b: make([]byte, m/8),
|
||||
mask: m - 1,
|
||||
}
|
||||
}
|
||||
|
||||
// NewFilterBuffer returns a new instance of a filter using a backing buffer.
|
||||
// The buffer length MUST be a power of 2.
|
||||
func NewFilterBuffer(buf []byte, k uint64) (*Filter, error) {
|
||||
m := pow2(uint64(len(buf)) * 8)
|
||||
if m != uint64(len(buf))*8 {
|
||||
return nil, fmt.Errorf("bloom.Filter: buffer bit count must a power of two: %d/%d", len(buf)*8, m)
|
||||
}
|
||||
|
||||
return &Filter{
|
||||
k: k,
|
||||
b: buf,
|
||||
mask: m - 1,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Len returns the number of bits used in the filter.
|
||||
func (f *Filter) Len() uint { return uint(len(f.b)) }
|
||||
|
||||
// K returns the number of hash functions used in the filter.
|
||||
func (f *Filter) K() uint64 { return f.k }
|
||||
|
||||
// Bytes returns the underlying backing slice.
|
||||
func (f *Filter) Bytes() []byte { return f.b }
|
||||
|
||||
// Insert inserts data to the filter.
|
||||
func (f *Filter) Insert(v []byte) {
|
||||
h := hash(v)
|
||||
for i := uint64(0); i < f.k; i++ {
|
||||
loc := f.location(h, i)
|
||||
f.b[loc/8] |= 1 << (loc % 8)
|
||||
}
|
||||
}
|
||||
|
||||
// Contains returns true if the filter possibly contains v.
|
||||
// Returns false if the filter definitely does not contain v.
|
||||
func (f *Filter) Contains(v []byte) bool {
|
||||
h := hash(v)
|
||||
for i := uint64(0); i < f.k; i++ {
|
||||
loc := f.location(h, i)
|
||||
if f.b[loc/8]&(1<<(loc%8)) == 0 {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// Merge performs an in-place union of other into f.
|
||||
// Returns an error if m or k of the filters differs.
|
||||
func (f *Filter) Merge(other *Filter) error {
|
||||
// Ensure m & k fields match.
|
||||
if len(f.b) != len(other.b) {
|
||||
return fmt.Errorf("bloom.Filter.Merge(): m mismatch: %d <> %d", len(f.b), len(other.b))
|
||||
} else if f.k != other.k {
|
||||
return fmt.Errorf("bloom.Filter.Merge(): k mismatch: %d <> %d", f.b, other.b)
|
||||
}
|
||||
|
||||
// Perform union of each byte.
|
||||
for i := range f.b {
|
||||
f.b[i] |= other.b[i]
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// location returns the ith hashed location using the four base hash values.
|
||||
func (f *Filter) location(h [4]uint64, i uint64) uint {
|
||||
return uint((h[i%2] + i*h[2+(((i+(i%2))%4)/2)]) & f.mask)
|
||||
}
|
||||
|
||||
// Estimate returns an estimated bit count and hash count given the element count and false positive rate.
|
||||
func Estimate(n uint64, p float64) (m uint64, k uint64) {
|
||||
m = uint64(math.Ceil(-1 * float64(n) * math.Log(p) / math.Pow(math.Log(2), 2)))
|
||||
k = uint64(math.Ceil(math.Log(2) * float64(m) / float64(n)))
|
||||
return m, k
|
||||
}
|
||||
|
||||
// pow2 returns the number that is the next highest power of 2.
|
||||
// Returns v if it is a power of 2.
|
||||
func pow2(v uint64) uint64 {
|
||||
for i := uint64(8); i < 1<<62; i *= 2 {
|
||||
if i >= v {
|
||||
return i
|
||||
}
|
||||
}
|
||||
panic("unreachable")
|
||||
}
|
||||
|
||||
// hash returns a set of 4 based hashes.
|
||||
func hash(data []byte) [4]uint64 {
|
||||
h := murmur3.New128()
|
||||
h.Write(data)
|
||||
v1, v2 := h.Sum128()
|
||||
h.Write([]byte{1})
|
||||
v3, v4 := h.Sum128()
|
||||
return [4]uint64{v1, v2, v3, v4}
|
||||
}
|
29
vendor/github.com/influxdata/influxdb/pkg/bloom/bloom_test.go
generated
vendored
Normal file
29
vendor/github.com/influxdata/influxdb/pkg/bloom/bloom_test.go
generated
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
package bloom_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/influxdata/influxdb/pkg/bloom"
|
||||
)
|
||||
|
||||
// Ensure filter can insert values and verify they exist.
|
||||
func TestFilter_InsertContains(t *testing.T) {
|
||||
f := bloom.NewFilter(1000, 4)
|
||||
|
||||
// Insert value and validate.
|
||||
f.Insert([]byte("Bess"))
|
||||
if !f.Contains([]byte("Bess")) {
|
||||
t.Fatal("expected true")
|
||||
}
|
||||
|
||||
// Insert another value and test.
|
||||
f.Insert([]byte("Emma"))
|
||||
if !f.Contains([]byte("Emma")) {
|
||||
t.Fatal("expected true")
|
||||
}
|
||||
|
||||
// Validate that a non-existent value doesn't exist.
|
||||
if f.Contains([]byte("Jane")) {
|
||||
t.Fatal("expected false")
|
||||
}
|
||||
}
|
72
vendor/github.com/influxdata/influxdb/pkg/bytesutil/bytesutil.go
generated
vendored
Normal file
72
vendor/github.com/influxdata/influxdb/pkg/bytesutil/bytesutil.go
generated
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
package bytesutil
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"sort"
|
||||
)
|
||||
|
||||
// Sort sorts a slice of byte slices.
|
||||
func Sort(a [][]byte) {
|
||||
sort.Sort(byteSlices(a))
|
||||
}
|
||||
|
||||
func IsSorted(a [][]byte) bool {
|
||||
return sort.IsSorted(byteSlices(a))
|
||||
}
|
||||
|
||||
func SearchBytes(a [][]byte, x []byte) int {
|
||||
return sort.Search(len(a), func(i int) bool { return bytes.Compare(a[i], x) >= 0 })
|
||||
}
|
||||
|
||||
// Union returns the union of a & b in sorted order.
|
||||
func Union(a, b [][]byte) [][]byte {
|
||||
n := len(b)
|
||||
if len(a) > len(b) {
|
||||
n = len(a)
|
||||
}
|
||||
other := make([][]byte, 0, n)
|
||||
|
||||
for {
|
||||
if len(a) > 0 && len(b) > 0 {
|
||||
if cmp := bytes.Compare(a[0], b[0]); cmp == 0 {
|
||||
other, a, b = append(other, a[0]), a[1:], b[1:]
|
||||
} else if cmp == -1 {
|
||||
other, a = append(other, a[0]), a[1:]
|
||||
} else {
|
||||
other, b = append(other, b[0]), b[1:]
|
||||
}
|
||||
} else if len(a) > 0 {
|
||||
other, a = append(other, a[0]), a[1:]
|
||||
} else if len(b) > 0 {
|
||||
other, b = append(other, b[0]), b[1:]
|
||||
} else {
|
||||
return other
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Intersect returns the intersection of a & b in sorted order.
|
||||
func Intersect(a, b [][]byte) [][]byte {
|
||||
n := len(b)
|
||||
if len(a) > len(b) {
|
||||
n = len(a)
|
||||
}
|
||||
other := make([][]byte, 0, n)
|
||||
|
||||
for len(a) > 0 && len(b) > 0 {
|
||||
if cmp := bytes.Compare(a[0], b[0]); cmp == 0 {
|
||||
other, a, b = append(other, a[0]), a[1:], b[1:]
|
||||
} else if cmp == -1 {
|
||||
a = a[1:]
|
||||
} else {
|
||||
b = b[1:]
|
||||
}
|
||||
}
|
||||
return other
|
||||
}
|
||||
|
||||
type byteSlices [][]byte
|
||||
|
||||
func (a byteSlices) Len() int { return len(a) }
|
||||
func (a byteSlices) Less(i, j int) bool { return bytes.Compare(a[i], a[j]) == -1 }
|
||||
func (a byteSlices) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
185
vendor/github.com/influxdata/influxdb/pkg/deep/equal.go
generated
vendored
Normal file
185
vendor/github.com/influxdata/influxdb/pkg/deep/equal.go
generated
vendored
Normal file
@@ -0,0 +1,185 @@
|
||||
// Copyright 2009 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// License.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// Package deep provides a deep equality check for use in tests.
|
||||
package deep // import "github.com/influxdata/influxdb/pkg/deep"
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"reflect"
|
||||
)
|
||||
|
||||
// Equal is a copy of reflect.DeepEqual except that it treats NaN == NaN as true.
|
||||
func Equal(a1, a2 interface{}) bool {
|
||||
if a1 == nil || a2 == nil {
|
||||
return a1 == a2
|
||||
}
|
||||
v1 := reflect.ValueOf(a1)
|
||||
v2 := reflect.ValueOf(a2)
|
||||
if v1.Type() != v2.Type() {
|
||||
return false
|
||||
}
|
||||
return deepValueEqual(v1, v2, make(map[visit]bool), 0)
|
||||
}
|
||||
|
||||
// Tests for deep equality using reflected types. The map argument tracks
|
||||
// comparisons that have already been seen, which allows short circuiting on
|
||||
// recursive types.
|
||||
func deepValueEqual(v1, v2 reflect.Value, visited map[visit]bool, depth int) bool {
|
||||
if !v1.IsValid() || !v2.IsValid() {
|
||||
return v1.IsValid() == v2.IsValid()
|
||||
}
|
||||
if v1.Type() != v2.Type() {
|
||||
return false
|
||||
}
|
||||
|
||||
// if depth > 10 { panic("deepValueEqual") } // for debugging
|
||||
hard := func(k reflect.Kind) bool {
|
||||
switch k {
|
||||
case reflect.Array, reflect.Map, reflect.Slice, reflect.Struct:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
if v1.CanAddr() && v2.CanAddr() && hard(v1.Kind()) {
|
||||
addr1 := v1.UnsafeAddr()
|
||||
addr2 := v2.UnsafeAddr()
|
||||
if addr1 > addr2 {
|
||||
// Canonicalize order to reduce number of entries in visited.
|
||||
addr1, addr2 = addr2, addr1
|
||||
}
|
||||
|
||||
// Short circuit if references are identical ...
|
||||
if addr1 == addr2 {
|
||||
return true
|
||||
}
|
||||
|
||||
// ... or already seen
|
||||
typ := v1.Type()
|
||||
v := visit{addr1, addr2, typ}
|
||||
if visited[v] {
|
||||
return true
|
||||
}
|
||||
|
||||
// Remember for later.
|
||||
visited[v] = true
|
||||
}
|
||||
|
||||
switch v1.Kind() {
|
||||
case reflect.Array:
|
||||
for i := 0; i < v1.Len(); i++ {
|
||||
if !deepValueEqual(v1.Index(i), v2.Index(i), visited, depth+1) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
case reflect.Slice:
|
||||
if v1.IsNil() != v2.IsNil() {
|
||||
return false
|
||||
}
|
||||
if v1.Len() != v2.Len() {
|
||||
return false
|
||||
}
|
||||
if v1.Pointer() == v2.Pointer() {
|
||||
return true
|
||||
}
|
||||
for i := 0; i < v1.Len(); i++ {
|
||||
if !deepValueEqual(v1.Index(i), v2.Index(i), visited, depth+1) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
case reflect.Interface:
|
||||
if v1.IsNil() || v2.IsNil() {
|
||||
return v1.IsNil() == v2.IsNil()
|
||||
}
|
||||
return deepValueEqual(v1.Elem(), v2.Elem(), visited, depth+1)
|
||||
case reflect.Ptr:
|
||||
return deepValueEqual(v1.Elem(), v2.Elem(), visited, depth+1)
|
||||
case reflect.Struct:
|
||||
for i, n := 0, v1.NumField(); i < n; i++ {
|
||||
if !deepValueEqual(v1.Field(i), v2.Field(i), visited, depth+1) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
case reflect.Map:
|
||||
if v1.IsNil() != v2.IsNil() {
|
||||
return false
|
||||
}
|
||||
if v1.Len() != v2.Len() {
|
||||
return false
|
||||
}
|
||||
if v1.Pointer() == v2.Pointer() {
|
||||
return true
|
||||
}
|
||||
for _, k := range v1.MapKeys() {
|
||||
if !deepValueEqual(v1.MapIndex(k), v2.MapIndex(k), visited, depth+1) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
case reflect.Func:
|
||||
if v1.IsNil() && v2.IsNil() {
|
||||
return true
|
||||
}
|
||||
// Can't do better than this:
|
||||
return false
|
||||
case reflect.String:
|
||||
return v1.String() == v2.String()
|
||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||
return v1.Int() == v2.Int()
|
||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
|
||||
return v1.Uint() == v2.Uint()
|
||||
case reflect.Float32, reflect.Float64:
|
||||
// Special handling for floats so that NaN == NaN is true.
|
||||
f1, f2 := v1.Float(), v2.Float()
|
||||
if math.IsNaN(f1) && math.IsNaN(f2) {
|
||||
return true
|
||||
}
|
||||
return f1 == f2
|
||||
case reflect.Bool:
|
||||
return v1.Bool() == v2.Bool()
|
||||
default:
|
||||
panic(fmt.Sprintf("cannot compare type: %s", v1.Kind().String()))
|
||||
}
|
||||
}
|
||||
|
||||
// During deepValueEqual, must keep track of checks that are
|
||||
// in progress. The comparison algorithm assumes that all
|
||||
// checks in progress are true when it reencounters them.
|
||||
// Visited comparisons are stored in a map indexed by visit.
|
||||
type visit struct {
|
||||
a1 uintptr
|
||||
a2 uintptr
|
||||
typ reflect.Type
|
||||
}
|
111
vendor/github.com/influxdata/influxdb/pkg/escape/bytes.go
generated
vendored
Normal file
111
vendor/github.com/influxdata/influxdb/pkg/escape/bytes.go
generated
vendored
Normal file
@@ -0,0 +1,111 @@
|
||||
// Package escape contains utilities for escaping parts of InfluxQL
|
||||
// and InfluxDB line protocol.
|
||||
package escape // import "github.com/influxdata/influxdb/pkg/escape"
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Codes is a map of bytes to be escaped.
|
||||
var Codes = map[byte][]byte{
|
||||
',': []byte(`\,`),
|
||||
'"': []byte(`\"`),
|
||||
' ': []byte(`\ `),
|
||||
'=': []byte(`\=`),
|
||||
}
|
||||
|
||||
// Bytes escapes characters on the input slice, as defined by Codes.
|
||||
func Bytes(in []byte) []byte {
|
||||
for b, esc := range Codes {
|
||||
in = bytes.Replace(in, []byte{b}, esc, -1)
|
||||
}
|
||||
return in
|
||||
}
|
||||
|
||||
const escapeChars = `," =`
|
||||
|
||||
// IsEscaped returns whether b has any escaped characters,
|
||||
// i.e. whether b seems to have been processed by Bytes.
|
||||
func IsEscaped(b []byte) bool {
|
||||
for len(b) > 0 {
|
||||
i := bytes.IndexByte(b, '\\')
|
||||
if i < 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
if i+1 < len(b) && strings.IndexByte(escapeChars, b[i+1]) >= 0 {
|
||||
return true
|
||||
}
|
||||
b = b[i+1:]
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// AppendUnescaped appends the unescaped version of src to dst
|
||||
// and returns the resulting slice.
|
||||
func AppendUnescaped(dst, src []byte) []byte {
|
||||
var pos int
|
||||
for len(src) > 0 {
|
||||
next := bytes.IndexByte(src[pos:], '\\')
|
||||
if next < 0 || pos+next+1 >= len(src) {
|
||||
return append(dst, src...)
|
||||
}
|
||||
|
||||
if pos+next+1 < len(src) && strings.IndexByte(escapeChars, src[pos+next+1]) >= 0 {
|
||||
if pos+next > 0 {
|
||||
dst = append(dst, src[:pos+next]...)
|
||||
}
|
||||
src = src[pos+next+1:]
|
||||
pos = 0
|
||||
} else {
|
||||
pos += next + 1
|
||||
}
|
||||
}
|
||||
|
||||
return dst
|
||||
}
|
||||
|
||||
// Unescape returns a new slice containing the unescaped version of in.
|
||||
func Unescape(in []byte) []byte {
|
||||
if len(in) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
if bytes.IndexByte(in, '\\') == -1 {
|
||||
return in
|
||||
}
|
||||
|
||||
i := 0
|
||||
inLen := len(in)
|
||||
var out []byte
|
||||
|
||||
for {
|
||||
if i >= inLen {
|
||||
break
|
||||
}
|
||||
if in[i] == '\\' && i+1 < inLen {
|
||||
switch in[i+1] {
|
||||
case ',':
|
||||
out = append(out, ',')
|
||||
i += 2
|
||||
continue
|
||||
case '"':
|
||||
out = append(out, '"')
|
||||
i += 2
|
||||
continue
|
||||
case ' ':
|
||||
out = append(out, ' ')
|
||||
i += 2
|
||||
continue
|
||||
case '=':
|
||||
out = append(out, '=')
|
||||
i += 2
|
||||
continue
|
||||
}
|
||||
}
|
||||
out = append(out, in[i])
|
||||
i += 1
|
||||
}
|
||||
return out
|
||||
}
|
68
vendor/github.com/influxdata/influxdb/pkg/escape/bytes_test.go
generated
vendored
Normal file
68
vendor/github.com/influxdata/influxdb/pkg/escape/bytes_test.go
generated
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
package escape
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"reflect"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestUnescape(t *testing.T) {
|
||||
tests := []struct {
|
||||
in []byte
|
||||
out []byte
|
||||
}{
|
||||
{
|
||||
[]byte(nil),
|
||||
[]byte(nil),
|
||||
},
|
||||
|
||||
{
|
||||
[]byte(""),
|
||||
[]byte(nil),
|
||||
},
|
||||
|
||||
{
|
||||
[]byte("\\,\\\"\\ \\="),
|
||||
[]byte(",\" ="),
|
||||
},
|
||||
|
||||
{
|
||||
[]byte("\\\\"),
|
||||
[]byte("\\\\"),
|
||||
},
|
||||
|
||||
{
|
||||
[]byte("plain and simple"),
|
||||
[]byte("plain and simple"),
|
||||
},
|
||||
}
|
||||
|
||||
for ii, tt := range tests {
|
||||
got := Unescape(tt.in)
|
||||
if !reflect.DeepEqual(got, tt.out) {
|
||||
t.Errorf("[%d] Unescape(%#v) = %#v, expected %#v", ii, string(tt.in), string(got), string(tt.out))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestAppendUnescaped(t *testing.T) {
|
||||
cases := strings.Split(strings.TrimSpace(`
|
||||
normal
|
||||
inv\alid
|
||||
goo\"d
|
||||
sp\ ace
|
||||
\,\"\ \=
|
||||
f\\\ x
|
||||
`), "\n")
|
||||
|
||||
for _, c := range cases {
|
||||
exp := Unescape([]byte(c))
|
||||
got := AppendUnescaped(nil, []byte(c))
|
||||
|
||||
if !bytes.Equal(got, exp) {
|
||||
t.Errorf("AppendUnescaped failed for %#q: got %#q, exp %#q", c, got, exp)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
21
vendor/github.com/influxdata/influxdb/pkg/escape/strings.go
generated
vendored
Normal file
21
vendor/github.com/influxdata/influxdb/pkg/escape/strings.go
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
package escape
|
||||
|
||||
import "strings"
|
||||
|
||||
var (
|
||||
escaper = strings.NewReplacer(`,`, `\,`, `"`, `\"`, ` `, `\ `, `=`, `\=`)
|
||||
unescaper = strings.NewReplacer(`\,`, `,`, `\"`, `"`, `\ `, ` `, `\=`, `=`)
|
||||
)
|
||||
|
||||
// UnescapeString returns unescaped version of in.
|
||||
func UnescapeString(in string) string {
|
||||
if strings.IndexByte(in, '\\') == -1 {
|
||||
return in
|
||||
}
|
||||
return unescaper.Replace(in)
|
||||
}
|
||||
|
||||
// String returns the escaped version of in.
|
||||
func String(in string) string {
|
||||
return escaper.Replace(in)
|
||||
}
|
115
vendor/github.com/influxdata/influxdb/pkg/escape/strings_test.go
generated
vendored
Normal file
115
vendor/github.com/influxdata/influxdb/pkg/escape/strings_test.go
generated
vendored
Normal file
@@ -0,0 +1,115 @@
|
||||
package escape
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
var s string
|
||||
|
||||
func BenchmarkStringEscapeNoEscapes(b *testing.B) {
|
||||
for n := 0; n < b.N; n++ {
|
||||
s = String("no_escapes")
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkStringUnescapeNoEscapes(b *testing.B) {
|
||||
for n := 0; n < b.N; n++ {
|
||||
s = UnescapeString("no_escapes")
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkManyStringEscape(b *testing.B) {
|
||||
tests := []string{
|
||||
"this is my special string",
|
||||
"a field w=i th == tons of escapes",
|
||||
"some,commas,here",
|
||||
}
|
||||
|
||||
for n := 0; n < b.N; n++ {
|
||||
for _, test := range tests {
|
||||
s = String(test)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkManyStringUnescape(b *testing.B) {
|
||||
tests := []string{
|
||||
`this\ is\ my\ special\ string`,
|
||||
`a\ field\ w\=i\ th\ \=\=\ tons\ of\ escapes`,
|
||||
`some\,commas\,here`,
|
||||
}
|
||||
|
||||
for n := 0; n < b.N; n++ {
|
||||
for _, test := range tests {
|
||||
s = UnescapeString(test)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestStringEscape(t *testing.T) {
|
||||
tests := []struct {
|
||||
in string
|
||||
expected string
|
||||
}{
|
||||
{
|
||||
in: "",
|
||||
expected: "",
|
||||
},
|
||||
{
|
||||
in: "this is my special string",
|
||||
expected: `this\ is\ my\ special\ string`,
|
||||
},
|
||||
{
|
||||
in: "a field w=i th == tons of escapes",
|
||||
expected: `a\ field\ w\=i\ th\ \=\=\ tons\ of\ escapes`,
|
||||
},
|
||||
{
|
||||
in: "no_escapes",
|
||||
expected: "no_escapes",
|
||||
},
|
||||
{
|
||||
in: "some,commas,here",
|
||||
expected: `some\,commas\,here`,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
if test.expected != String(test.in) {
|
||||
t.Errorf("Got %s, expected %s", String(test.in), test.expected)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestStringUnescape(t *testing.T) {
|
||||
tests := []struct {
|
||||
in string
|
||||
expected string
|
||||
}{
|
||||
{
|
||||
in: "",
|
||||
expected: "",
|
||||
},
|
||||
{
|
||||
in: `this\ is\ my\ special\ string`,
|
||||
expected: "this is my special string",
|
||||
},
|
||||
{
|
||||
in: `a\ field\ w\=i\ th\ \=\=\ tons\ of\ escapes`,
|
||||
expected: "a field w=i th == tons of escapes",
|
||||
},
|
||||
{
|
||||
in: "no_escapes",
|
||||
expected: "no_escapes",
|
||||
},
|
||||
{
|
||||
in: `some\,commas\,here`,
|
||||
expected: "some,commas,here",
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
if test.expected != UnescapeString(test.in) {
|
||||
t.Errorf("Got %s, expected %s", UnescapeString(test.in), test.expected)
|
||||
}
|
||||
}
|
||||
}
|
173
vendor/github.com/influxdata/influxdb/pkg/estimator/hll/compressed.go
generated
vendored
Normal file
173
vendor/github.com/influxdata/influxdb/pkg/estimator/hll/compressed.go
generated
vendored
Normal file
@@ -0,0 +1,173 @@
|
||||
package hll
|
||||
|
||||
import "encoding/binary"
|
||||
|
||||
// Original author of this file is github.com/clarkduvall/hyperloglog
|
||||
type iterable interface {
|
||||
decode(i int, last uint32) (uint32, int)
|
||||
Len() int
|
||||
Iter() *iterator
|
||||
}
|
||||
|
||||
type iterator struct {
|
||||
i int
|
||||
last uint32
|
||||
v iterable
|
||||
}
|
||||
|
||||
func (iter *iterator) Next() uint32 {
|
||||
n, i := iter.v.decode(iter.i, iter.last)
|
||||
iter.last = n
|
||||
iter.i = i
|
||||
return n
|
||||
}
|
||||
|
||||
func (iter *iterator) Peek() uint32 {
|
||||
n, _ := iter.v.decode(iter.i, iter.last)
|
||||
return n
|
||||
}
|
||||
|
||||
func (iter iterator) HasNext() bool {
|
||||
return iter.i < iter.v.Len()
|
||||
}
|
||||
|
||||
type compressedList struct {
|
||||
count uint32
|
||||
last uint32
|
||||
b variableLengthList
|
||||
}
|
||||
|
||||
func (v *compressedList) Clone() *compressedList {
|
||||
if v == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
newV := &compressedList{
|
||||
count: v.count,
|
||||
last: v.last,
|
||||
}
|
||||
|
||||
newV.b = make(variableLengthList, len(v.b))
|
||||
copy(newV.b, v.b)
|
||||
return newV
|
||||
}
|
||||
|
||||
func (v *compressedList) MarshalBinary() (data []byte, err error) {
|
||||
// Marshal the variableLengthList
|
||||
bdata, err := v.b.MarshalBinary()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// At least 4 bytes for the two fixed sized values plus the size of bdata.
|
||||
data = make([]byte, 0, 4+4+len(bdata))
|
||||
|
||||
// Marshal the count and last values.
|
||||
data = append(data, []byte{
|
||||
// Number of items in the list.
|
||||
byte(v.count >> 24),
|
||||
byte(v.count >> 16),
|
||||
byte(v.count >> 8),
|
||||
byte(v.count),
|
||||
// The last item in the list.
|
||||
byte(v.last >> 24),
|
||||
byte(v.last >> 16),
|
||||
byte(v.last >> 8),
|
||||
byte(v.last),
|
||||
}...)
|
||||
|
||||
// Append the list
|
||||
return append(data, bdata...), nil
|
||||
}
|
||||
|
||||
func (v *compressedList) UnmarshalBinary(data []byte) error {
|
||||
// Set the count.
|
||||
v.count, data = binary.BigEndian.Uint32(data[:4]), data[4:]
|
||||
|
||||
// Set the last value.
|
||||
v.last, data = binary.BigEndian.Uint32(data[:4]), data[4:]
|
||||
|
||||
// Set the list.
|
||||
sz, data := binary.BigEndian.Uint32(data[:4]), data[4:]
|
||||
v.b = make([]uint8, sz)
|
||||
for i := uint32(0); i < sz; i++ {
|
||||
v.b[i] = uint8(data[i])
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func newCompressedList(size int) *compressedList {
|
||||
v := &compressedList{}
|
||||
v.b = make(variableLengthList, 0, size)
|
||||
return v
|
||||
}
|
||||
|
||||
func (v *compressedList) Len() int {
|
||||
return len(v.b)
|
||||
}
|
||||
|
||||
func (v *compressedList) decode(i int, last uint32) (uint32, int) {
|
||||
n, i := v.b.decode(i, last)
|
||||
return n + last, i
|
||||
}
|
||||
|
||||
func (v *compressedList) Append(x uint32) {
|
||||
v.count++
|
||||
v.b = v.b.Append(x - v.last)
|
||||
v.last = x
|
||||
}
|
||||
|
||||
func (v *compressedList) Iter() *iterator {
|
||||
return &iterator{0, 0, v}
|
||||
}
|
||||
|
||||
type variableLengthList []uint8
|
||||
|
||||
func (v variableLengthList) MarshalBinary() (data []byte, err error) {
|
||||
// 4 bytes for the size of the list, and a byte for each element in the
|
||||
// list.
|
||||
data = make([]byte, 0, 4+v.Len())
|
||||
|
||||
// Length of the list. We only need 32 bits because the size of the set
|
||||
// couldn't exceed that on 32 bit architectures.
|
||||
sz := v.Len()
|
||||
data = append(data, []byte{
|
||||
byte(sz >> 24),
|
||||
byte(sz >> 16),
|
||||
byte(sz >> 8),
|
||||
byte(sz),
|
||||
}...)
|
||||
|
||||
// Marshal each element in the list.
|
||||
for i := 0; i < sz; i++ {
|
||||
data = append(data, byte(v[i]))
|
||||
}
|
||||
|
||||
return data, nil
|
||||
}
|
||||
|
||||
func (v variableLengthList) Len() int {
|
||||
return len(v)
|
||||
}
|
||||
|
||||
func (v *variableLengthList) Iter() *iterator {
|
||||
return &iterator{0, 0, v}
|
||||
}
|
||||
|
||||
func (v variableLengthList) decode(i int, last uint32) (uint32, int) {
|
||||
var x uint32
|
||||
j := i
|
||||
for ; v[j]&0x80 != 0; j++ {
|
||||
x |= uint32(v[j]&0x7f) << (uint(j-i) * 7)
|
||||
}
|
||||
x |= uint32(v[j]) << (uint(j-i) * 7)
|
||||
return x, j + 1
|
||||
}
|
||||
|
||||
func (v variableLengthList) Append(x uint32) variableLengthList {
|
||||
for x&0xffffff80 != 0 {
|
||||
v = append(v, uint8((x&0x7f)|0x80))
|
||||
x >>= 7
|
||||
}
|
||||
return append(v, uint8(x&0x7f))
|
||||
}
|
87
vendor/github.com/influxdata/influxdb/pkg/estimator/hll/empirical_data.go
generated
vendored
Normal file
87
vendor/github.com/influxdata/influxdb/pkg/estimator/hll/empirical_data.go
generated
vendored
Normal file
@@ -0,0 +1,87 @@
|
||||
package hll
|
||||
|
||||
var rawEstimateData = [][]float64{
|
||||
// precision 4
|
||||
{11, 11.717, 12.207, 12.7896, 13.2882, 13.8204, 14.3772, 14.9342, 15.5202, 16.161, 16.7722, 17.4636, 18.0396, 18.6766, 19.3566, 20.0454, 20.7936, 21.4856, 22.2666, 22.9946, 23.766, 24.4692, 25.3638, 26.0764, 26.7864, 27.7602, 28.4814, 29.433, 30.2926, 31.0664, 31.9996, 32.7956, 33.5366, 34.5894, 35.5738, 36.2698, 37.3682, 38.0544, 39.2342, 40.0108, 40.7966, 41.9298, 42.8704, 43.6358, 44.5194, 45.773, 46.6772, 47.6174, 48.4888, 49.3304, 50.2506, 51.4996, 52.3824, 53.3078, 54.3984, 55.5838, 56.6618, 57.2174, 58.3514, 59.0802, 60.1482, 61.0376, 62.3598, 62.8078, 63.9744, 64.914, 65.781, 67.1806, 68.0594, 68.8446, 69.7928, 70.8248, 71.8324, 72.8598, 73.6246, 74.7014, 75.393, 76.6708, 77.2394},
|
||||
// precision 5
|
||||
{23, 23.1194, 23.8208, 24.2318, 24.77, 25.2436, 25.7774, 26.2848, 26.8224, 27.3742, 27.9336, 28.503, 29.0494, 29.6292, 30.2124, 30.798, 31.367, 31.9728, 32.5944, 33.217, 33.8438, 34.3696, 35.0956, 35.7044, 36.324, 37.0668, 37.6698, 38.3644, 39.049, 39.6918, 40.4146, 41.082, 41.687, 42.5398, 43.2462, 43.857, 44.6606, 45.4168, 46.1248, 46.9222, 47.6804, 48.447, 49.3454, 49.9594, 50.7636, 51.5776, 52.331, 53.19, 53.9676, 54.7564, 55.5314, 56.4442, 57.3708, 57.9774, 58.9624, 59.8796, 60.755, 61.472, 62.2076, 63.1024, 63.8908, 64.7338, 65.7728, 66.629, 67.413, 68.3266, 69.1524, 70.2642, 71.1806, 72.0566, 72.9192, 73.7598, 74.3516, 75.5802, 76.4386, 77.4916, 78.1524, 79.1892, 79.8414, 80.8798, 81.8376, 82.4698, 83.7656, 84.331, 85.5914, 86.6012, 87.7016, 88.5582, 89.3394, 90.3544, 91.4912, 92.308, 93.3552, 93.9746, 95.2052, 95.727, 97.1322, 98.3944, 98.7588, 100.242, 101.1914, 102.2538, 102.8776, 103.6292, 105.1932, 105.9152, 107.0868, 107.6728, 108.7144, 110.3114, 110.8716, 111.245, 112.7908, 113.7064, 114.636, 115.7464, 116.1788, 117.7464, 118.4896, 119.6166, 120.5082, 121.7798, 122.9028, 123.4426, 124.8854, 125.705, 126.4652, 128.3464, 128.3462, 130.0398, 131.0342, 131.0042, 132.4766, 133.511, 134.7252, 135.425, 136.5172, 138.0572, 138.6694, 139.3712, 140.8598, 141.4594, 142.554, 143.4006, 144.7374, 146.1634, 146.8994, 147.605, 147.9304, 149.1636, 150.2468, 151.5876, 152.2096, 153.7032, 154.7146, 155.807, 156.9228, 157.0372, 158.5852},
|
||||
// precision 6
|
||||
{46, 46.1902, 47.271, 47.8358, 48.8142, 49.2854, 50.317, 51.354, 51.8924, 52.9436, 53.4596, 54.5262, 55.6248, 56.1574, 57.2822, 57.837, 58.9636, 60.074, 60.7042, 61.7976, 62.4772, 63.6564, 64.7942, 65.5004, 66.686, 67.291, 68.5672, 69.8556, 70.4982, 71.8204, 72.4252, 73.7744, 75.0786, 75.8344, 77.0294, 77.8098, 79.0794, 80.5732, 81.1878, 82.5648, 83.2902, 84.6784, 85.3352, 86.8946, 88.3712, 89.0852, 90.499, 91.2686, 92.6844, 94.2234, 94.9732, 96.3356, 97.2286, 98.7262, 100.3284, 101.1048, 102.5962, 103.3562, 105.1272, 106.4184, 107.4974, 109.0822, 109.856, 111.48, 113.2834, 114.0208, 115.637, 116.5174, 118.0576, 119.7476, 120.427, 122.1326, 123.2372, 125.2788, 126.6776, 127.7926, 129.1952, 129.9564, 131.6454, 133.87, 134.5428, 136.2, 137.0294, 138.6278, 139.6782, 141.792, 143.3516, 144.2832, 146.0394, 147.0748, 148.4912, 150.849, 151.696, 153.5404, 154.073, 156.3714, 157.7216, 158.7328, 160.4208, 161.4184, 163.9424, 165.2772, 166.411, 168.1308, 168.769, 170.9258, 172.6828, 173.7502, 175.706, 176.3886, 179.0186, 180.4518, 181.927, 183.4172, 184.4114, 186.033, 188.5124, 189.5564, 191.6008, 192.4172, 193.8044, 194.997, 197.4548, 198.8948, 200.2346, 202.3086, 203.1548, 204.8842, 206.6508, 206.6772, 209.7254, 210.4752, 212.7228, 214.6614, 215.1676, 217.793, 218.0006, 219.9052, 221.66, 223.5588, 225.1636, 225.6882, 227.7126, 229.4502, 231.1978, 232.9756, 233.1654, 236.727, 238.1974, 237.7474, 241.1346, 242.3048, 244.1948, 245.3134, 246.879, 249.1204, 249.853, 252.6792, 253.857, 254.4486, 257.2362, 257.9534, 260.0286, 260.5632, 262.663, 264.723, 265.7566, 267.2566, 267.1624, 270.62, 272.8216, 273.2166, 275.2056, 276.2202, 278.3726, 280.3344, 281.9284, 283.9728, 284.1924, 286.4872, 287.587, 289.807, 291.1206, 292.769, 294.8708, 296.665, 297.1182, 299.4012, 300.6352, 302.1354, 304.1756, 306.1606, 307.3462, 308.5214, 309.4134, 310.8352, 313.9684, 315.837, 316.7796, 318.9858},
|
||||
// precision 7
|
||||
{92, 93.4934, 94.9758, 96.4574, 97.9718, 99.4954, 101.5302, 103.0756, 104.6374, 106.1782, 107.7888, 109.9522, 111.592, 113.2532, 114.9086, 116.5938, 118.9474, 120.6796, 122.4394, 124.2176, 125.9768, 128.4214, 130.2528, 132.0102, 133.8658, 135.7278, 138.3044, 140.1316, 142.093, 144.0032, 145.9092, 148.6306, 150.5294, 152.5756, 154.6508, 156.662, 159.552, 161.3724, 163.617, 165.5754, 167.7872, 169.8444, 172.7988, 174.8606, 177.2118, 179.3566, 181.4476, 184.5882, 186.6816, 189.0824, 191.0258, 193.6048, 196.4436, 198.7274, 200.957, 203.147, 205.4364, 208.7592, 211.3386, 213.781, 215.8028, 218.656, 221.6544, 223.996, 226.4718, 229.1544, 231.6098, 234.5956, 237.0616, 239.5758, 242.4878, 244.5244, 248.2146, 250.724, 252.8722, 255.5198, 258.0414, 261.941, 264.9048, 266.87, 269.4304, 272.028, 274.4708, 278.37, 281.0624, 283.4668, 286.5532, 289.4352, 293.2564, 295.2744, 298.2118, 300.7472, 304.1456, 307.2928, 309.7504, 312.5528, 315.979, 318.2102, 322.1834, 324.3494, 327.325, 330.6614, 332.903, 337.2544, 339.9042, 343.215, 345.2864, 348.0814, 352.6764, 355.301, 357.139, 360.658, 363.1732, 366.5902, 369.9538, 373.0828, 375.922, 378.9902, 382.7328, 386.4538, 388.1136, 391.2234, 394.0878, 396.708, 401.1556, 404.1852, 406.6372, 409.6822, 412.7796, 416.6078, 418.4916, 422.131, 424.5376, 428.1988, 432.211, 434.4502, 438.5282, 440.912, 444.0448, 447.7432, 450.8524, 453.7988, 456.7858, 458.8868, 463.9886, 466.5064, 468.9124, 472.6616, 475.4682, 478.582, 481.304, 485.2738, 488.6894, 490.329, 496.106, 497.6908, 501.1374, 504.5322, 506.8848, 510.3324, 513.4512, 516.179, 520.4412, 522.6066, 526.167, 528.7794, 533.379, 536.067, 538.46, 542.9116, 545.692, 547.9546, 552.493, 555.2722, 557.335, 562.449, 564.2014, 569.0738, 571.0974, 574.8564, 578.2996, 581.409, 583.9704, 585.8098, 589.6528, 594.5998, 595.958, 600.068, 603.3278, 608.2016, 609.9632, 612.864, 615.43, 620.7794, 621.272, 625.8644, 629.206, 633.219, 634.5154, 638.6102},
|
||||
// precision 8
|
||||
{184.2152, 187.2454, 190.2096, 193.6652, 196.6312, 199.6822, 203.249, 206.3296, 210.0038, 213.2074, 216.4612, 220.27, 223.5178, 227.4412, 230.8032, 234.1634, 238.1688, 241.6074, 245.6946, 249.2664, 252.8228, 257.0432, 260.6824, 264.9464, 268.6268, 272.2626, 276.8376, 280.4034, 284.8956, 288.8522, 292.7638, 297.3552, 301.3556, 305.7526, 309.9292, 313.8954, 318.8198, 322.7668, 327.298, 331.6688, 335.9466, 340.9746, 345.1672, 349.3474, 354.3028, 358.8912, 364.114, 368.4646, 372.9744, 378.4092, 382.6022, 387.843, 392.5684, 397.1652, 402.5426, 407.4152, 412.5388, 417.3592, 422.1366, 427.486, 432.3918, 437.5076, 442.509, 447.3834, 453.3498, 458.0668, 463.7346, 469.1228, 473.4528, 479.7, 484.644, 491.0518, 495.5774, 500.9068, 506.432, 512.1666, 517.434, 522.6644, 527.4894, 533.6312, 538.3804, 544.292, 550.5496, 556.0234, 562.8206, 566.6146, 572.4188, 579.117, 583.6762, 590.6576, 595.7864, 601.509, 607.5334, 612.9204, 619.772, 624.2924, 630.8654, 636.1836, 642.745, 649.1316, 655.0386, 660.0136, 666.6342, 671.6196, 678.1866, 684.4282, 689.3324, 695.4794, 702.5038, 708.129, 713.528, 720.3204, 726.463, 732.7928, 739.123, 744.7418, 751.2192, 756.5102, 762.6066, 769.0184, 775.2224, 781.4014, 787.7618, 794.1436, 798.6506, 805.6378, 811.766, 819.7514, 824.5776, 828.7322, 837.8048, 843.6302, 849.9336, 854.4798, 861.3388, 867.9894, 873.8196, 880.3136, 886.2308, 892.4588, 899.0816, 905.4076, 912.0064, 917.3878, 923.619, 929.998, 937.3482, 943.9506, 947.991, 955.1144, 962.203, 968.8222, 975.7324, 981.7826, 988.7666, 994.2648, 1000.3128, 1007.4082, 1013.7536, 1020.3376, 1026.7156, 1031.7478, 1037.4292, 1045.393, 1051.2278, 1058.3434, 1062.8726, 1071.884, 1076.806, 1082.9176, 1089.1678, 1095.5032, 1102.525, 1107.2264, 1115.315, 1120.93, 1127.252, 1134.1496, 1139.0408, 1147.5448, 1153.3296, 1158.1974, 1166.5262, 1174.3328, 1175.657, 1184.4222, 1190.9172, 1197.1292, 1204.4606, 1210.4578, 1218.8728, 1225.3336, 1226.6592, 1236.5768, 1241.363, 1249.4074, 1254.6566, 1260.8014, 1266.5454, 1274.5192},
|
||||
// precision 9
|
||||
{369, 374.8294, 381.2452, 387.6698, 394.1464, 400.2024, 406.8782, 413.6598, 420.462, 427.2826, 433.7102, 440.7416, 447.9366, 455.1046, 462.285, 469.0668, 476.306, 483.8448, 491.301, 498.9886, 506.2422, 513.8138, 521.7074, 529.7428, 537.8402, 545.1664, 553.3534, 561.594, 569.6886, 577.7876, 585.65, 594.228, 602.8036, 611.1666, 620.0818, 628.0824, 637.2574, 646.302, 655.1644, 664.0056, 672.3802, 681.7192, 690.5234, 700.2084, 708.831, 718.485, 728.1112, 737.4764, 746.76, 756.3368, 766.5538, 775.5058, 785.2646, 795.5902, 804.3818, 814.8998, 824.9532, 835.2062, 845.2798, 854.4728, 864.9582, 875.3292, 886.171, 896.781, 906.5716, 916.7048, 927.5322, 937.875, 949.3972, 958.3464, 969.7274, 980.2834, 992.1444, 1003.4264, 1013.0166, 1024.018, 1035.0438, 1046.34, 1057.6856, 1068.9836, 1079.0312, 1091.677, 1102.3188, 1113.4846, 1124.4424, 1135.739, 1147.1488, 1158.9202, 1169.406, 1181.5342, 1193.2834, 1203.8954, 1216.3286, 1226.2146, 1239.6684, 1251.9946, 1262.123, 1275.4338, 1285.7378, 1296.076, 1308.9692, 1320.4964, 1333.0998, 1343.9864, 1357.7754, 1368.3208, 1380.4838, 1392.7388, 1406.0758, 1416.9098, 1428.9728, 1440.9228, 1453.9292, 1462.617, 1476.05, 1490.2996, 1500.6128, 1513.7392, 1524.5174, 1536.6322, 1548.2584, 1562.3766, 1572.423, 1587.1232, 1596.5164, 1610.5938, 1622.5972, 1633.1222, 1647.7674, 1658.5044, 1671.57, 1683.7044, 1695.4142, 1708.7102, 1720.6094, 1732.6522, 1747.841, 1756.4072, 1769.9786, 1782.3276, 1797.5216, 1808.3186, 1819.0694, 1834.354, 1844.575, 1856.2808, 1871.1288, 1880.7852, 1893.9622, 1906.3418, 1920.6548, 1932.9302, 1945.8584, 1955.473, 1968.8248, 1980.6446, 1995.9598, 2008.349, 2019.8556, 2033.0334, 2044.0206, 2059.3956, 2069.9174, 2082.6084, 2093.7036, 2106.6108, 2118.9124, 2132.301, 2144.7628, 2159.8422, 2171.0212, 2183.101, 2193.5112, 2208.052, 2221.3194, 2233.3282, 2247.295, 2257.7222, 2273.342, 2286.5638, 2299.6786, 2310.8114, 2322.3312, 2335.516, 2349.874, 2363.5968, 2373.865, 2387.1918, 2401.8328, 2414.8496, 2424.544, 2436.7592, 2447.1682, 2464.1958, 2474.3438, 2489.0006, 2497.4526, 2513.6586, 2527.19, 2540.7028, 2553.768},
|
||||
// precision 10
|
||||
{738.1256, 750.4234, 763.1064, 775.4732, 788.4636, 801.0644, 814.488, 827.9654, 841.0832, 854.7864, 868.1992, 882.2176, 896.5228, 910.1716, 924.7752, 938.899, 953.6126, 968.6492, 982.9474, 998.5214, 1013.1064, 1028.6364, 1044.2468, 1059.4588, 1075.3832, 1091.0584, 1106.8606, 1123.3868, 1139.5062, 1156.1862, 1172.463, 1189.339, 1206.1936, 1223.1292, 1240.1854, 1257.2908, 1275.3324, 1292.8518, 1310.5204, 1328.4854, 1345.9318, 1364.552, 1381.4658, 1400.4256, 1419.849, 1438.152, 1456.8956, 1474.8792, 1494.118, 1513.62, 1532.5132, 1551.9322, 1570.7726, 1590.6086, 1610.5332, 1630.5918, 1650.4294, 1669.7662, 1690.4106, 1710.7338, 1730.9012, 1750.4486, 1770.1556, 1791.6338, 1812.7312, 1833.6264, 1853.9526, 1874.8742, 1896.8326, 1918.1966, 1939.5594, 1961.07, 1983.037, 2003.1804, 2026.071, 2047.4884, 2070.0848, 2091.2944, 2114.333, 2135.9626, 2158.2902, 2181.0814, 2202.0334, 2224.4832, 2246.39, 2269.7202, 2292.1714, 2314.2358, 2338.9346, 2360.891, 2384.0264, 2408.3834, 2430.1544, 2454.8684, 2476.9896, 2501.4368, 2522.8702, 2548.0408, 2570.6738, 2593.5208, 2617.0158, 2640.2302, 2664.0962, 2687.4986, 2714.2588, 2735.3914, 2759.6244, 2781.8378, 2808.0072, 2830.6516, 2856.2454, 2877.2136, 2903.4546, 2926.785, 2951.2294, 2976.468, 3000.867, 3023.6508, 3049.91, 3073.5984, 3098.162, 3121.5564, 3146.2328, 3170.9484, 3195.5902, 3221.3346, 3242.7032, 3271.6112, 3296.5546, 3317.7376, 3345.072, 3369.9518, 3394.326, 3418.1818, 3444.6926, 3469.086, 3494.2754, 3517.8698, 3544.248, 3565.3768, 3588.7234, 3616.979, 3643.7504, 3668.6812, 3695.72, 3719.7392, 3742.6224, 3770.4456, 3795.6602, 3819.9058, 3844.002, 3869.517, 3895.6824, 3920.8622, 3947.1364, 3973.985, 3995.4772, 4021.62, 4046.628, 4074.65, 4096.2256, 4121.831, 4146.6406, 4173.276, 4195.0744, 4223.9696, 4251.3708, 4272.9966, 4300.8046, 4326.302, 4353.1248, 4374.312, 4403.0322, 4426.819, 4450.0598, 4478.5206, 4504.8116, 4528.8928, 4553.9584, 4578.8712, 4603.8384, 4632.3872, 4655.5128, 4675.821, 4704.6222, 4731.9862, 4755.4174, 4781.2628, 4804.332, 4832.3048, 4862.8752, 4883.4148, 4906.9544, 4935.3516, 4954.3532, 4984.0248, 5011.217, 5035.3258, 5057.3672, 5084.1828},
|
||||
// precision 11
|
||||
{1477, 1501.6014, 1526.5802, 1551.7942, 1577.3042, 1603.2062, 1629.8402, 1656.2292, 1682.9462, 1709.9926, 1737.3026, 1765.4252, 1793.0578, 1821.6092, 1849.626, 1878.5568, 1908.527, 1937.5154, 1967.1874, 1997.3878, 2027.37, 2058.1972, 2089.5728, 2120.1012, 2151.9668, 2183.292, 2216.0772, 2247.8578, 2280.6562, 2313.041, 2345.714, 2380.3112, 2414.1806, 2447.9854, 2481.656, 2516.346, 2551.5154, 2586.8378, 2621.7448, 2656.6722, 2693.5722, 2729.1462, 2765.4124, 2802.8728, 2838.898, 2876.408, 2913.4926, 2951.4938, 2989.6776, 3026.282, 3065.7704, 3104.1012, 3143.7388, 3181.6876, 3221.1872, 3261.5048, 3300.0214, 3339.806, 3381.409, 3421.4144, 3461.4294, 3502.2286, 3544.651, 3586.6156, 3627.337, 3670.083, 3711.1538, 3753.5094, 3797.01, 3838.6686, 3882.1678, 3922.8116, 3967.9978, 4009.9204, 4054.3286, 4097.5706, 4140.6014, 4185.544, 4229.5976, 4274.583, 4316.9438, 4361.672, 4406.2786, 4451.8628, 4496.1834, 4543.505, 4589.1816, 4632.5188, 4678.2294, 4724.8908, 4769.0194, 4817.052, 4861.4588, 4910.1596, 4956.4344, 5002.5238, 5048.13, 5093.6374, 5142.8162, 5187.7894, 5237.3984, 5285.6078, 5331.0858, 5379.1036, 5428.6258, 5474.6018, 5522.7618, 5571.5822, 5618.59, 5667.9992, 5714.88, 5763.454, 5808.6982, 5860.3644, 5910.2914, 5953.571, 6005.9232, 6055.1914, 6104.5882, 6154.5702, 6199.7036, 6251.1764, 6298.7596, 6350.0302, 6398.061, 6448.4694, 6495.933, 6548.0474, 6597.7166, 6646.9416, 6695.9208, 6742.6328, 6793.5276, 6842.1934, 6894.2372, 6945.3864, 6996.9228, 7044.2372, 7094.1374, 7142.2272, 7192.2942, 7238.8338, 7288.9006, 7344.0908, 7394.8544, 7443.5176, 7490.4148, 7542.9314, 7595.6738, 7641.9878, 7694.3688, 7743.0448, 7797.522, 7845.53, 7899.594, 7950.3132, 7996.455, 8050.9442, 8092.9114, 8153.1374, 8197.4472, 8252.8278, 8301.8728, 8348.6776, 8401.4698, 8453.551, 8504.6598, 8553.8944, 8604.1276, 8657.6514, 8710.3062, 8758.908, 8807.8706, 8862.1702, 8910.4668, 8960.77, 9007.2766, 9063.164, 9121.0534, 9164.1354, 9218.1594, 9267.767, 9319.0594, 9372.155, 9419.7126, 9474.3722, 9520.1338, 9572.368, 9622.7702, 9675.8448, 9726.5396, 9778.7378, 9827.6554, 9878.1922, 9928.7782, 9978.3984, 10026.578, 10076.5626, 10137.1618, 10177.5244, 10229.9176},
|
||||
// precision 12
|
||||
{2954, 3003.4782, 3053.3568, 3104.3666, 3155.324, 3206.9598, 3259.648, 3312.539, 3366.1474, 3420.2576, 3474.8376, 3530.6076, 3586.451, 3643.38, 3700.4104, 3757.5638, 3815.9676, 3875.193, 3934.838, 3994.8548, 4055.018, 4117.1742, 4178.4482, 4241.1294, 4304.4776, 4367.4044, 4431.8724, 4496.3732, 4561.4304, 4627.5326, 4693.949, 4761.5532, 4828.7256, 4897.6182, 4965.5186, 5034.4528, 5104.865, 5174.7164, 5244.6828, 5316.6708, 5387.8312, 5459.9036, 5532.476, 5604.8652, 5679.6718, 5753.757, 5830.2072, 5905.2828, 5980.0434, 6056.6264, 6134.3192, 6211.5746, 6290.0816, 6367.1176, 6447.9796, 6526.5576, 6606.1858, 6686.9144, 6766.1142, 6847.0818, 6927.9664, 7010.9096, 7091.0816, 7175.3962, 7260.3454, 7344.018, 7426.4214, 7511.3106, 7596.0686, 7679.8094, 7765.818, 7852.4248, 7936.834, 8022.363, 8109.5066, 8200.4554, 8288.5832, 8373.366, 8463.4808, 8549.7682, 8642.0522, 8728.3288, 8820.9528, 8907.727, 9001.0794, 9091.2522, 9179.988, 9269.852, 9362.6394, 9453.642, 9546.9024, 9640.6616, 9732.6622, 9824.3254, 9917.7484, 10007.9392, 10106.7508, 10196.2152, 10289.8114, 10383.5494, 10482.3064, 10576.8734, 10668.7872, 10764.7156, 10862.0196, 10952.793, 11049.9748, 11146.0702, 11241.4492, 11339.2772, 11434.2336, 11530.741, 11627.6136, 11726.311, 11821.5964, 11918.837, 12015.3724, 12113.0162, 12213.0424, 12306.9804, 12408.4518, 12504.8968, 12604.586, 12700.9332, 12798.705, 12898.5142, 12997.0488, 13094.788, 13198.475, 13292.7764, 13392.9698, 13486.8574, 13590.1616, 13686.5838, 13783.6264, 13887.2638, 13992.0978, 14081.0844, 14189.9956, 14280.0912, 14382.4956, 14486.4384, 14588.1082, 14686.2392, 14782.276, 14888.0284, 14985.1864, 15088.8596, 15187.0998, 15285.027, 15383.6694, 15495.8266, 15591.3736, 15694.2008, 15790.3246, 15898.4116, 15997.4522, 16095.5014, 16198.8514, 16291.7492, 16402.6424, 16499.1266, 16606.2436, 16697.7186, 16796.3946, 16902.3376, 17005.7672, 17100.814, 17206.8282, 17305.8262, 17416.0744, 17508.4092, 17617.0178, 17715.4554, 17816.758, 17920.1748, 18012.9236, 18119.7984, 18223.2248, 18324.2482, 18426.6276, 18525.0932, 18629.8976, 18733.2588, 18831.0466, 18940.1366, 19032.2696, 19131.729, 19243.4864, 19349.6932, 19442.866, 19547.9448, 19653.2798, 19754.4034, 19854.0692, 19965.1224, 20065.1774, 20158.2212, 20253.353, 20366.3264, 20463.22},
|
||||
// precision 13
|
||||
{5908.5052, 6007.2672, 6107.347, 6208.5794, 6311.2622, 6414.5514, 6519.3376, 6625.6952, 6732.5988, 6841.3552, 6950.5972, 7061.3082, 7173.5646, 7287.109, 7401.8216, 7516.4344, 7633.3802, 7751.2962, 7870.3784, 7990.292, 8110.79, 8233.4574, 8356.6036, 8482.2712, 8607.7708, 8735.099, 8863.1858, 8993.4746, 9123.8496, 9255.6794, 9388.5448, 9522.7516, 9657.3106, 9792.6094, 9930.5642, 10068.794, 10206.7256, 10347.81, 10490.3196, 10632.0778, 10775.9916, 10920.4662, 11066.124, 11213.073, 11358.0362, 11508.1006, 11659.1716, 11808.7514, 11959.4884, 12112.1314, 12265.037, 12420.3756, 12578.933, 12734.311, 12890.0006, 13047.2144, 13207.3096, 13368.5144, 13528.024, 13689.847, 13852.7528, 14018.3168, 14180.5372, 14346.9668, 14513.5074, 14677.867, 14846.2186, 15017.4186, 15184.9716, 15356.339, 15529.2972, 15697.3578, 15871.8686, 16042.187, 16216.4094, 16389.4188, 16565.9126, 16742.3272, 16919.0042, 17094.7592, 17273.965, 17451.8342, 17634.4254, 17810.5984, 17988.9242, 18171.051, 18354.7938, 18539.466, 18721.0408, 18904.9972, 19081.867, 19271.9118, 19451.8694, 19637.9816, 19821.2922, 20013.1292, 20199.3858, 20387.8726, 20572.9514, 20770.7764, 20955.1714, 21144.751, 21329.9952, 21520.709, 21712.7016, 21906.3868, 22096.2626, 22286.0524, 22475.051, 22665.5098, 22862.8492, 23055.5294, 23249.6138, 23437.848, 23636.273, 23826.093, 24020.3296, 24213.3896, 24411.7392, 24602.9614, 24805.7952, 24998.1552, 25193.9588, 25389.0166, 25585.8392, 25780.6976, 25981.2728, 26175.977, 26376.5252, 26570.1964, 26773.387, 26962.9812, 27163.0586, 27368.164, 27565.0534, 27758.7428, 27961.1276, 28163.2324, 28362.3816, 28565.7668, 28758.644, 28956.9768, 29163.4722, 29354.7026, 29561.1186, 29767.9948, 29959.9986, 30164.0492, 30366.9818, 30562.5338, 30762.9928, 30976.1592, 31166.274, 31376.722, 31570.3734, 31770.809, 31974.8934, 32179.5286, 32387.5442, 32582.3504, 32794.076, 32989.9528, 33191.842, 33392.4684, 33595.659, 33801.8672, 34000.3414, 34200.0922, 34402.6792, 34610.0638, 34804.0084, 35011.13, 35218.669, 35418.6634, 35619.0792, 35830.6534, 36028.4966, 36229.7902, 36438.6422, 36630.7764, 36833.3102, 37048.6728, 37247.3916, 37453.5904, 37669.3614, 37854.5526, 38059.305, 38268.0936, 38470.2516, 38674.7064, 38876.167, 39068.3794, 39281.9144, 39492.8566, 39684.8628, 39898.4108, 40093.1836, 40297.6858, 40489.7086, 40717.2424},
|
||||
// precision 14
|
||||
{11817.475, 12015.0046, 12215.3792, 12417.7504, 12623.1814, 12830.0086, 13040.0072, 13252.503, 13466.178, 13683.2738, 13902.0344, 14123.9798, 14347.394, 14573.7784, 14802.6894, 15033.6824, 15266.9134, 15502.8624, 15741.4944, 15980.7956, 16223.8916, 16468.6316, 16715.733, 16965.5726, 17217.204, 17470.666, 17727.8516, 17986.7886, 18247.6902, 18510.9632, 18775.304, 19044.7486, 19314.4408, 19587.202, 19862.2576, 20135.924, 20417.0324, 20697.9788, 20979.6112, 21265.0274, 21550.723, 21841.6906, 22132.162, 22428.1406, 22722.127, 23020.5606, 23319.7394, 23620.4014, 23925.2728, 24226.9224, 24535.581, 24845.505, 25155.9618, 25470.3828, 25785.9702, 26103.7764, 26420.4132, 26742.0186, 27062.8852, 27388.415, 27714.6024, 28042.296, 28365.4494, 28701.1526, 29031.8008, 29364.2156, 29704.497, 30037.1458, 30380.111, 30723.8168, 31059.5114, 31404.9498, 31751.6752, 32095.2686, 32444.7792, 32794.767, 33145.204, 33498.4226, 33847.6502, 34209.006, 34560.849, 34919.4838, 35274.9778, 35635.1322, 35996.3266, 36359.1394, 36722.8266, 37082.8516, 37447.7354, 37815.9606, 38191.0692, 38559.4106, 38924.8112, 39294.6726, 39663.973, 40042.261, 40416.2036, 40779.2036, 41161.6436, 41540.9014, 41921.1998, 42294.7698, 42678.5264, 43061.3464, 43432.375, 43818.432, 44198.6598, 44583.0138, 44970.4794, 45353.924, 45729.858, 46118.2224, 46511.5724, 46900.7386, 47280.6964, 47668.1472, 48055.6796, 48446.9436, 48838.7146, 49217.7296, 49613.7796, 50010.7508, 50410.0208, 50793.7886, 51190.2456, 51583.1882, 51971.0796, 52376.5338, 52763.319, 53165.5534, 53556.5594, 53948.2702, 54346.352, 54748.7914, 55138.577, 55543.4824, 55941.1748, 56333.7746, 56745.1552, 57142.7944, 57545.2236, 57935.9956, 58348.5268, 58737.5474, 59158.5962, 59542.6896, 59958.8004, 60349.3788, 60755.0212, 61147.6144, 61548.194, 61946.0696, 62348.6042, 62763.603, 63162.781, 63560.635, 63974.3482, 64366.4908, 64771.5876, 65176.7346, 65597.3916, 65995.915, 66394.0384, 66822.9396, 67203.6336, 67612.2032, 68019.0078, 68420.0388, 68821.22, 69235.8388, 69640.0724, 70055.155, 70466.357, 70863.4266, 71276.2482, 71677.0306, 72080.2006, 72493.0214, 72893.5952, 73314.5856, 73714.9852, 74125.3022, 74521.2122, 74933.6814, 75341.5904, 75743.0244, 76166.0278, 76572.1322, 76973.1028, 77381.6284, 77800.6092, 78189.328, 78607.0962, 79012.2508, 79407.8358, 79825.725, 80238.701, 80646.891, 81035.6436, 81460.0448, 81876.3884},
|
||||
// precision 15
|
||||
{23635.0036, 24030.8034, 24431.4744, 24837.1524, 25246.7928, 25661.326, 26081.3532, 26505.2806, 26933.9892, 27367.7098, 27805.318, 28248.799, 28696.4382, 29148.8244, 29605.5138, 30066.8668, 30534.2344, 31006.32, 31480.778, 31962.2418, 32447.3324, 32938.0232, 33432.731, 33930.728, 34433.9896, 34944.1402, 35457.5588, 35974.5958, 36497.3296, 37021.9096, 37554.326, 38088.0826, 38628.8816, 39171.3192, 39723.2326, 40274.5554, 40832.3142, 41390.613, 41959.5908, 42532.5466, 43102.0344, 43683.5072, 44266.694, 44851.2822, 45440.7862, 46038.0586, 46640.3164, 47241.064, 47846.155, 48454.7396, 49076.9168, 49692.542, 50317.4778, 50939.65, 51572.5596, 52210.2906, 52843.7396, 53481.3996, 54127.236, 54770.406, 55422.6598, 56078.7958, 56736.7174, 57397.6784, 58064.5784, 58730.308, 59404.9784, 60077.0864, 60751.9158, 61444.1386, 62115.817, 62808.7742, 63501.4774, 64187.5454, 64883.6622, 65582.7468, 66274.5318, 66976.9276, 67688.7764, 68402.138, 69109.6274, 69822.9706, 70543.6108, 71265.5202, 71983.3848, 72708.4656, 73433.384, 74158.4664, 74896.4868, 75620.9564, 76362.1434, 77098.3204, 77835.7662, 78582.6114, 79323.9902, 80067.8658, 80814.9246, 81567.0136, 82310.8536, 83061.9952, 83821.4096, 84580.8608, 85335.547, 86092.5802, 86851.6506, 87612.311, 88381.2016, 89146.3296, 89907.8974, 90676.846, 91451.4152, 92224.5518, 92995.8686, 93763.5066, 94551.2796, 95315.1944, 96096.1806, 96881.0918, 97665.679, 98442.68, 99229.3002, 100011.0994, 100790.6386, 101580.1564, 102377.7484, 103152.1392, 103944.2712, 104730.216, 105528.6336, 106324.9398, 107117.6706, 107890.3988, 108695.2266, 109485.238, 110294.7876, 111075.0958, 111878.0496, 112695.2864, 113464.5486, 114270.0474, 115068.608, 115884.3626, 116673.2588, 117483.3716, 118275.097, 119085.4092, 119879.2808, 120687.5868, 121499.9944, 122284.916, 123095.9254, 123912.5038, 124709.0454, 125503.7182, 126323.259, 127138.9412, 127943.8294, 128755.646, 129556.5354, 130375.3298, 131161.4734, 131971.1962, 132787.5458, 133588.1056, 134431.351, 135220.2906, 136023.398, 136846.6558, 137667.0004, 138463.663, 139283.7154, 140074.6146, 140901.3072, 141721.8548, 142543.2322, 143356.1096, 144173.7412, 144973.0948, 145794.3162, 146609.5714, 147420.003, 148237.9784, 149050.5696, 149854.761, 150663.1966, 151494.0754, 152313.1416, 153112.6902, 153935.7206, 154746.9262, 155559.547, 156401.9746, 157228.7036, 158008.7254, 158820.75, 159646.9184, 160470.4458, 161279.5348, 162093.3114, 162918.542, 163729.2842},
|
||||
// precision 16
|
||||
{47271, 48062.3584, 48862.7074, 49673.152, 50492.8416, 51322.9514, 52161.03, 53009.407, 53867.6348, 54734.206, 55610.5144, 56496.2096, 57390.795, 58297.268, 59210.6448, 60134.665, 61068.0248, 62010.4472, 62962.5204, 63923.5742, 64895.0194, 65876.4182, 66862.6136, 67862.6968, 68868.8908, 69882.8544, 70911.271, 71944.0924, 72990.0326, 74040.692, 75100.6336, 76174.7826, 77252.5998, 78340.2974, 79438.2572, 80545.4976, 81657.2796, 82784.6336, 83915.515, 85059.7362, 86205.9368, 87364.4424, 88530.3358, 89707.3744, 90885.9638, 92080.197, 93275.5738, 94479.391, 95695.918, 96919.2236, 98148.4602, 99382.3474, 100625.6974, 101878.0284, 103141.6278, 104409.4588, 105686.2882, 106967.5402, 108261.6032, 109548.1578, 110852.0728, 112162.231, 113479.0072, 114806.2626, 116137.9072, 117469.5048, 118813.5186, 120165.4876, 121516.2556, 122875.766, 124250.5444, 125621.2222, 127003.2352, 128387.848, 129775.2644, 131181.7776, 132577.3086, 133979.9458, 135394.1132, 136800.9078, 138233.217, 139668.5308, 141085.212, 142535.2122, 143969.0684, 145420.2872, 146878.1542, 148332.7572, 149800.3202, 151269.66, 152743.6104, 154213.0948, 155690.288, 157169.4246, 158672.1756, 160160.059, 161650.6854, 163145.7772, 164645.6726, 166159.1952, 167682.1578, 169177.3328, 170700.0118, 172228.8964, 173732.6664, 175265.5556, 176787.799, 178317.111, 179856.6914, 181400.865, 182943.4612, 184486.742, 186033.4698, 187583.7886, 189148.1868, 190688.4526, 192250.1926, 193810.9042, 195354.2972, 196938.7682, 198493.5898, 200079.2824, 201618.912, 203205.5492, 204765.5798, 206356.1124, 207929.3064, 209498.7196, 211086.229, 212675.1324, 214256.7892, 215826.2392, 217412.8474, 218995.6724, 220618.6038, 222207.1166, 223781.0364, 225387.4332, 227005.7928, 228590.4336, 230217.8738, 231805.1054, 233408.9, 234995.3432, 236601.4956, 238190.7904, 239817.2548, 241411.2832, 243002.4066, 244640.1884, 246255.3128, 247849.3508, 249479.9734, 251106.8822, 252705.027, 254332.9242, 255935.129, 257526.9014, 259154.772, 260777.625, 262390.253, 264004.4906, 265643.59, 267255.4076, 268873.426, 270470.7252, 272106.4804, 273722.4456, 275337.794, 276945.7038, 278592.9154, 280204.3726, 281841.1606, 283489.171, 285130.1716, 286735.3362, 288364.7164, 289961.1814, 291595.5524, 293285.683, 294899.6668, 296499.3434, 298128.0462, 299761.8946, 301394.2424, 302997.6748, 304615.1478, 306269.7724, 307886.114, 309543.1028, 311153.2862, 312782.8546, 314421.2008, 316033.2438, 317692.9636, 319305.2648, 320948.7406, 322566.3364, 324228.4224, 325847.1542},
|
||||
// precision 17
|
||||
{94542, 96125.811, 97728.019, 99348.558, 100987.9705, 102646.7565, 104324.5125, 106021.7435, 107736.7865, 109469.272, 111223.9465, 112995.219, 114787.432, 116593.152, 118422.71, 120267.2345, 122134.6765, 124020.937, 125927.2705, 127851.255, 129788.9485, 131751.016, 133726.8225, 135722.592, 137736.789, 139770.568, 141821.518, 143891.343, 145982.1415, 148095.387, 150207.526, 152355.649, 154515.6415, 156696.05, 158887.7575, 161098.159, 163329.852, 165569.053, 167837.4005, 170121.6165, 172420.4595, 174732.6265, 177062.77, 179412.502, 181774.035, 184151.939, 186551.6895, 188965.691, 191402.8095, 193857.949, 196305.0775, 198774.6715, 201271.2585, 203764.78, 206299.3695, 208818.1365, 211373.115, 213946.7465, 216532.076, 219105.541, 221714.5375, 224337.5135, 226977.5125, 229613.0655, 232270.2685, 234952.2065, 237645.3555, 240331.1925, 243034.517, 245756.0725, 248517.6865, 251232.737, 254011.3955, 256785.995, 259556.44, 262368.335, 265156.911, 267965.266, 270785.583, 273616.0495, 276487.4835, 279346.639, 282202.509, 285074.3885, 287942.2855, 290856.018, 293774.0345, 296678.5145, 299603.6355, 302552.6575, 305492.9785, 308466.8605, 311392.581, 314347.538, 317319.4295, 320285.9785, 323301.7325, 326298.3235, 329301.3105, 332301.987, 335309.791, 338370.762, 341382.923, 344431.1265, 347464.1545, 350507.28, 353619.2345, 356631.2005, 359685.203, 362776.7845, 365886.488, 368958.2255, 372060.6825, 375165.4335, 378237.935, 381328.311, 384430.5225, 387576.425, 390683.242, 393839.648, 396977.8425, 400101.9805, 403271.296, 406409.8425, 409529.5485, 412678.7, 415847.423, 419020.8035, 422157.081, 425337.749, 428479.6165, 431700.902, 434893.1915, 438049.582, 441210.5415, 444379.2545, 447577.356, 450741.931, 453959.548, 457137.0935, 460329.846, 463537.4815, 466732.3345, 469960.5615, 473164.681, 476347.6345, 479496.173, 482813.1645, 486025.6995, 489249.4885, 492460.1945, 495675.8805, 498908.0075, 502131.802, 505374.3855, 508550.9915, 511806.7305, 515026.776, 518217.0005, 521523.9855, 524705.9855, 527950.997, 531210.0265, 534472.497, 537750.7315, 540926.922, 544207.094, 547429.4345, 550666.3745, 553975.3475, 557150.7185, 560399.6165, 563662.697, 566916.7395, 570146.1215, 573447.425, 576689.6245, 579874.5745, 583202.337, 586503.0255, 589715.635, 592910.161, 596214.3885, 599488.035, 602740.92, 605983.0685, 609248.67, 612491.3605, 615787.912, 619107.5245, 622307.9555, 625577.333, 628840.4385, 632085.2155, 635317.6135, 638691.7195, 641887.467, 645139.9405, 648441.546, 651666.252, 654941.845},
|
||||
// precision 18
|
||||
{189084, 192250.913, 195456.774, 198696.946, 201977.762, 205294.444, 208651.754, 212042.099, 215472.269, 218941.91, 222443.912, 225996.845, 229568.199, 233193.568, 236844.457, 240543.233, 244279.475, 248044.27, 251854.588, 255693.2, 259583.619, 263494.621, 267445.385, 271454.061, 275468.769, 279549.456, 283646.446, 287788.198, 291966.099, 296181.164, 300431.469, 304718.618, 309024.004, 313393.508, 317760.803, 322209.731, 326675.061, 331160.627, 335654.47, 340241.442, 344841.833, 349467.132, 354130.629, 358819.432, 363574.626, 368296.587, 373118.482, 377914.93, 382782.301, 387680.669, 392601.981, 397544.323, 402529.115, 407546.018, 412593.658, 417638.657, 422762.865, 427886.169, 433017.167, 438213.273, 443441.254, 448692.421, 453937.533, 459239.049, 464529.569, 469910.083, 475274.03, 480684.473, 486070.26, 491515.237, 496995.651, 502476.617, 507973.609, 513497.19, 519083.233, 524726.509, 530305.505, 535945.728, 541584.404, 547274.055, 552967.236, 558667.862, 564360.216, 570128.148, 575965.08, 581701.952, 587532.523, 593361.144, 599246.128, 605033.418, 610958.779, 616837.117, 622772.818, 628672.04, 634675.369, 640574.831, 646585.739, 652574.547, 658611.217, 664642.684, 670713.914, 676737.681, 682797.313, 688837.897, 694917.874, 701009.882, 707173.648, 713257.254, 719415.392, 725636.761, 731710.697, 737906.209, 744103.074, 750313.39, 756504.185, 762712.579, 768876.985, 775167.859, 781359, 787615.959, 793863.597, 800245.477, 806464.582, 812785.294, 819005.925, 825403.057, 831676.197, 837936.284, 844266.968, 850642.711, 856959.756, 863322.774, 869699.931, 876102.478, 882355.787, 888694.463, 895159.952, 901536.143, 907872.631, 914293.672, 920615.14, 927130.974, 933409.404, 939922.178, 946331.47, 952745.93, 959209.264, 965590.224, 972077.284, 978501.961, 984953.19, 991413.271, 997817.479, 1004222.658, 1010725.676, 1017177.138, 1023612.529, 1030098.236, 1036493.719, 1043112.207, 1049537.036, 1056008.096, 1062476.184, 1068942.337, 1075524.95, 1081932.864, 1088426.025, 1094776.005, 1101327.448, 1107901.673, 1114423.639, 1120884.602, 1127324.923, 1133794.24, 1140328.886, 1146849.376, 1153346.682, 1159836.502, 1166478.703, 1172953.304, 1179391.502, 1185950.982, 1192544.052, 1198913.41, 1205430.994, 1212015.525, 1218674.042, 1225121.683, 1231551.101, 1238126.379, 1244673.795, 1251260.649, 1257697.86, 1264320.983, 1270736.319, 1277274.694, 1283804.95, 1290211.514, 1296858.568, 1303455.691},
|
||||
}
|
||||
|
||||
var biasData = [][]float64{
|
||||
// precision 4
|
||||
{10, 9.717, 9.207, 8.7896, 8.2882, 7.8204, 7.3772, 6.9342, 6.5202, 6.161, 5.7722, 5.4636, 5.0396, 4.6766, 4.3566, 4.0454, 3.7936, 3.4856, 3.2666, 2.9946, 2.766, 2.4692, 2.3638, 2.0764, 1.7864, 1.7602, 1.4814, 1.433, 1.2926, 1.0664, 0.999600000000001, 0.7956, 0.5366, 0.589399999999998, 0.573799999999999, 0.269799999999996, 0.368200000000002, 0.0544000000000011, 0.234200000000001, 0.0108000000000033, -0.203400000000002, -0.0701999999999998, -0.129600000000003, -0.364199999999997, -0.480600000000003, -0.226999999999997, -0.322800000000001, -0.382599999999996, -0.511200000000002, -0.669600000000003, -0.749400000000001, -0.500399999999999, -0.617600000000003, -0.6922, -0.601599999999998, -0.416200000000003, -0.338200000000001, -0.782600000000002, -0.648600000000002, -0.919800000000002, -0.851799999999997, -0.962400000000002, -0.6402, -1.1922, -1.0256, -1.086, -1.21899999999999, -0.819400000000002, -0.940600000000003, -1.1554, -1.2072, -1.1752, -1.16759999999999, -1.14019999999999, -1.3754, -1.29859999999999, -1.607, -1.3292, -1.7606},
|
||||
// precision 5
|
||||
{22, 21.1194, 20.8208, 20.2318, 19.77, 19.2436, 18.7774, 18.2848, 17.8224, 17.3742, 16.9336, 16.503, 16.0494, 15.6292, 15.2124, 14.798, 14.367, 13.9728, 13.5944, 13.217, 12.8438, 12.3696, 12.0956, 11.7044, 11.324, 11.0668, 10.6698, 10.3644, 10.049, 9.6918, 9.4146, 9.082, 8.687, 8.5398, 8.2462, 7.857, 7.6606, 7.4168, 7.1248, 6.9222, 6.6804, 6.447, 6.3454, 5.9594, 5.7636, 5.5776, 5.331, 5.19, 4.9676, 4.7564, 4.5314, 4.4442, 4.3708, 3.9774, 3.9624, 3.8796, 3.755, 3.472, 3.2076, 3.1024, 2.8908, 2.7338, 2.7728, 2.629, 2.413, 2.3266, 2.1524, 2.2642, 2.1806, 2.0566, 1.9192, 1.7598, 1.3516, 1.5802, 1.43859999999999, 1.49160000000001, 1.1524, 1.1892, 0.841399999999993, 0.879800000000003, 0.837599999999995, 0.469800000000006, 0.765600000000006, 0.331000000000003, 0.591399999999993, 0.601200000000006, 0.701599999999999, 0.558199999999999, 0.339399999999998, 0.354399999999998, 0.491200000000006, 0.308000000000007, 0.355199999999996, -0.0254000000000048, 0.205200000000005, -0.272999999999996, 0.132199999999997, 0.394400000000005, -0.241200000000006, 0.242000000000004, 0.191400000000002, 0.253799999999998, -0.122399999999999, -0.370800000000003, 0.193200000000004, -0.0848000000000013, 0.0867999999999967, -0.327200000000005, -0.285600000000002, 0.311400000000006, -0.128399999999999, -0.754999999999995, -0.209199999999996, -0.293599999999998, -0.364000000000004, -0.253600000000006, -0.821200000000005, -0.253600000000006, -0.510400000000004, -0.383399999999995, -0.491799999999998, -0.220200000000006, -0.0972000000000008, -0.557400000000001, -0.114599999999996, -0.295000000000002, -0.534800000000004, 0.346399999999988, -0.65379999999999, 0.0398000000000138, 0.0341999999999985, -0.995800000000003, -0.523400000000009, -0.489000000000004, -0.274799999999999, -0.574999999999989, -0.482799999999997, 0.0571999999999946, -0.330600000000004, -0.628800000000012, -0.140199999999993, -0.540600000000012, -0.445999999999998, -0.599400000000003, -0.262599999999992, 0.163399999999996, -0.100599999999986, -0.39500000000001, -1.06960000000001, -0.836399999999998, -0.753199999999993, -0.412399999999991, -0.790400000000005, -0.29679999999999, -0.28540000000001, -0.193000000000012, -0.0772000000000048, -0.962799999999987, -0.414800000000014},
|
||||
// precision 6
|
||||
{45, 44.1902, 43.271, 42.8358, 41.8142, 41.2854, 40.317, 39.354, 38.8924, 37.9436, 37.4596, 36.5262, 35.6248, 35.1574, 34.2822, 33.837, 32.9636, 32.074, 31.7042, 30.7976, 30.4772, 29.6564, 28.7942, 28.5004, 27.686, 27.291, 26.5672, 25.8556, 25.4982, 24.8204, 24.4252, 23.7744, 23.0786, 22.8344, 22.0294, 21.8098, 21.0794, 20.5732, 20.1878, 19.5648, 19.2902, 18.6784, 18.3352, 17.8946, 17.3712, 17.0852, 16.499, 16.2686, 15.6844, 15.2234, 14.9732, 14.3356, 14.2286, 13.7262, 13.3284, 13.1048, 12.5962, 12.3562, 12.1272, 11.4184, 11.4974, 11.0822, 10.856, 10.48, 10.2834, 10.0208, 9.637, 9.51739999999999, 9.05759999999999, 8.74760000000001, 8.42700000000001, 8.1326, 8.2372, 8.2788, 7.6776, 7.79259999999999, 7.1952, 6.9564, 6.6454, 6.87, 6.5428, 6.19999999999999, 6.02940000000001, 5.62780000000001, 5.6782, 5.792, 5.35159999999999, 5.28319999999999, 5.0394, 5.07480000000001, 4.49119999999999, 4.84899999999999, 4.696, 4.54040000000001, 4.07300000000001, 4.37139999999999, 3.7216, 3.7328, 3.42080000000001, 3.41839999999999, 3.94239999999999, 3.27719999999999, 3.411, 3.13079999999999, 2.76900000000001, 2.92580000000001, 2.68279999999999, 2.75020000000001, 2.70599999999999, 2.3886, 3.01859999999999, 2.45179999999999, 2.92699999999999, 2.41720000000001, 2.41139999999999, 2.03299999999999, 2.51240000000001, 2.5564, 2.60079999999999, 2.41720000000001, 1.80439999999999, 1.99700000000001, 2.45480000000001, 1.8948, 2.2346, 2.30860000000001, 2.15479999999999, 1.88419999999999, 1.6508, 0.677199999999999, 1.72540000000001, 1.4752, 1.72280000000001, 1.66139999999999, 1.16759999999999, 1.79300000000001, 1.00059999999999, 0.905200000000008, 0.659999999999997, 1.55879999999999, 1.1636, 0.688199999999995, 0.712600000000009, 0.450199999999995, 1.1978, 0.975599999999986, 0.165400000000005, 1.727, 1.19739999999999, -0.252600000000001, 1.13460000000001, 1.3048, 1.19479999999999, 0.313400000000001, 0.878999999999991, 1.12039999999999, 0.853000000000009, 1.67920000000001, 0.856999999999999, 0.448599999999999, 1.2362, 0.953399999999988, 1.02859999999998, 0.563199999999995, 0.663000000000011, 0.723000000000013, 0.756599999999992, 0.256599999999992, -0.837600000000009, 0.620000000000005, 0.821599999999989, 0.216600000000028, 0.205600000000004, 0.220199999999977, 0.372599999999977, 0.334400000000016, 0.928400000000011, 0.972800000000007, 0.192400000000021, 0.487199999999973, -0.413000000000011, 0.807000000000016, 0.120600000000024, 0.769000000000005, 0.870799999999974, 0.66500000000002, 0.118200000000002, 0.401200000000017, 0.635199999999998, 0.135400000000004, 0.175599999999974, 1.16059999999999, 0.34620000000001, 0.521400000000028, -0.586599999999976, -1.16480000000001, 0.968399999999974, 0.836999999999989, 0.779600000000016, 0.985799999999983},
|
||||
// precision 7
|
||||
{91, 89.4934, 87.9758, 86.4574, 84.9718, 83.4954, 81.5302, 80.0756, 78.6374, 77.1782, 75.7888, 73.9522, 72.592, 71.2532, 69.9086, 68.5938, 66.9474, 65.6796, 64.4394, 63.2176, 61.9768, 60.4214, 59.2528, 58.0102, 56.8658, 55.7278, 54.3044, 53.1316, 52.093, 51.0032, 49.9092, 48.6306, 47.5294, 46.5756, 45.6508, 44.662, 43.552, 42.3724, 41.617, 40.5754, 39.7872, 38.8444, 37.7988, 36.8606, 36.2118, 35.3566, 34.4476, 33.5882, 32.6816, 32.0824, 31.0258, 30.6048, 29.4436, 28.7274, 27.957, 27.147, 26.4364, 25.7592, 25.3386, 24.781, 23.8028, 23.656, 22.6544, 21.996, 21.4718, 21.1544, 20.6098, 19.5956, 19.0616, 18.5758, 18.4878, 17.5244, 17.2146, 16.724, 15.8722, 15.5198, 15.0414, 14.941, 14.9048, 13.87, 13.4304, 13.028, 12.4708, 12.37, 12.0624, 11.4668, 11.5532, 11.4352, 11.2564, 10.2744, 10.2118, 9.74720000000002, 10.1456, 9.2928, 8.75040000000001, 8.55279999999999, 8.97899999999998, 8.21019999999999, 8.18340000000001, 7.3494, 7.32499999999999, 7.66140000000001, 6.90300000000002, 7.25439999999998, 6.9042, 7.21499999999997, 6.28640000000001, 6.08139999999997, 6.6764, 6.30099999999999, 5.13900000000001, 5.65800000000002, 5.17320000000001, 4.59019999999998, 4.9538, 5.08280000000002, 4.92200000000003, 4.99020000000002, 4.7328, 5.4538, 4.11360000000002, 4.22340000000003, 4.08780000000002, 3.70800000000003, 4.15559999999999, 4.18520000000001, 3.63720000000001, 3.68220000000002, 3.77960000000002, 3.6078, 2.49160000000001, 3.13099999999997, 2.5376, 3.19880000000001, 3.21100000000001, 2.4502, 3.52820000000003, 2.91199999999998, 3.04480000000001, 2.7432, 2.85239999999999, 2.79880000000003, 2.78579999999999, 1.88679999999999, 2.98860000000002, 2.50639999999999, 1.91239999999999, 2.66160000000002, 2.46820000000002, 1.58199999999999, 1.30399999999997, 2.27379999999999, 2.68939999999998, 1.32900000000001, 3.10599999999999, 1.69080000000002, 2.13740000000001, 2.53219999999999, 1.88479999999998, 1.33240000000001, 1.45119999999997, 1.17899999999997, 2.44119999999998, 1.60659999999996, 2.16700000000003, 0.77940000000001, 2.37900000000002, 2.06700000000001, 1.46000000000004, 2.91160000000002, 1.69200000000001, 0.954600000000028, 2.49300000000005, 2.2722, 1.33500000000004, 2.44899999999996, 1.20140000000004, 3.07380000000001, 2.09739999999999, 2.85640000000001, 2.29960000000005, 2.40899999999999, 1.97040000000004, 0.809799999999996, 1.65279999999996, 2.59979999999996, 0.95799999999997, 2.06799999999998, 2.32780000000002, 4.20159999999998, 1.96320000000003, 1.86400000000003, 1.42999999999995, 3.77940000000001, 1.27200000000005, 1.86440000000005, 2.20600000000002, 3.21900000000005, 1.5154, 2.61019999999996},
|
||||
// precision 8
|
||||
{183.2152, 180.2454, 177.2096, 173.6652, 170.6312, 167.6822, 164.249, 161.3296, 158.0038, 155.2074, 152.4612, 149.27, 146.5178, 143.4412, 140.8032, 138.1634, 135.1688, 132.6074, 129.6946, 127.2664, 124.8228, 122.0432, 119.6824, 116.9464, 114.6268, 112.2626, 109.8376, 107.4034, 104.8956, 102.8522, 100.7638, 98.3552, 96.3556, 93.7526, 91.9292, 89.8954, 87.8198, 85.7668, 83.298, 81.6688, 79.9466, 77.9746, 76.1672, 74.3474, 72.3028, 70.8912, 69.114, 67.4646, 65.9744, 64.4092, 62.6022, 60.843, 59.5684, 58.1652, 56.5426, 55.4152, 53.5388, 52.3592, 51.1366, 49.486, 48.3918, 46.5076, 45.509, 44.3834, 43.3498, 42.0668, 40.7346, 40.1228, 38.4528, 37.7, 36.644, 36.0518, 34.5774, 33.9068, 32.432, 32.1666, 30.434, 29.6644, 28.4894, 27.6312, 26.3804, 26.292, 25.5496000000001, 25.0234, 24.8206, 22.6146, 22.4188, 22.117, 20.6762, 20.6576, 19.7864, 19.509, 18.5334, 17.9204, 17.772, 16.2924, 16.8654, 15.1836, 15.745, 15.1316, 15.0386, 14.0136, 13.6342, 12.6196, 12.1866, 12.4281999999999, 11.3324, 10.4794000000001, 11.5038, 10.129, 9.52800000000002, 10.3203999999999, 9.46299999999997, 9.79280000000006, 9.12300000000005, 8.74180000000001, 9.2192, 7.51020000000005, 7.60659999999996, 7.01840000000004, 7.22239999999999, 7.40139999999997, 6.76179999999999, 7.14359999999999, 5.65060000000005, 5.63779999999997, 5.76599999999996, 6.75139999999999, 5.57759999999996, 3.73220000000003, 5.8048, 5.63019999999995, 4.93359999999996, 3.47979999999995, 4.33879999999999, 3.98940000000005, 3.81960000000004, 3.31359999999995, 3.23080000000004, 3.4588, 3.08159999999998, 3.4076, 3.00639999999999, 2.38779999999997, 2.61900000000003, 1.99800000000005, 3.34820000000002, 2.95060000000001, 0.990999999999985, 2.11440000000005, 2.20299999999997, 2.82219999999995, 2.73239999999998, 2.7826, 3.76660000000004, 2.26480000000004, 2.31280000000004, 2.40819999999997, 2.75360000000001, 3.33759999999995, 2.71559999999999, 1.7478000000001, 1.42920000000004, 2.39300000000003, 2.22779999999989, 2.34339999999997, 0.87259999999992, 3.88400000000001, 1.80600000000004, 1.91759999999999, 1.16779999999994, 1.50320000000011, 2.52500000000009, 0.226400000000012, 2.31500000000005, 0.930000000000064, 1.25199999999995, 2.14959999999996, 0.0407999999999902, 2.5447999999999, 1.32960000000003, 0.197400000000016, 2.52620000000002, 3.33279999999991, -1.34300000000007, 0.422199999999975, 0.917200000000093, 1.12920000000008, 1.46060000000011, 1.45779999999991, 2.8728000000001, 3.33359999999993, -1.34079999999994, 1.57680000000005, 0.363000000000056, 1.40740000000005, 0.656600000000026, 0.801400000000058, -0.454600000000028, 1.51919999999996},
|
||||
// precision 9
|
||||
{368, 361.8294, 355.2452, 348.6698, 342.1464, 336.2024, 329.8782, 323.6598, 317.462, 311.2826, 305.7102, 299.7416, 293.9366, 288.1046, 282.285, 277.0668, 271.306, 265.8448, 260.301, 254.9886, 250.2422, 244.8138, 239.7074, 234.7428, 229.8402, 225.1664, 220.3534, 215.594, 210.6886, 205.7876, 201.65, 197.228, 192.8036, 188.1666, 184.0818, 180.0824, 176.2574, 172.302, 168.1644, 164.0056, 160.3802, 156.7192, 152.5234, 149.2084, 145.831, 142.485, 139.1112, 135.4764, 131.76, 129.3368, 126.5538, 122.5058, 119.2646, 116.5902, 113.3818, 110.8998, 107.9532, 105.2062, 102.2798, 99.4728, 96.9582, 94.3292, 92.171, 89.7809999999999, 87.5716, 84.7048, 82.5322, 79.875, 78.3972, 75.3464, 73.7274, 71.2834, 70.1444, 68.4263999999999, 66.0166, 64.018, 62.0437999999999, 60.3399999999999, 58.6856, 57.9836, 55.0311999999999, 54.6769999999999, 52.3188, 51.4846, 49.4423999999999, 47.739, 46.1487999999999, 44.9202, 43.4059999999999, 42.5342000000001, 41.2834, 38.8954000000001, 38.3286000000001, 36.2146, 36.6684, 35.9946, 33.123, 33.4338, 31.7378000000001, 29.076, 28.9692, 27.4964, 27.0998, 25.9864, 26.7754, 24.3208, 23.4838, 22.7388000000001, 24.0758000000001, 21.9097999999999, 20.9728, 19.9228000000001, 19.9292, 16.617, 17.05, 18.2996000000001, 15.6128000000001, 15.7392, 14.5174, 13.6322, 12.2583999999999, 13.3766000000001, 11.423, 13.1232, 9.51639999999998, 10.5938000000001, 9.59719999999993, 8.12220000000002, 9.76739999999995, 7.50440000000003, 7.56999999999994, 6.70440000000008, 6.41419999999994, 6.71019999999999, 5.60940000000005, 4.65219999999999, 6.84099999999989, 3.4072000000001, 3.97859999999991, 3.32760000000007, 5.52160000000003, 3.31860000000006, 2.06940000000009, 4.35400000000004, 1.57500000000005, 0.280799999999999, 2.12879999999996, -0.214799999999968, -0.0378000000000611, -0.658200000000079, 0.654800000000023, -0.0697999999999865, 0.858400000000074, -2.52700000000004, -2.1751999999999, -3.35539999999992, -1.04019999999991, -0.651000000000067, -2.14439999999991, -1.96659999999997, -3.97939999999994, -0.604400000000169, -3.08260000000018, -3.39159999999993, -5.29640000000018, -5.38920000000007, -5.08759999999984, -4.69900000000007, -5.23720000000003, -3.15779999999995, -4.97879999999986, -4.89899999999989, -7.48880000000008, -5.94799999999987, -5.68060000000014, -6.67180000000008, -4.70499999999993, -7.27779999999984, -4.6579999999999, -4.4362000000001, -4.32139999999981, -5.18859999999995, -6.66879999999992, -6.48399999999992, -5.1260000000002, -4.4032000000002, -6.13500000000022, -5.80819999999994, -4.16719999999987, -4.15039999999999, -7.45600000000013, -7.24080000000004, -9.83179999999993, -5.80420000000004, -8.6561999999999, -6.99940000000015, -10.5473999999999, -7.34139999999979, -6.80999999999995, -6.29719999999998, -6.23199999999997},
|
||||
// precision 10
|
||||
{737.1256, 724.4234, 711.1064, 698.4732, 685.4636, 673.0644, 660.488, 647.9654, 636.0832, 623.7864, 612.1992, 600.2176, 588.5228, 577.1716, 565.7752, 554.899, 543.6126, 532.6492, 521.9474, 511.5214, 501.1064, 490.6364, 480.2468, 470.4588, 460.3832, 451.0584, 440.8606, 431.3868, 422.5062, 413.1862, 404.463, 395.339, 386.1936, 378.1292, 369.1854, 361.2908, 353.3324, 344.8518, 337.5204, 329.4854, 321.9318, 314.552, 306.4658, 299.4256, 292.849, 286.152, 278.8956, 271.8792, 265.118, 258.62, 252.5132, 245.9322, 239.7726, 233.6086, 227.5332, 222.5918, 216.4294, 210.7662, 205.4106, 199.7338, 194.9012, 188.4486, 183.1556, 178.6338, 173.7312, 169.6264, 163.9526, 159.8742, 155.8326, 151.1966, 147.5594, 143.07, 140.037, 134.1804, 131.071, 127.4884, 124.0848, 120.2944, 117.333, 112.9626, 110.2902, 107.0814, 103.0334, 99.4832000000001, 96.3899999999999, 93.7202000000002, 90.1714000000002, 87.2357999999999, 85.9346, 82.8910000000001, 80.0264000000002, 78.3834000000002, 75.1543999999999, 73.8683999999998, 70.9895999999999, 69.4367999999999, 64.8701999999998, 65.0408000000002, 61.6738, 59.5207999999998, 57.0158000000001, 54.2302, 53.0962, 50.4985999999999, 52.2588000000001, 47.3914, 45.6244000000002, 42.8377999999998, 43.0072, 40.6516000000001, 40.2453999999998, 35.2136, 36.4546, 33.7849999999999, 33.2294000000002, 32.4679999999998, 30.8670000000002, 28.6507999999999, 28.9099999999999, 27.5983999999999, 26.1619999999998, 24.5563999999999, 23.2328000000002, 21.9484000000002, 21.5902000000001, 21.3346000000001, 17.7031999999999, 20.6111999999998, 19.5545999999999, 15.7375999999999, 17.0720000000001, 16.9517999999998, 15.326, 13.1817999999998, 14.6925999999999, 13.0859999999998, 13.2754, 10.8697999999999, 11.248, 7.3768, 4.72339999999986, 7.97899999999981, 8.7503999999999, 7.68119999999999, 9.7199999999998, 7.73919999999998, 5.6224000000002, 7.44560000000001, 6.6601999999998, 5.9058, 4.00199999999995, 4.51699999999983, 4.68240000000014, 3.86220000000003, 5.13639999999987, 5.98500000000013, 2.47719999999981, 2.61999999999989, 1.62800000000016, 4.65000000000009, 0.225599999999758, 0.831000000000131, -0.359400000000278, 1.27599999999984, -2.92559999999958, -0.0303999999996449, 2.37079999999969, -2.0033999999996, 0.804600000000391, 0.30199999999968, 1.1247999999996, -2.6880000000001, 0.0321999999996478, -1.18099999999959, -3.9402, -1.47940000000017, -0.188400000000001, -2.10720000000038, -2.04159999999956, -3.12880000000041, -4.16160000000036, -0.612799999999879, -3.48719999999958, -8.17900000000009, -5.37780000000021, -4.01379999999972, -5.58259999999973, -5.73719999999958, -7.66799999999967, -5.69520000000011, -1.1247999999996, -5.58520000000044, -8.04560000000038, -4.64840000000004, -11.6468000000004, -7.97519999999986, -5.78300000000036, -7.67420000000038, -10.6328000000003, -9.81720000000041},
|
||||
// precision 11
|
||||
{1476, 1449.6014, 1423.5802, 1397.7942, 1372.3042, 1347.2062, 1321.8402, 1297.2292, 1272.9462, 1248.9926, 1225.3026, 1201.4252, 1178.0578, 1155.6092, 1132.626, 1110.5568, 1088.527, 1066.5154, 1045.1874, 1024.3878, 1003.37, 982.1972, 962.5728, 942.1012, 922.9668, 903.292, 884.0772, 864.8578, 846.6562, 828.041, 809.714, 792.3112, 775.1806, 757.9854, 740.656, 724.346, 707.5154, 691.8378, 675.7448, 659.6722, 645.5722, 630.1462, 614.4124, 600.8728, 585.898, 572.408, 558.4926, 544.4938, 531.6776, 517.282, 505.7704, 493.1012, 480.7388, 467.6876, 456.1872, 445.5048, 433.0214, 420.806, 411.409, 400.4144, 389.4294, 379.2286, 369.651, 360.6156, 350.337, 342.083, 332.1538, 322.5094, 315.01, 305.6686, 298.1678, 287.8116, 280.9978, 271.9204, 265.3286, 257.5706, 249.6014, 242.544, 235.5976, 229.583, 220.9438, 214.672, 208.2786, 201.8628, 195.1834, 191.505, 186.1816, 178.5188, 172.2294, 167.8908, 161.0194, 158.052, 151.4588, 148.1596, 143.4344, 138.5238, 133.13, 127.6374, 124.8162, 118.7894, 117.3984, 114.6078, 109.0858, 105.1036, 103.6258, 98.6018000000004, 95.7618000000002, 93.5821999999998, 88.5900000000001, 86.9992000000002, 82.8800000000001, 80.4539999999997, 74.6981999999998, 74.3644000000004, 73.2914000000001, 65.5709999999999, 66.9232000000002, 65.1913999999997, 62.5882000000001, 61.5702000000001, 55.7035999999998, 56.1764000000003, 52.7596000000003, 53.0302000000001, 49.0609999999997, 48.4694, 44.933, 46.0474000000004, 44.7165999999997, 41.9416000000001, 39.9207999999999, 35.6328000000003, 35.5276000000003, 33.1934000000001, 33.2371999999996, 33.3864000000003, 33.9228000000003, 30.2371999999996, 29.1373999999996, 25.2272000000003, 24.2942000000003, 19.8338000000003, 18.9005999999999, 23.0907999999999, 21.8544000000002, 19.5176000000001, 15.4147999999996, 16.9314000000004, 18.6737999999996, 12.9877999999999, 14.3688000000002, 12.0447999999997, 15.5219999999999, 12.5299999999997, 14.5940000000001, 14.3131999999996, 9.45499999999993, 12.9441999999999, 3.91139999999996, 13.1373999999996, 5.44720000000052, 9.82779999999912, 7.87279999999919, 3.67760000000089, 5.46980000000076, 5.55099999999948, 5.65979999999945, 3.89439999999922, 3.1275999999998, 5.65140000000065, 6.3062000000009, 3.90799999999945, 1.87060000000019, 5.17020000000048, 2.46680000000015, 0.770000000000437, -3.72340000000077, 1.16400000000067, 8.05340000000069, 0.135399999999208, 2.15940000000046, 0.766999999999825, 1.0594000000001, 3.15500000000065, -0.287399999999252, 2.37219999999979, -2.86620000000039, -1.63199999999961, -2.22979999999916, -0.15519999999924, -1.46039999999994, -0.262199999999211, -2.34460000000036, -2.8078000000005, -3.22179999999935, -5.60159999999996, -8.42200000000048, -9.43740000000071, 0.161799999999857, -10.4755999999998, -10.0823999999993},
|
||||
// precision 12
|
||||
{2953, 2900.4782, 2848.3568, 2796.3666, 2745.324, 2694.9598, 2644.648, 2595.539, 2546.1474, 2498.2576, 2450.8376, 2403.6076, 2357.451, 2311.38, 2266.4104, 2221.5638, 2176.9676, 2134.193, 2090.838, 2048.8548, 2007.018, 1966.1742, 1925.4482, 1885.1294, 1846.4776, 1807.4044, 1768.8724, 1731.3732, 1693.4304, 1657.5326, 1621.949, 1586.5532, 1551.7256, 1517.6182, 1483.5186, 1450.4528, 1417.865, 1385.7164, 1352.6828, 1322.6708, 1291.8312, 1260.9036, 1231.476, 1201.8652, 1173.6718, 1145.757, 1119.2072, 1092.2828, 1065.0434, 1038.6264, 1014.3192, 988.5746, 965.0816, 940.1176, 917.9796, 894.5576, 871.1858, 849.9144, 827.1142, 805.0818, 783.9664, 763.9096, 742.0816, 724.3962, 706.3454, 688.018, 667.4214, 650.3106, 633.0686, 613.8094, 597.818, 581.4248, 563.834, 547.363, 531.5066, 520.455400000001, 505.583199999999, 488.366, 476.480799999999, 459.7682, 450.0522, 434.328799999999, 423.952799999999, 408.727000000001, 399.079400000001, 387.252200000001, 373.987999999999, 360.852000000001, 351.6394, 339.642, 330.902400000001, 322.661599999999, 311.662200000001, 301.3254, 291.7484, 279.939200000001, 276.7508, 263.215200000001, 254.811400000001, 245.5494, 242.306399999999, 234.8734, 223.787200000001, 217.7156, 212.0196, 200.793, 195.9748, 189.0702, 182.449199999999, 177.2772, 170.2336, 164.741, 158.613600000001, 155.311, 147.5964, 142.837, 137.3724, 132.0162, 130.0424, 121.9804, 120.451800000001, 114.8968, 111.585999999999, 105.933199999999, 101.705, 98.5141999999996, 95.0488000000005, 89.7880000000005, 91.4750000000004, 83.7764000000006, 80.9698000000008, 72.8574000000008, 73.1615999999995, 67.5838000000003, 62.6263999999992, 63.2638000000006, 66.0977999999996, 52.0843999999997, 58.9956000000002, 47.0912000000008, 46.4956000000002, 48.4383999999991, 47.1082000000006, 43.2392, 37.2759999999998, 40.0283999999992, 35.1864000000005, 35.8595999999998, 32.0998, 28.027, 23.6694000000007, 33.8266000000003, 26.3736000000008, 27.2008000000005, 21.3245999999999, 26.4115999999995, 23.4521999999997, 19.5013999999992, 19.8513999999996, 10.7492000000002, 18.6424000000006, 13.1265999999996, 18.2436000000016, 6.71860000000015, 3.39459999999963, 6.33759999999893, 7.76719999999841, 0.813999999998487, 3.82819999999992, 0.826199999999517, 8.07440000000133, -1.59080000000176, 5.01780000000144, 0.455399999998917, -0.24199999999837, 0.174800000000687, -9.07640000000174, -4.20160000000033, -3.77520000000004, -4.75179999999818, -5.3724000000002, -8.90680000000066, -6.10239999999976, -5.74120000000039, -9.95339999999851, -3.86339999999836, -13.7304000000004, -16.2710000000006, -7.51359999999841, -3.30679999999847, -13.1339999999982, -10.0551999999989, -6.72019999999975, -8.59660000000076, -10.9307999999983, -1.8775999999998, -4.82259999999951, -13.7788, -21.6470000000008, -10.6735999999983, -15.7799999999988},
|
||||
// precision 13
|
||||
{5907.5052, 5802.2672, 5697.347, 5593.5794, 5491.2622, 5390.5514, 5290.3376, 5191.6952, 5093.5988, 4997.3552, 4902.5972, 4808.3082, 4715.5646, 4624.109, 4533.8216, 4444.4344, 4356.3802, 4269.2962, 4183.3784, 4098.292, 4014.79, 3932.4574, 3850.6036, 3771.2712, 3691.7708, 3615.099, 3538.1858, 3463.4746, 3388.8496, 3315.6794, 3244.5448, 3173.7516, 3103.3106, 3033.6094, 2966.5642, 2900.794, 2833.7256, 2769.81, 2707.3196, 2644.0778, 2583.9916, 2523.4662, 2464.124, 2406.073, 2347.0362, 2292.1006, 2238.1716, 2182.7514, 2128.4884, 2077.1314, 2025.037, 1975.3756, 1928.933, 1879.311, 1831.0006, 1783.2144, 1738.3096, 1694.5144, 1649.024, 1606.847, 1564.7528, 1525.3168, 1482.5372, 1443.9668, 1406.5074, 1365.867, 1329.2186, 1295.4186, 1257.9716, 1225.339, 1193.2972, 1156.3578, 1125.8686, 1091.187, 1061.4094, 1029.4188, 1000.9126, 972.3272, 944.004199999999, 915.7592, 889.965, 862.834200000001, 840.4254, 812.598399999999, 785.924200000001, 763.050999999999, 741.793799999999, 721.466, 699.040799999999, 677.997200000002, 649.866999999998, 634.911800000002, 609.8694, 591.981599999999, 570.2922, 557.129199999999, 538.3858, 521.872599999999, 502.951400000002, 495.776399999999, 475.171399999999, 459.751, 439.995200000001, 426.708999999999, 413.7016, 402.3868, 387.262599999998, 372.0524, 357.050999999999, 342.5098, 334.849200000001, 322.529399999999, 311.613799999999, 295.848000000002, 289.273000000001, 274.093000000001, 263.329600000001, 251.389599999999, 245.7392, 231.9614, 229.7952, 217.155200000001, 208.9588, 199.016599999999, 190.839199999999, 180.6976, 176.272799999999, 166.976999999999, 162.5252, 151.196400000001, 149.386999999999, 133.981199999998, 130.0586, 130.164000000001, 122.053400000001, 110.7428, 108.1276, 106.232400000001, 100.381600000001, 98.7668000000012, 86.6440000000002, 79.9768000000004, 82.4722000000002, 68.7026000000005, 70.1186000000016, 71.9948000000004, 58.998599999999, 59.0492000000013, 56.9818000000014, 47.5338000000011, 42.9928, 51.1591999999982, 37.2740000000013, 42.7220000000016, 31.3734000000004, 26.8090000000011, 25.8934000000008, 26.5286000000015, 29.5442000000003, 19.3503999999994, 26.0760000000009, 17.9527999999991, 14.8419999999969, 10.4683999999979, 8.65899999999965, 9.86720000000059, 4.34139999999752, -0.907800000000861, -3.32080000000133, -0.936199999996461, -11.9916000000012, -8.87000000000262, -6.33099999999831, -11.3366000000024, -15.9207999999999, -9.34659999999712, -15.5034000000014, -19.2097999999969, -15.357799999998, -28.2235999999975, -30.6898000000001, -19.3271999999997, -25.6083999999973, -24.409599999999, -13.6385999999984, -33.4473999999973, -32.6949999999997, -28.9063999999998, -31.7483999999968, -32.2935999999972, -35.8329999999987, -47.620600000002, -39.0855999999985, -33.1434000000008, -46.1371999999974, -37.5892000000022, -46.8164000000033, -47.3142000000007, -60.2914000000019, -37.7575999999972},
|
||||
// precision 14
|
||||
{11816.475, 11605.0046, 11395.3792, 11188.7504, 10984.1814, 10782.0086, 10582.0072, 10384.503, 10189.178, 9996.2738, 9806.0344, 9617.9798, 9431.394, 9248.7784, 9067.6894, 8889.6824, 8712.9134, 8538.8624, 8368.4944, 8197.7956, 8031.8916, 7866.6316, 7703.733, 7544.5726, 7386.204, 7230.666, 7077.8516, 6926.7886, 6778.6902, 6631.9632, 6487.304, 6346.7486, 6206.4408, 6070.202, 5935.2576, 5799.924, 5671.0324, 5541.9788, 5414.6112, 5290.0274, 5166.723, 5047.6906, 4929.162, 4815.1406, 4699.127, 4588.5606, 4477.7394, 4369.4014, 4264.2728, 4155.9224, 4055.581, 3955.505, 3856.9618, 3761.3828, 3666.9702, 3575.7764, 3482.4132, 3395.0186, 3305.8852, 3221.415, 3138.6024, 3056.296, 2970.4494, 2896.1526, 2816.8008, 2740.2156, 2670.497, 2594.1458, 2527.111, 2460.8168, 2387.5114, 2322.9498, 2260.6752, 2194.2686, 2133.7792, 2074.767, 2015.204, 1959.4226, 1898.6502, 1850.006, 1792.849, 1741.4838, 1687.9778, 1638.1322, 1589.3266, 1543.1394, 1496.8266, 1447.8516, 1402.7354, 1361.9606, 1327.0692, 1285.4106, 1241.8112, 1201.6726, 1161.973, 1130.261, 1094.2036, 1048.2036, 1020.6436, 990.901400000002, 961.199800000002, 924.769800000002, 899.526400000002, 872.346400000002, 834.375, 810.432000000001, 780.659800000001, 756.013800000001, 733.479399999997, 707.923999999999, 673.858, 652.222399999999, 636.572399999997, 615.738599999997, 586.696400000001, 564.147199999999, 541.679600000003, 523.943599999999, 505.714599999999, 475.729599999999, 461.779600000002, 449.750800000002, 439.020799999998, 412.7886, 400.245600000002, 383.188199999997, 362.079599999997, 357.533799999997, 334.319000000003, 327.553399999997, 308.559399999998, 291.270199999999, 279.351999999999, 271.791400000002, 252.576999999997, 247.482400000001, 236.174800000001, 218.774599999997, 220.155200000001, 208.794399999999, 201.223599999998, 182.995600000002, 185.5268, 164.547400000003, 176.5962, 150.689599999998, 157.8004, 138.378799999999, 134.021200000003, 117.614399999999, 108.194000000003, 97.0696000000025, 89.6042000000016, 95.6030000000028, 84.7810000000027, 72.635000000002, 77.3482000000004, 59.4907999999996, 55.5875999999989, 50.7346000000034, 61.3916000000027, 50.9149999999936, 39.0384000000049, 58.9395999999979, 29.633600000001, 28.2032000000036, 26.0078000000067, 17.0387999999948, 9.22000000000116, 13.8387999999977, 8.07240000000456, 14.1549999999988, 15.3570000000036, 3.42660000000615, 6.24820000000182, -2.96940000000177, -8.79940000000352, -5.97860000000219, -14.4048000000039, -3.4143999999942, -13.0148000000045, -11.6977999999945, -25.7878000000055, -22.3185999999987, -24.409599999999, -31.9756000000052, -18.9722000000038, -22.8678000000073, -30.8972000000067, -32.3715999999986, -22.3907999999938, -43.6720000000059, -35.9038, -39.7492000000057, -54.1641999999993, -45.2749999999942, -42.2989999999991, -44.1089999999967, -64.3564000000042, -49.9551999999967, -42.6116000000038},
|
||||
// precision 15
|
||||
{23634.0036, 23210.8034, 22792.4744, 22379.1524, 21969.7928, 21565.326, 21165.3532, 20770.2806, 20379.9892, 19994.7098, 19613.318, 19236.799, 18865.4382, 18498.8244, 18136.5138, 17778.8668, 17426.2344, 17079.32, 16734.778, 16397.2418, 16063.3324, 15734.0232, 15409.731, 15088.728, 14772.9896, 14464.1402, 14157.5588, 13855.5958, 13559.3296, 13264.9096, 12978.326, 12692.0826, 12413.8816, 12137.3192, 11870.2326, 11602.5554, 11340.3142, 11079.613, 10829.5908, 10583.5466, 10334.0344, 10095.5072, 9859.694, 9625.2822, 9395.7862, 9174.0586, 8957.3164, 8738.064, 8524.155, 8313.7396, 8116.9168, 7913.542, 7718.4778, 7521.65, 7335.5596, 7154.2906, 6968.7396, 6786.3996, 6613.236, 6437.406, 6270.6598, 6107.7958, 5945.7174, 5787.6784, 5635.5784, 5482.308, 5337.9784, 5190.0864, 5045.9158, 4919.1386, 4771.817, 4645.7742, 4518.4774, 4385.5454, 4262.6622, 4142.74679999999, 4015.5318, 3897.9276, 3790.7764, 3685.13800000001, 3573.6274, 3467.9706, 3368.61079999999, 3271.5202, 3170.3848, 3076.4656, 2982.38400000001, 2888.4664, 2806.4868, 2711.9564, 2634.1434, 2551.3204, 2469.7662, 2396.61139999999, 2318.9902, 2243.8658, 2171.9246, 2105.01360000001, 2028.8536, 1960.9952, 1901.4096, 1841.86079999999, 1777.54700000001, 1714.5802, 1654.65059999999, 1596.311, 1546.2016, 1492.3296, 1433.8974, 1383.84600000001, 1339.4152, 1293.5518, 1245.8686, 1193.50659999999, 1162.27959999999, 1107.19439999999, 1069.18060000001, 1035.09179999999, 999.679000000004, 957.679999999993, 925.300199999998, 888.099400000006, 848.638600000006, 818.156400000007, 796.748399999997, 752.139200000005, 725.271200000003, 692.216, 671.633600000001, 647.939799999993, 621.670599999998, 575.398799999995, 561.226599999995, 532.237999999998, 521.787599999996, 483.095799999996, 467.049599999998, 465.286399999997, 415.548599999995, 401.047399999996, 380.607999999993, 377.362599999993, 347.258799999996, 338.371599999999, 310.096999999994, 301.409199999995, 276.280799999993, 265.586800000005, 258.994399999996, 223.915999999997, 215.925399999993, 213.503800000006, 191.045400000003, 166.718200000003, 166.259000000005, 162.941200000001, 148.829400000002, 141.645999999993, 123.535399999993, 122.329800000007, 89.473399999988, 80.1962000000058, 77.5457999999926, 59.1056000000099, 83.3509999999951, 52.2906000000075, 36.3979999999865, 40.6558000000077, 42.0003999999899, 19.6630000000005, 19.7153999999864, -8.38539999999921, -0.692799999989802, 0.854800000000978, 3.23219999999856, -3.89040000000386, -5.25880000001052, -24.9052000000083, -22.6837999999989, -26.4286000000138, -34.997000000003, -37.0216000000073, -43.430400000012, -58.2390000000014, -68.8034000000043, -56.9245999999985, -57.8583999999973, -77.3097999999882, -73.2793999999994, -81.0738000000129, -87.4530000000086, -65.0254000000132, -57.296399999992, -96.2746000000043, -103.25, -96.081600000005, -91.5542000000132, -102.465200000006, -107.688599999994, -101.458000000013, -109.715800000005},
|
||||
// precision 16
|
||||
{47270, 46423.3584, 45585.7074, 44757.152, 43938.8416, 43130.9514, 42330.03, 41540.407, 40759.6348, 39988.206, 39226.5144, 38473.2096, 37729.795, 36997.268, 36272.6448, 35558.665, 34853.0248, 34157.4472, 33470.5204, 32793.5742, 32127.0194, 31469.4182, 30817.6136, 30178.6968, 29546.8908, 28922.8544, 28312.271, 27707.0924, 27114.0326, 26526.692, 25948.6336, 25383.7826, 24823.5998, 24272.2974, 23732.2572, 23201.4976, 22674.2796, 22163.6336, 21656.515, 21161.7362, 20669.9368, 20189.4424, 19717.3358, 19256.3744, 18795.9638, 18352.197, 17908.5738, 17474.391, 17052.918, 16637.2236, 16228.4602, 15823.3474, 15428.6974, 15043.0284, 14667.6278, 14297.4588, 13935.2882, 13578.5402, 13234.6032, 12882.1578, 12548.0728, 12219.231, 11898.0072, 11587.2626, 11279.9072, 10973.5048, 10678.5186, 10392.4876, 10105.2556, 9825.766, 9562.5444, 9294.2222, 9038.2352, 8784.848, 8533.2644, 8301.7776, 8058.30859999999, 7822.94579999999, 7599.11319999999, 7366.90779999999, 7161.217, 6957.53080000001, 6736.212, 6548.21220000001, 6343.06839999999, 6156.28719999999, 5975.15419999999, 5791.75719999999, 5621.32019999999, 5451.66, 5287.61040000001, 5118.09479999999, 4957.288, 4798.4246, 4662.17559999999, 4512.05900000001, 4364.68539999999, 4220.77720000001, 4082.67259999999, 3957.19519999999, 3842.15779999999, 3699.3328, 3583.01180000001, 3473.8964, 3338.66639999999, 3233.55559999999, 3117.799, 3008.111, 2909.69140000001, 2814.86499999999, 2719.46119999999, 2624.742, 2532.46979999999, 2444.7886, 2370.1868, 2272.45259999999, 2196.19260000001, 2117.90419999999, 2023.2972, 1969.76819999999, 1885.58979999999, 1833.2824, 1733.91200000001, 1682.54920000001, 1604.57980000001, 1556.11240000001, 1491.3064, 1421.71960000001, 1371.22899999999, 1322.1324, 1264.7892, 1196.23920000001, 1143.8474, 1088.67240000001, 1073.60380000001, 1023.11660000001, 959.036400000012, 927.433199999999, 906.792799999996, 853.433599999989, 841.873800000001, 791.1054, 756.899999999994, 704.343200000003, 672.495599999995, 622.790399999998, 611.254799999995, 567.283200000005, 519.406599999988, 519.188400000014, 495.312800000014, 451.350799999986, 443.973399999988, 431.882199999993, 392.027000000002, 380.924200000009, 345.128999999986, 298.901400000002, 287.771999999997, 272.625, 247.253000000026, 222.490600000019, 223.590000000026, 196.407599999977, 176.425999999978, 134.725199999986, 132.4804, 110.445599999977, 86.7939999999944, 56.7038000000175, 64.915399999998, 38.3726000000024, 37.1606000000029, 46.170999999973, 49.1716000000015, 15.3362000000197, 6.71639999997569, -34.8185999999987, -39.4476000000141, 12.6830000000191, -12.3331999999937, -50.6565999999875, -59.9538000000175, -65.1054000000004, -70.7576000000117, -106.325200000021, -126.852200000023, -110.227599999984, -132.885999999999, -113.897200000007, -142.713800000027, -151.145399999979, -150.799200000009, -177.756200000003, -156.036399999983, -182.735199999996, -177.259399999981, -198.663600000029, -174.577600000019, -193.84580000001},
|
||||
// precision 17
|
||||
{94541, 92848.811, 91174.019, 89517.558, 87879.9705, 86262.7565, 84663.5125, 83083.7435, 81521.7865, 79977.272, 78455.9465, 76950.219, 75465.432, 73994.152, 72546.71, 71115.2345, 69705.6765, 68314.937, 66944.2705, 65591.255, 64252.9485, 62938.016, 61636.8225, 60355.592, 59092.789, 57850.568, 56624.518, 55417.343, 54231.1415, 53067.387, 51903.526, 50774.649, 49657.6415, 48561.05, 47475.7575, 46410.159, 45364.852, 44327.053, 43318.4005, 42325.6165, 41348.4595, 40383.6265, 39436.77, 38509.502, 37594.035, 36695.939, 35818.6895, 34955.691, 34115.8095, 33293.949, 32465.0775, 31657.6715, 30877.2585, 30093.78, 29351.3695, 28594.1365, 27872.115, 27168.7465, 26477.076, 25774.541, 25106.5375, 24452.5135, 23815.5125, 23174.0655, 22555.2685, 21960.2065, 21376.3555, 20785.1925, 20211.517, 19657.0725, 19141.6865, 18579.737, 18081.3955, 17578.995, 17073.44, 16608.335, 16119.911, 15651.266, 15194.583, 14749.0495, 14343.4835, 13925.639, 13504.509, 13099.3885, 12691.2855, 12328.018, 11969.0345, 11596.5145, 11245.6355, 10917.6575, 10580.9785, 10277.8605, 9926.58100000001, 9605.538, 9300.42950000003, 8989.97850000003, 8728.73249999998, 8448.3235, 8175.31050000002, 7898.98700000002, 7629.79100000003, 7413.76199999999, 7149.92300000001, 6921.12650000001, 6677.1545, 6443.28000000003, 6278.23450000002, 6014.20049999998, 5791.20299999998, 5605.78450000001, 5438.48800000001, 5234.2255, 5059.6825, 4887.43349999998, 4682.935, 4496.31099999999, 4322.52250000002, 4191.42499999999, 4021.24200000003, 3900.64799999999, 3762.84250000003, 3609.98050000001, 3502.29599999997, 3363.84250000003, 3206.54849999998, 3079.70000000001, 2971.42300000001, 2867.80349999998, 2727.08100000001, 2630.74900000001, 2496.6165, 2440.902, 2356.19150000002, 2235.58199999999, 2120.54149999999, 2012.25449999998, 1933.35600000003, 1820.93099999998, 1761.54800000001, 1663.09350000002, 1578.84600000002, 1509.48149999999, 1427.3345, 1379.56150000001, 1306.68099999998, 1212.63449999999, 1084.17300000001, 1124.16450000001, 1060.69949999999, 1007.48849999998, 941.194499999983, 879.880500000028, 836.007500000007, 782.802000000025, 748.385499999975, 647.991500000004, 626.730500000005, 570.776000000013, 484.000500000024, 513.98550000001, 418.985499999952, 386.996999999974, 370.026500000036, 355.496999999974, 356.731499999994, 255.92200000002, 259.094000000041, 205.434499999974, 165.374500000034, 197.347500000033, 95.718499999959, 67.6165000000037, 54.6970000000438, 31.7395000000251, -15.8784999999916, 8.42500000004657, -26.3754999999655, -118.425500000012, -66.6629999999423, -42.9745000000112, -107.364999999991, -189.839000000036, -162.611499999999, -164.964999999967, -189.079999999958, -223.931499999948, -235.329999999958, -269.639500000048, -249.087999999989, -206.475499999942, -283.04449999996, -290.667000000016, -304.561499999953, -336.784499999951, -380.386500000022, -283.280499999993, -364.533000000054, -389.059499999974, -364.454000000027, -415.748000000021, -417.155000000028},
|
||||
// precision 18
|
||||
{189083, 185696.913, 182348.774, 179035.946, 175762.762, 172526.444, 169329.754, 166166.099, 163043.269, 159958.91, 156907.912, 153906.845, 150924.199, 147996.568, 145093.457, 142239.233, 139421.475, 136632.27, 133889.588, 131174.2, 128511.619, 125868.621, 123265.385, 120721.061, 118181.769, 115709.456, 113252.446, 110840.198, 108465.099, 106126.164, 103823.469, 101556.618, 99308.004, 97124.508, 94937.803, 92833.731, 90745.061, 88677.627, 86617.47, 84650.442, 82697.833, 80769.132, 78879.629, 77014.432, 75215.626, 73384.587, 71652.482, 69895.93, 68209.301, 66553.669, 64921.981, 63310.323, 61742.115, 60205.018, 58698.658, 57190.657, 55760.865, 54331.169, 52908.167, 51550.273, 50225.254, 48922.421, 47614.533, 46362.049, 45098.569, 43926.083, 42736.03, 41593.473, 40425.26, 39316.237, 38243.651, 37170.617, 36114.609, 35084.19, 34117.233, 33206.509, 32231.505, 31318.728, 30403.404, 29540.0550000001, 28679.236, 27825.862, 26965.216, 26179.148, 25462.08, 24645.952, 23922.523, 23198.144, 22529.128, 21762.4179999999, 21134.779, 20459.117, 19840.818, 19187.04, 18636.3689999999, 17982.831, 17439.7389999999, 16874.547, 16358.2169999999, 15835.684, 15352.914, 14823.681, 14329.313, 13816.897, 13342.874, 12880.882, 12491.648, 12021.254, 11625.392, 11293.7610000001, 10813.697, 10456.209, 10099.074, 9755.39000000001, 9393.18500000006, 9047.57900000003, 8657.98499999999, 8395.85900000005, 8033, 7736.95900000003, 7430.59699999995, 7258.47699999996, 6924.58200000005, 6691.29399999999, 6357.92500000005, 6202.05700000003, 5921.19700000004, 5628.28399999999, 5404.96799999999, 5226.71100000001, 4990.75600000005, 4799.77399999998, 4622.93099999998, 4472.478, 4171.78700000001, 3957.46299999999, 3868.95200000005, 3691.14300000004, 3474.63100000005, 3341.67200000002, 3109.14000000001, 3071.97400000005, 2796.40399999998, 2756.17799999996, 2611.46999999997, 2471.93000000005, 2382.26399999997, 2209.22400000005, 2142.28399999999, 2013.96100000001, 1911.18999999994, 1818.27099999995, 1668.47900000005, 1519.65800000005, 1469.67599999998, 1367.13800000004, 1248.52899999998, 1181.23600000003, 1022.71900000004, 1088.20700000005, 959.03600000008, 876.095999999903, 791.183999999892, 703.337000000058, 731.949999999953, 586.86400000006, 526.024999999907, 323.004999999888, 320.448000000091, 340.672999999952, 309.638999999966, 216.601999999955, 102.922999999952, 19.2399999999907, -0.114000000059605, -32.6240000000689, -89.3179999999702, -153.497999999905, -64.2970000000205, -143.695999999996, -259.497999999905, -253.017999999924, -213.948000000091, -397.590000000084, -434.006000000052, -403.475000000093, -297.958000000101, -404.317000000039, -528.898999999976, -506.621000000043, -513.205000000075, -479.351000000024, -596.139999999898, -527.016999999993, -664.681000000099, -680.306000000099, -704.050000000047, -850.486000000034, -757.43200000003, -713.308999999892},
|
||||
}
|
||||
|
||||
// Threshold describes the point at which HLL++ will use linear counting to
|
||||
// determine the cardinality.
|
||||
var threshold = []float64{
|
||||
10.0, // precision 4
|
||||
20.0, // precision 5
|
||||
40.0, // precision 6
|
||||
80.0, // precision 7
|
||||
220.0, // precision 8
|
||||
400.0, // precision 9
|
||||
900.0, // precision 10
|
||||
1800.0, // precision 11
|
||||
3100.0, // precision 12
|
||||
6500.0, // precision 13
|
||||
11500.0, // precision 14
|
||||
20000.0, // precision 15
|
||||
50000.0, // precision 16
|
||||
120000.0, // precision 17
|
||||
350000.0, // precision 18
|
||||
}
|
509
vendor/github.com/influxdata/influxdb/pkg/estimator/hll/hll.go
generated
vendored
Normal file
509
vendor/github.com/influxdata/influxdb/pkg/estimator/hll/hll.go
generated
vendored
Normal file
@@ -0,0 +1,509 @@
|
||||
// Package hll contains a HyperLogLog++ implementation that is adapted (mostly
|
||||
// copied) from an implementation provided by Clark DuVall
|
||||
// github.com/clarkduvall/hyperloglog.
|
||||
//
|
||||
// The differences are that the implementation in this package:
|
||||
//
|
||||
// * uses an AMD64 optimised xxhash algorithm instead of murmur;
|
||||
// * uses some AMD64 optimisations for things like clz;
|
||||
// * works with []byte rather than a Hash64 interface, to reduce allocations;
|
||||
// * implements encoding.BinaryMarshaler and encoding.BinaryUnmarshaler
|
||||
//
|
||||
// Based on some rough benchmarking, this implementation of HyperLogLog++ is
|
||||
// around twice as fast as the github.com/clarkduvall/hyperloglog implementation.
|
||||
package hll
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
"math"
|
||||
"sort"
|
||||
|
||||
"github.com/cespare/xxhash"
|
||||
"github.com/dgryski/go-bits"
|
||||
"github.com/influxdata/influxdb/pkg/estimator"
|
||||
)
|
||||
|
||||
// Current version of HLL implementation.
|
||||
const version uint8 = 1
|
||||
|
||||
// DefaultPrecision is the default precision.
|
||||
const DefaultPrecision = 16
|
||||
|
||||
// Plus implements the Hyperloglog++ algorithm, described in the following
|
||||
// paper: http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/40671.pdf
|
||||
//
|
||||
// The HyperLogLog++ algorithm provides cardinality estimations.
|
||||
type Plus struct {
|
||||
// hash function used to hash values to add to the sketch.
|
||||
hash func([]byte) uint64
|
||||
|
||||
p uint8 // precision.
|
||||
pp uint8 // p' (sparse) precision to be used when p ∈ [4..pp] and pp < 64.
|
||||
|
||||
m uint32 // Number of substream used for stochastic averaging of stream.
|
||||
mp uint32 // m' (sparse) number of substreams.
|
||||
|
||||
alpha float64 // alpha is used for bias correction.
|
||||
|
||||
sparse bool // Should we use a sparse sketch representation.
|
||||
tmpSet set
|
||||
|
||||
denseList []uint8 // The dense representation of the HLL.
|
||||
sparseList *compressedList // values that can be stored in the sparse represenation.
|
||||
}
|
||||
|
||||
// NewPlus returns a new Plus with precision p. p must be between 4 and 18.
|
||||
func NewPlus(p uint8) (*Plus, error) {
|
||||
if p > 18 || p < 4 {
|
||||
return nil, errors.New("precision must be between 4 and 18")
|
||||
}
|
||||
|
||||
// p' = 25 is used in the Google paper.
|
||||
pp := uint8(25)
|
||||
|
||||
hll := &Plus{
|
||||
hash: xxhash.Sum64,
|
||||
p: p,
|
||||
pp: pp,
|
||||
m: 1 << p,
|
||||
mp: 1 << pp,
|
||||
tmpSet: set{},
|
||||
sparse: true,
|
||||
}
|
||||
hll.sparseList = newCompressedList(int(hll.m))
|
||||
|
||||
// Determine alpha.
|
||||
switch hll.m {
|
||||
case 16:
|
||||
hll.alpha = 0.673
|
||||
case 32:
|
||||
hll.alpha = 0.697
|
||||
case 64:
|
||||
hll.alpha = 0.709
|
||||
default:
|
||||
hll.alpha = 0.7213 / (1 + 1.079/float64(hll.m))
|
||||
}
|
||||
|
||||
return hll, nil
|
||||
}
|
||||
|
||||
// NewDefaultPlus creates a new Plus with the default precision.
|
||||
func NewDefaultPlus() *Plus {
|
||||
p, err := NewPlus(DefaultPrecision)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return p
|
||||
}
|
||||
|
||||
// MustNewPlus returns a new Plus with precision p. Panic on error.
|
||||
func MustNewPlus(p uint8) *Plus {
|
||||
hll, err := NewPlus(p)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return hll
|
||||
}
|
||||
|
||||
// Clone returns a deep copy of h.
|
||||
func (h *Plus) Clone() *Plus {
|
||||
var hll = &Plus{
|
||||
hash: h.hash,
|
||||
p: h.p,
|
||||
pp: h.pp,
|
||||
m: h.m,
|
||||
mp: h.mp,
|
||||
alpha: h.alpha,
|
||||
sparse: h.sparse,
|
||||
tmpSet: h.tmpSet.Clone(),
|
||||
sparseList: h.sparseList.Clone(),
|
||||
}
|
||||
|
||||
hll.denseList = make([]uint8, len(h.denseList))
|
||||
copy(hll.denseList, h.denseList)
|
||||
return hll
|
||||
}
|
||||
|
||||
// Add adds a new value to the HLL.
|
||||
func (h *Plus) Add(v []byte) {
|
||||
x := h.hash(v)
|
||||
if h.sparse {
|
||||
h.tmpSet.add(h.encodeHash(x))
|
||||
|
||||
if uint32(len(h.tmpSet))*100 > h.m {
|
||||
h.mergeSparse()
|
||||
if uint32(h.sparseList.Len()) > h.m {
|
||||
h.toNormal()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
i := bextr(x, 64-h.p, h.p) // {x63,...,x64-p}
|
||||
w := x<<h.p | 1<<(h.p-1) // {x63-p,...,x0}
|
||||
|
||||
rho := uint8(bits.Clz(w)) + 1
|
||||
if rho > h.denseList[i] {
|
||||
h.denseList[i] = rho
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Count returns a cardinality estimate.
|
||||
func (h *Plus) Count() uint64 {
|
||||
if h.sparse {
|
||||
h.mergeSparse()
|
||||
return uint64(h.linearCount(h.mp, h.mp-uint32(h.sparseList.count)))
|
||||
}
|
||||
|
||||
est, zeros := h.e()
|
||||
if est <= 5.0*float64(h.m) {
|
||||
est -= h.estimateBias(est)
|
||||
}
|
||||
|
||||
if zeros > 0 {
|
||||
lc := h.linearCount(h.m, zeros)
|
||||
if lc <= threshold[h.p-4] {
|
||||
return uint64(lc)
|
||||
}
|
||||
}
|
||||
return uint64(est)
|
||||
}
|
||||
|
||||
// Merge takes another HyperLogLogPlus and combines it with HyperLogLogPlus h.
|
||||
// If HyperLogLogPlus h is using the sparse representation, it will be converted
|
||||
// to the normal representation.
|
||||
func (h *Plus) Merge(s estimator.Sketch) error {
|
||||
if s == nil {
|
||||
// Nothing to do
|
||||
return nil
|
||||
}
|
||||
|
||||
other, ok := s.(*Plus)
|
||||
if !ok {
|
||||
return fmt.Errorf("wrong type for merging: %T", other)
|
||||
}
|
||||
|
||||
if h.p != other.p {
|
||||
return errors.New("precisions must be equal")
|
||||
}
|
||||
|
||||
if h.sparse {
|
||||
h.toNormal()
|
||||
}
|
||||
|
||||
if other.sparse {
|
||||
for k := range other.tmpSet {
|
||||
i, r := other.decodeHash(k)
|
||||
if h.denseList[i] < r {
|
||||
h.denseList[i] = r
|
||||
}
|
||||
}
|
||||
|
||||
for iter := other.sparseList.Iter(); iter.HasNext(); {
|
||||
i, r := other.decodeHash(iter.Next())
|
||||
if h.denseList[i] < r {
|
||||
h.denseList[i] = r
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for i, v := range other.denseList {
|
||||
if v > h.denseList[i] {
|
||||
h.denseList[i] = v
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// MarshalBinary implements the encoding.BinaryMarshaler interface.
|
||||
func (h *Plus) MarshalBinary() (data []byte, err error) {
|
||||
// Marshal a version marker.
|
||||
data = append(data, version)
|
||||
|
||||
// Marshal precision.
|
||||
data = append(data, byte(h.p))
|
||||
|
||||
if h.sparse {
|
||||
// It's using the sparse representation.
|
||||
data = append(data, byte(1))
|
||||
|
||||
// Add the tmp_set
|
||||
tsdata, err := h.tmpSet.MarshalBinary()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
data = append(data, tsdata...)
|
||||
|
||||
// Add the sparse representation
|
||||
sdata, err := h.sparseList.MarshalBinary()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return append(data, sdata...), nil
|
||||
}
|
||||
|
||||
// It's using the dense representation.
|
||||
data = append(data, byte(0))
|
||||
|
||||
// Add the dense sketch representation.
|
||||
sz := len(h.denseList)
|
||||
data = append(data, []byte{
|
||||
byte(sz >> 24),
|
||||
byte(sz >> 16),
|
||||
byte(sz >> 8),
|
||||
byte(sz),
|
||||
}...)
|
||||
|
||||
// Marshal each element in the list.
|
||||
for i := 0; i < len(h.denseList); i++ {
|
||||
data = append(data, byte(h.denseList[i]))
|
||||
}
|
||||
|
||||
return data, nil
|
||||
}
|
||||
|
||||
// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface.
|
||||
func (h *Plus) UnmarshalBinary(data []byte) error {
|
||||
// Unmarshal version. We may need this in the future if we make
|
||||
// non-compatible changes.
|
||||
_ = data[0]
|
||||
|
||||
// Unmarshal precision.
|
||||
p := uint8(data[1])
|
||||
|
||||
newh, err := NewPlus(p)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
*h = *newh
|
||||
|
||||
// h is now initialised with the correct precision. We just need to fill the
|
||||
// rest of the details out.
|
||||
if data[2] == byte(1) {
|
||||
// Using the sparse representation.
|
||||
h.sparse = true
|
||||
|
||||
// Unmarshal the tmp_set.
|
||||
tssz := binary.BigEndian.Uint32(data[3:7])
|
||||
h.tmpSet = make(map[uint32]struct{}, tssz)
|
||||
|
||||
// We need to unmarshal tssz values in total, and each value requires us
|
||||
// to read 4 bytes.
|
||||
tsLastByte := int((tssz * 4) + 7)
|
||||
for i := 7; i < tsLastByte; i += 4 {
|
||||
k := binary.BigEndian.Uint32(data[i : i+4])
|
||||
h.tmpSet[k] = struct{}{}
|
||||
}
|
||||
|
||||
// Unmarshal the sparse representation.
|
||||
return h.sparseList.UnmarshalBinary(data[tsLastByte:])
|
||||
}
|
||||
|
||||
// Using the dense representation.
|
||||
h.sparse = false
|
||||
dsz := int(binary.BigEndian.Uint32(data[3:7]))
|
||||
h.denseList = make([]uint8, 0, dsz)
|
||||
for i := 7; i < dsz+7; i++ {
|
||||
h.denseList = append(h.denseList, uint8(data[i]))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *Plus) mergeSparse() {
|
||||
if len(h.tmpSet) == 0 {
|
||||
return
|
||||
}
|
||||
keys := make(uint64Slice, 0, len(h.tmpSet))
|
||||
for k := range h.tmpSet {
|
||||
keys = append(keys, k)
|
||||
}
|
||||
sort.Sort(keys)
|
||||
|
||||
newList := newCompressedList(int(h.m))
|
||||
for iter, i := h.sparseList.Iter(), 0; iter.HasNext() || i < len(keys); {
|
||||
if !iter.HasNext() {
|
||||
newList.Append(keys[i])
|
||||
i++
|
||||
continue
|
||||
}
|
||||
|
||||
if i >= len(keys) {
|
||||
newList.Append(iter.Next())
|
||||
continue
|
||||
}
|
||||
|
||||
x1, x2 := iter.Peek(), keys[i]
|
||||
if x1 == x2 {
|
||||
newList.Append(iter.Next())
|
||||
i++
|
||||
} else if x1 > x2 {
|
||||
newList.Append(x2)
|
||||
i++
|
||||
} else {
|
||||
newList.Append(iter.Next())
|
||||
}
|
||||
}
|
||||
|
||||
h.sparseList = newList
|
||||
h.tmpSet = set{}
|
||||
}
|
||||
|
||||
// Convert from sparse representation to dense representation.
|
||||
func (h *Plus) toNormal() {
|
||||
if len(h.tmpSet) > 0 {
|
||||
h.mergeSparse()
|
||||
}
|
||||
|
||||
h.denseList = make([]uint8, h.m)
|
||||
for iter := h.sparseList.Iter(); iter.HasNext(); {
|
||||
i, r := h.decodeHash(iter.Next())
|
||||
if h.denseList[i] < r {
|
||||
h.denseList[i] = r
|
||||
}
|
||||
}
|
||||
|
||||
h.sparse = false
|
||||
h.tmpSet = nil
|
||||
h.sparseList = nil
|
||||
}
|
||||
|
||||
// Encode a hash to be used in the sparse representation.
|
||||
func (h *Plus) encodeHash(x uint64) uint32 {
|
||||
idx := uint32(bextr(x, 64-h.pp, h.pp))
|
||||
if bextr(x, 64-h.pp, h.pp-h.p) == 0 {
|
||||
zeros := bits.Clz((bextr(x, 0, 64-h.pp)<<h.pp)|(1<<h.pp-1)) + 1
|
||||
return idx<<7 | uint32(zeros<<1) | 1
|
||||
}
|
||||
return idx << 1
|
||||
}
|
||||
|
||||
// Decode a hash from the sparse representation.
|
||||
func (h *Plus) decodeHash(k uint32) (uint32, uint8) {
|
||||
var r uint8
|
||||
if k&1 == 1 {
|
||||
r = uint8(bextr32(k, 1, 6)) + h.pp - h.p
|
||||
} else {
|
||||
// We can use the 64bit clz implementation and reduce the result
|
||||
// by 32 to get a clz for a 32bit word.
|
||||
r = uint8(bits.Clz(uint64(k<<(32-h.pp+h.p-1))) - 31) // -32 + 1
|
||||
}
|
||||
return h.getIndex(k), r
|
||||
}
|
||||
|
||||
func (h *Plus) getIndex(k uint32) uint32 {
|
||||
if k&1 == 1 {
|
||||
return bextr32(k, 32-h.p, h.p)
|
||||
}
|
||||
return bextr32(k, h.pp-h.p+1, h.p)
|
||||
}
|
||||
|
||||
func (h *Plus) linearCount(m uint32, v uint32) float64 {
|
||||
fm := float64(m)
|
||||
return fm * math.Log(fm/float64(v))
|
||||
}
|
||||
|
||||
// E calculates the raw estimate. It also returns the number of zero registers
|
||||
// which is useful for later on in a cardinality estimate.
|
||||
func (h *Plus) e() (float64, uint32) {
|
||||
sum := 0.0
|
||||
var count uint32
|
||||
for _, val := range h.denseList {
|
||||
sum += 1.0 / float64(uint32(1)<<val)
|
||||
if val == 0 {
|
||||
count++
|
||||
}
|
||||
}
|
||||
return h.alpha * float64(h.m) * float64(h.m) / sum, count
|
||||
}
|
||||
|
||||
// Estimates the bias using empirically determined values.
|
||||
func (h *Plus) estimateBias(est float64) float64 {
|
||||
estTable, biasTable := rawEstimateData[h.p-4], biasData[h.p-4]
|
||||
|
||||
if estTable[0] > est {
|
||||
return estTable[0] - biasTable[0]
|
||||
}
|
||||
|
||||
lastEstimate := estTable[len(estTable)-1]
|
||||
if lastEstimate < est {
|
||||
return lastEstimate - biasTable[len(biasTable)-1]
|
||||
}
|
||||
|
||||
var i int
|
||||
for i = 0; i < len(estTable) && estTable[i] < est; i++ {
|
||||
}
|
||||
|
||||
e1, b1 := estTable[i-1], biasTable[i-1]
|
||||
e2, b2 := estTable[i], biasTable[i]
|
||||
|
||||
c := (est - e1) / (e2 - e1)
|
||||
return b1*(1-c) + b2*c
|
||||
}
|
||||
|
||||
type uint64Slice []uint32
|
||||
|
||||
func (p uint64Slice) Len() int { return len(p) }
|
||||
func (p uint64Slice) Less(i, j int) bool { return p[i] < p[j] }
|
||||
func (p uint64Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
||||
|
||||
type set map[uint32]struct{}
|
||||
|
||||
func (s set) Clone() set {
|
||||
if s == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
newS := make(map[uint32]struct{}, len(s))
|
||||
for k, v := range s {
|
||||
newS[k] = v
|
||||
}
|
||||
return newS
|
||||
}
|
||||
|
||||
func (s set) MarshalBinary() (data []byte, err error) {
|
||||
// 4 bytes for the size of the set, and 4 bytes for each key.
|
||||
// list.
|
||||
data = make([]byte, 0, 4+(4*len(s)))
|
||||
|
||||
// Length of the set. We only need 32 bits because the size of the set
|
||||
// couldn't exceed that on 32 bit architectures.
|
||||
sl := len(s)
|
||||
data = append(data, []byte{
|
||||
byte(sl >> 24),
|
||||
byte(sl >> 16),
|
||||
byte(sl >> 8),
|
||||
byte(sl),
|
||||
}...)
|
||||
|
||||
// Marshal each element in the set.
|
||||
for k := range s {
|
||||
data = append(data, []byte{
|
||||
byte(k >> 24),
|
||||
byte(k >> 16),
|
||||
byte(k >> 8),
|
||||
byte(k),
|
||||
}...)
|
||||
}
|
||||
|
||||
return data, nil
|
||||
}
|
||||
|
||||
func (s set) add(v uint32) { s[v] = struct{}{} }
|
||||
func (s set) has(v uint32) bool { _, ok := s[v]; return ok }
|
||||
|
||||
// bextr performs a bitfield extract on v. start should be the LSB of the field
|
||||
// you wish to extract, and length the number of bits to extract.
|
||||
//
|
||||
// For example: start=0 and length=4 for the following 64-bit word would result
|
||||
// in 1111 being returned.
|
||||
//
|
||||
// <snip 56 bits>00011110
|
||||
// returns 1110
|
||||
func bextr(v uint64, start, length uint8) uint64 {
|
||||
return (v >> start) & ((1 << length) - 1)
|
||||
}
|
||||
|
||||
func bextr32(v uint32, start, length uint8) uint32 {
|
||||
return (v >> start) & ((1 << length) - 1)
|
||||
}
|
649
vendor/github.com/influxdata/influxdb/pkg/estimator/hll/hll_test.go
generated
vendored
Normal file
649
vendor/github.com/influxdata/influxdb/pkg/estimator/hll/hll_test.go
generated
vendored
Normal file
@@ -0,0 +1,649 @@
|
||||
package hll
|
||||
|
||||
import (
|
||||
crand "crypto/rand"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"math"
|
||||
"math/rand"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/davecgh/go-spew/spew"
|
||||
)
|
||||
|
||||
func nopHash(buf []byte) uint64 {
|
||||
if len(buf) != 8 {
|
||||
panic(fmt.Sprintf("unexpected size buffer: %d", len(buf)))
|
||||
}
|
||||
return binary.BigEndian.Uint64(buf)
|
||||
}
|
||||
|
||||
func toByte(v uint64) []byte {
|
||||
var buf [8]byte
|
||||
binary.BigEndian.PutUint64(buf[:], v)
|
||||
return buf[:]
|
||||
}
|
||||
|
||||
func TestHLLPP_Add_NoSparse(t *testing.T) {
|
||||
h := NewTestPlus(16)
|
||||
h.toNormal()
|
||||
|
||||
h.Add(toByte(0x00010fffffffffff))
|
||||
n := h.denseList[1]
|
||||
if n != 5 {
|
||||
t.Error(n)
|
||||
}
|
||||
|
||||
h.Add(toByte(0x0002ffffffffffff))
|
||||
n = h.denseList[2]
|
||||
if n != 1 {
|
||||
t.Error(n)
|
||||
}
|
||||
|
||||
h.Add(toByte(0x0003000000000000))
|
||||
n = h.denseList[3]
|
||||
if n != 49 {
|
||||
t.Error(n)
|
||||
}
|
||||
|
||||
h.Add(toByte(0x0003000000000001))
|
||||
n = h.denseList[3]
|
||||
if n != 49 {
|
||||
t.Error(n)
|
||||
}
|
||||
|
||||
h.Add(toByte(0xff03700000000000))
|
||||
n = h.denseList[0xff03]
|
||||
if n != 2 {
|
||||
t.Error(n)
|
||||
}
|
||||
|
||||
h.Add(toByte(0xff03080000000000))
|
||||
n = h.denseList[0xff03]
|
||||
if n != 5 {
|
||||
t.Error(n)
|
||||
}
|
||||
}
|
||||
|
||||
func TestHLLPPPrecision_NoSparse(t *testing.T) {
|
||||
h := NewTestPlus(4)
|
||||
h.toNormal()
|
||||
|
||||
h.Add(toByte(0x1fffffffffffffff))
|
||||
n := h.denseList[1]
|
||||
if n != 1 {
|
||||
t.Error(n)
|
||||
}
|
||||
|
||||
h.Add(toByte(0xffffffffffffffff))
|
||||
n = h.denseList[0xf]
|
||||
if n != 1 {
|
||||
t.Error(n)
|
||||
}
|
||||
|
||||
h.Add(toByte(0x00ffffffffffffff))
|
||||
n = h.denseList[0]
|
||||
if n != 5 {
|
||||
t.Error(n)
|
||||
}
|
||||
}
|
||||
|
||||
func TestHLLPP_toNormal(t *testing.T) {
|
||||
h := NewTestPlus(16)
|
||||
h.Add(toByte(0x00010fffffffffff))
|
||||
h.toNormal()
|
||||
c := h.Count()
|
||||
if c != 1 {
|
||||
t.Error(c)
|
||||
}
|
||||
|
||||
if h.sparse {
|
||||
t.Error("toNormal should convert to normal")
|
||||
}
|
||||
|
||||
h = NewTestPlus(16)
|
||||
h.hash = nopHash
|
||||
h.Add(toByte(0x00010fffffffffff))
|
||||
h.Add(toByte(0x0002ffffffffffff))
|
||||
h.Add(toByte(0x0003000000000000))
|
||||
h.Add(toByte(0x0003000000000001))
|
||||
h.Add(toByte(0xff03700000000000))
|
||||
h.Add(toByte(0xff03080000000000))
|
||||
h.mergeSparse()
|
||||
h.toNormal()
|
||||
|
||||
n := h.denseList[1]
|
||||
if n != 5 {
|
||||
t.Error(n)
|
||||
}
|
||||
n = h.denseList[2]
|
||||
if n != 1 {
|
||||
t.Error(n)
|
||||
}
|
||||
n = h.denseList[3]
|
||||
if n != 49 {
|
||||
t.Error(n)
|
||||
}
|
||||
n = h.denseList[0xff03]
|
||||
if n != 5 {
|
||||
t.Error(n)
|
||||
}
|
||||
}
|
||||
|
||||
func TestHLLPP_estimateBias(t *testing.T) {
|
||||
h := NewTestPlus(4)
|
||||
b := h.estimateBias(14.0988)
|
||||
if math.Abs(b-7.5988) > 0.00001 {
|
||||
t.Error(b)
|
||||
}
|
||||
|
||||
h = NewTestPlus(16)
|
||||
b = h.estimateBias(55391.4373)
|
||||
if math.Abs(b-39416.9373) > 0.00001 {
|
||||
t.Error(b)
|
||||
}
|
||||
}
|
||||
|
||||
func TestHLLPPCount(t *testing.T) {
|
||||
h := NewTestPlus(16)
|
||||
|
||||
n := h.Count()
|
||||
if n != 0 {
|
||||
t.Error(n)
|
||||
}
|
||||
|
||||
h.Add(toByte(0x00010fffffffffff))
|
||||
h.Add(toByte(0x00020fffffffffff))
|
||||
h.Add(toByte(0x00030fffffffffff))
|
||||
h.Add(toByte(0x00040fffffffffff))
|
||||
h.Add(toByte(0x00050fffffffffff))
|
||||
h.Add(toByte(0x00050fffffffffff))
|
||||
|
||||
n = h.Count()
|
||||
if n != 5 {
|
||||
t.Error(n)
|
||||
}
|
||||
|
||||
// not mutated, still returns correct count
|
||||
n = h.Count()
|
||||
if n != 5 {
|
||||
t.Error(n)
|
||||
}
|
||||
|
||||
h.Add(toByte(0x00060fffffffffff))
|
||||
|
||||
// mutated
|
||||
n = h.Count()
|
||||
if n != 6 {
|
||||
t.Error(n)
|
||||
}
|
||||
}
|
||||
|
||||
func TestHLLPP_Merge_Error(t *testing.T) {
|
||||
h := NewTestPlus(16)
|
||||
h2 := NewTestPlus(10)
|
||||
|
||||
err := h.Merge(h2)
|
||||
if err == nil {
|
||||
t.Error("different precision should return error")
|
||||
}
|
||||
}
|
||||
|
||||
func TestHLL_Merge_Sparse(t *testing.T) {
|
||||
h := NewTestPlus(16)
|
||||
h.Add(toByte(0x00010fffffffffff))
|
||||
h.Add(toByte(0x00020fffffffffff))
|
||||
h.Add(toByte(0x00030fffffffffff))
|
||||
h.Add(toByte(0x00040fffffffffff))
|
||||
h.Add(toByte(0x00050fffffffffff))
|
||||
h.Add(toByte(0x00050fffffffffff))
|
||||
|
||||
h2 := NewTestPlus(16)
|
||||
h2.Merge(h)
|
||||
n := h2.Count()
|
||||
if n != 5 {
|
||||
t.Error(n)
|
||||
}
|
||||
|
||||
if h2.sparse {
|
||||
t.Error("Merge should convert to normal")
|
||||
}
|
||||
|
||||
if !h.sparse {
|
||||
t.Error("Merge should not modify argument")
|
||||
}
|
||||
|
||||
h2.Merge(h)
|
||||
n = h2.Count()
|
||||
if n != 5 {
|
||||
t.Error(n)
|
||||
}
|
||||
|
||||
h.Add(toByte(0x00060fffffffffff))
|
||||
h.Add(toByte(0x00070fffffffffff))
|
||||
h.Add(toByte(0x00080fffffffffff))
|
||||
h.Add(toByte(0x00090fffffffffff))
|
||||
h.Add(toByte(0x000a0fffffffffff))
|
||||
h.Add(toByte(0x000a0fffffffffff))
|
||||
n = h.Count()
|
||||
if n != 10 {
|
||||
t.Error(n)
|
||||
}
|
||||
|
||||
h2.Merge(h)
|
||||
n = h2.Count()
|
||||
if n != 10 {
|
||||
t.Error(n)
|
||||
}
|
||||
}
|
||||
|
||||
func TestHLL_Merge_Normal(t *testing.T) {
|
||||
h := NewTestPlus(16)
|
||||
h.toNormal()
|
||||
h.Add(toByte(0x00010fffffffffff))
|
||||
h.Add(toByte(0x00020fffffffffff))
|
||||
h.Add(toByte(0x00030fffffffffff))
|
||||
h.Add(toByte(0x00040fffffffffff))
|
||||
h.Add(toByte(0x00050fffffffffff))
|
||||
h.Add(toByte(0x00050fffffffffff))
|
||||
|
||||
h2 := NewTestPlus(16)
|
||||
h2.toNormal()
|
||||
h2.Merge(h)
|
||||
n := h2.Count()
|
||||
if n != 5 {
|
||||
t.Error(n)
|
||||
}
|
||||
|
||||
h2.Merge(h)
|
||||
n = h2.Count()
|
||||
if n != 5 {
|
||||
t.Error(n)
|
||||
}
|
||||
|
||||
h.Add(toByte(0x00060fffffffffff))
|
||||
h.Add(toByte(0x00070fffffffffff))
|
||||
h.Add(toByte(0x00080fffffffffff))
|
||||
h.Add(toByte(0x00090fffffffffff))
|
||||
h.Add(toByte(0x000a0fffffffffff))
|
||||
h.Add(toByte(0x000a0fffffffffff))
|
||||
n = h.Count()
|
||||
if n != 10 {
|
||||
t.Error(n)
|
||||
}
|
||||
|
||||
h2.Merge(h)
|
||||
n = h2.Count()
|
||||
if n != 10 {
|
||||
t.Error(n)
|
||||
}
|
||||
}
|
||||
|
||||
func TestHLLPP_Merge(t *testing.T) {
|
||||
h := NewTestPlus(16)
|
||||
|
||||
k1 := uint64(0xf000017000000000)
|
||||
h.Add(toByte(k1))
|
||||
if !h.tmpSet.has(h.encodeHash(k1)) {
|
||||
t.Error("key not in hash")
|
||||
}
|
||||
|
||||
k2 := uint64(0x000fff8f00000000)
|
||||
h.Add(toByte(k2))
|
||||
if !h.tmpSet.has(h.encodeHash(k2)) {
|
||||
t.Error("key not in hash")
|
||||
}
|
||||
|
||||
if len(h.tmpSet) != 2 {
|
||||
t.Error(h.tmpSet)
|
||||
}
|
||||
|
||||
h.mergeSparse()
|
||||
if len(h.tmpSet) != 0 {
|
||||
t.Error(h.tmpSet)
|
||||
}
|
||||
if h.sparseList.count != 2 {
|
||||
t.Error(h.sparseList)
|
||||
}
|
||||
|
||||
iter := h.sparseList.Iter()
|
||||
n := iter.Next()
|
||||
if n != h.encodeHash(k2) {
|
||||
t.Error(n)
|
||||
}
|
||||
n = iter.Next()
|
||||
if n != h.encodeHash(k1) {
|
||||
t.Error(n)
|
||||
}
|
||||
|
||||
k3 := uint64(0x0f00017000000000)
|
||||
h.Add(toByte(k3))
|
||||
if !h.tmpSet.has(h.encodeHash(k3)) {
|
||||
t.Error("key not in hash")
|
||||
}
|
||||
|
||||
h.mergeSparse()
|
||||
if len(h.tmpSet) != 0 {
|
||||
t.Error(h.tmpSet)
|
||||
}
|
||||
if h.sparseList.count != 3 {
|
||||
t.Error(h.sparseList)
|
||||
}
|
||||
|
||||
iter = h.sparseList.Iter()
|
||||
n = iter.Next()
|
||||
if n != h.encodeHash(k2) {
|
||||
t.Error(n)
|
||||
}
|
||||
n = iter.Next()
|
||||
if n != h.encodeHash(k3) {
|
||||
t.Error(n)
|
||||
}
|
||||
n = iter.Next()
|
||||
if n != h.encodeHash(k1) {
|
||||
t.Error(n)
|
||||
}
|
||||
|
||||
h.Add(toByte(k1))
|
||||
if !h.tmpSet.has(h.encodeHash(k1)) {
|
||||
t.Error("key not in hash")
|
||||
}
|
||||
|
||||
h.mergeSparse()
|
||||
if len(h.tmpSet) != 0 {
|
||||
t.Error(h.tmpSet)
|
||||
}
|
||||
if h.sparseList.count != 3 {
|
||||
t.Error(h.sparseList)
|
||||
}
|
||||
|
||||
iter = h.sparseList.Iter()
|
||||
n = iter.Next()
|
||||
if n != h.encodeHash(k2) {
|
||||
t.Error(n)
|
||||
}
|
||||
n = iter.Next()
|
||||
if n != h.encodeHash(k3) {
|
||||
t.Error(n)
|
||||
}
|
||||
n = iter.Next()
|
||||
if n != h.encodeHash(k1) {
|
||||
t.Error(n)
|
||||
}
|
||||
}
|
||||
|
||||
func TestHLLPP_EncodeDecode(t *testing.T) {
|
||||
h := NewTestPlus(8)
|
||||
i, r := h.decodeHash(h.encodeHash(0xffffff8000000000))
|
||||
if i != 0xff {
|
||||
t.Error(i)
|
||||
}
|
||||
if r != 1 {
|
||||
t.Error(r)
|
||||
}
|
||||
|
||||
i, r = h.decodeHash(h.encodeHash(0xff00000000000000))
|
||||
if i != 0xff {
|
||||
t.Error(i)
|
||||
}
|
||||
if r != 57 {
|
||||
t.Error(r)
|
||||
}
|
||||
|
||||
i, r = h.decodeHash(h.encodeHash(0xff30000000000000))
|
||||
if i != 0xff {
|
||||
t.Error(i)
|
||||
}
|
||||
if r != 3 {
|
||||
t.Error(r)
|
||||
}
|
||||
|
||||
i, r = h.decodeHash(h.encodeHash(0xaa10000000000000))
|
||||
if i != 0xaa {
|
||||
t.Error(i)
|
||||
}
|
||||
if r != 4 {
|
||||
t.Error(r)
|
||||
}
|
||||
|
||||
i, r = h.decodeHash(h.encodeHash(0xaa0f000000000000))
|
||||
if i != 0xaa {
|
||||
t.Error(i)
|
||||
}
|
||||
if r != 5 {
|
||||
t.Error(r)
|
||||
}
|
||||
}
|
||||
|
||||
func TestHLLPP_Error(t *testing.T) {
|
||||
_, err := NewPlus(3)
|
||||
if err == nil {
|
||||
t.Error("precision 3 should return error")
|
||||
}
|
||||
|
||||
_, err = NewPlus(18)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
_, err = NewPlus(19)
|
||||
if err == nil {
|
||||
t.Error("precision 17 should return error")
|
||||
}
|
||||
}
|
||||
|
||||
func TestHLLPP_Marshal_Unmarshal_Sparse(t *testing.T) {
|
||||
h, _ := NewPlus(4)
|
||||
h.sparse = true
|
||||
h.tmpSet = map[uint32]struct{}{26: struct{}{}, 40: struct{}{}}
|
||||
|
||||
// Add a bunch of values to the sparse representation.
|
||||
for i := 0; i < 10; i++ {
|
||||
h.sparseList.Append(uint32(rand.Int()))
|
||||
}
|
||||
|
||||
data, err := h.MarshalBinary()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Peeking at the first byte should reveal the version.
|
||||
if got, exp := data[0], byte(1); got != exp {
|
||||
t.Fatalf("got byte %v, expected %v", got, exp)
|
||||
}
|
||||
|
||||
var res Plus
|
||||
if err := res.UnmarshalBinary(data); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// reflect.DeepEqual will always return false when comparing non-nil
|
||||
// functions, so we'll set them to nil.
|
||||
h.hash, res.hash = nil, nil
|
||||
if got, exp := &res, h; !reflect.DeepEqual(got, exp) {
|
||||
t.Fatalf("got %v, wanted %v", spew.Sdump(got), spew.Sdump(exp))
|
||||
}
|
||||
}
|
||||
|
||||
func TestHLLPP_Marshal_Unmarshal_Dense(t *testing.T) {
|
||||
h, _ := NewPlus(4)
|
||||
h.sparse = false
|
||||
|
||||
// Add a bunch of values to the dense representation.
|
||||
for i := 0; i < 10; i++ {
|
||||
h.denseList = append(h.denseList, uint8(rand.Int()))
|
||||
}
|
||||
|
||||
data, err := h.MarshalBinary()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Peeking at the first byte should reveal the version.
|
||||
if got, exp := data[0], byte(1); got != exp {
|
||||
t.Fatalf("got byte %v, expected %v", got, exp)
|
||||
}
|
||||
|
||||
var res Plus
|
||||
if err := res.UnmarshalBinary(data); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// reflect.DeepEqual will always return false when comparing non-nil
|
||||
// functions, so we'll set them to nil.
|
||||
h.hash, res.hash = nil, nil
|
||||
if got, exp := &res, h; !reflect.DeepEqual(got, exp) {
|
||||
t.Fatalf("got %v, wanted %v", spew.Sdump(got), spew.Sdump(exp))
|
||||
}
|
||||
}
|
||||
|
||||
// Tests that a sketch can be serialised / unserialised and keep an accurate
|
||||
// cardinality estimate.
|
||||
func TestHLLPP_Marshal_Unmarshal_Count(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("Skipping test in short mode")
|
||||
}
|
||||
|
||||
count := make(map[string]struct{}, 1000000)
|
||||
h, _ := NewPlus(16)
|
||||
|
||||
buf := make([]byte, 8)
|
||||
for i := 0; i < 1000000; i++ {
|
||||
if _, err := crand.Read(buf); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
count[string(buf)] = struct{}{}
|
||||
|
||||
// Add to the sketch.
|
||||
h.Add(buf)
|
||||
}
|
||||
|
||||
gotC := h.Count()
|
||||
epsilon := 15000 // 1.5%
|
||||
if got, exp := math.Abs(float64(int(gotC)-len(count))), epsilon; int(got) > exp {
|
||||
t.Fatalf("error was %v for estimation %d and true cardinality %d", got, gotC, len(count))
|
||||
}
|
||||
|
||||
// Serialise the sketch.
|
||||
sketch, err := h.MarshalBinary()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Deserialise.
|
||||
h = &Plus{}
|
||||
if err := h.UnmarshalBinary(sketch); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// The count should be the same
|
||||
oldC := gotC
|
||||
if got, exp := h.Count(), oldC; got != exp {
|
||||
t.Fatalf("got %d, expected %d", got, exp)
|
||||
}
|
||||
|
||||
// Add some more values.
|
||||
for i := 0; i < 1000000; i++ {
|
||||
if _, err := crand.Read(buf); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
count[string(buf)] = struct{}{}
|
||||
|
||||
// Add to the sketch.
|
||||
h.Add(buf)
|
||||
}
|
||||
|
||||
// The sketch should still be working correctly.
|
||||
gotC = h.Count()
|
||||
epsilon = 30000 // 1.5%
|
||||
if got, exp := math.Abs(float64(int(gotC)-len(count))), epsilon; int(got) > exp {
|
||||
t.Fatalf("error was %v for estimation %d and true cardinality %d", got, gotC, len(count))
|
||||
}
|
||||
}
|
||||
|
||||
func NewTestPlus(p uint8) *Plus {
|
||||
h, _ := NewPlus(p)
|
||||
h.hash = nopHash
|
||||
return h
|
||||
}
|
||||
|
||||
// Generate random data to add to the sketch.
|
||||
func genData(n int) [][]byte {
|
||||
out := make([][]byte, 0, n)
|
||||
buf := make([]byte, 8)
|
||||
|
||||
for i := 0; i < n; i++ {
|
||||
// generate 8 random bytes
|
||||
n, err := rand.Read(buf)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
} else if n != 8 {
|
||||
panic(fmt.Errorf("only %d bytes generated", n))
|
||||
}
|
||||
|
||||
out = append(out, buf)
|
||||
}
|
||||
if len(out) != n {
|
||||
panic(fmt.Sprintf("wrong size slice: %d", n))
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// Memoises values to be added to a sketch during a benchmark.
|
||||
var benchdata = map[int][][]byte{}
|
||||
|
||||
func benchmarkPlusAdd(b *testing.B, h *Plus, n int) {
|
||||
blobs, ok := benchdata[n]
|
||||
if !ok {
|
||||
// Generate it.
|
||||
benchdata[n] = genData(n)
|
||||
blobs = benchdata[n]
|
||||
}
|
||||
|
||||
b.ReportAllocs()
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
for j := 0; j < len(blobs); j++ {
|
||||
h.Add(blobs[j])
|
||||
}
|
||||
}
|
||||
b.StopTimer()
|
||||
}
|
||||
|
||||
func BenchmarkPlus_Add_100(b *testing.B) {
|
||||
h, _ := NewPlus(16)
|
||||
benchmarkPlusAdd(b, h, 100)
|
||||
}
|
||||
|
||||
func BenchmarkPlus_Add_1000(b *testing.B) {
|
||||
h, _ := NewPlus(16)
|
||||
benchmarkPlusAdd(b, h, 1000)
|
||||
}
|
||||
|
||||
func BenchmarkPlus_Add_10000(b *testing.B) {
|
||||
h, _ := NewPlus(16)
|
||||
benchmarkPlusAdd(b, h, 10000)
|
||||
}
|
||||
|
||||
func BenchmarkPlus_Add_100000(b *testing.B) {
|
||||
h, _ := NewPlus(16)
|
||||
benchmarkPlusAdd(b, h, 100000)
|
||||
}
|
||||
|
||||
func BenchmarkPlus_Add_1000000(b *testing.B) {
|
||||
h, _ := NewPlus(16)
|
||||
benchmarkPlusAdd(b, h, 1000000)
|
||||
}
|
||||
|
||||
func BenchmarkPlus_Add_10000000(b *testing.B) {
|
||||
h, _ := NewPlus(16)
|
||||
benchmarkPlusAdd(b, h, 10000000)
|
||||
}
|
||||
|
||||
func BenchmarkPlus_Add_100000000(b *testing.B) {
|
||||
h, _ := NewPlus(16)
|
||||
benchmarkPlusAdd(b, h, 100000000)
|
||||
}
|
18
vendor/github.com/influxdata/influxdb/pkg/estimator/sketch.go
generated
vendored
Normal file
18
vendor/github.com/influxdata/influxdb/pkg/estimator/sketch.go
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
package estimator
|
||||
|
||||
import "encoding"
|
||||
|
||||
// Sketch is the interface representing a sketch for estimating cardinality.
|
||||
type Sketch interface {
|
||||
// Add adds a single value to the sketch.
|
||||
Add(v []byte)
|
||||
|
||||
// Count returns a cardinality estimate for the sketch.
|
||||
Count() uint64
|
||||
|
||||
// Merge merges another sketch into this one.
|
||||
Merge(s Sketch) error
|
||||
|
||||
encoding.BinaryMarshaler
|
||||
encoding.BinaryUnmarshaler
|
||||
}
|
19
vendor/github.com/influxdata/influxdb/pkg/limiter/fixed.go
generated
vendored
Normal file
19
vendor/github.com/influxdata/influxdb/pkg/limiter/fixed.go
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
// Package limiter provides concurrency limiters.
|
||||
package limiter
|
||||
|
||||
// Fixed is a simple channel-based concurrency limiter. It uses a fixed
|
||||
// size channel to limit callers from proceeding until there is a value available
|
||||
// in the channel. If all are in-use, the caller blocks until one is freed.
|
||||
type Fixed chan struct{}
|
||||
|
||||
func NewFixed(limit int) Fixed {
|
||||
return make(Fixed, limit)
|
||||
}
|
||||
|
||||
func (t Fixed) Take() {
|
||||
t <- struct{}{}
|
||||
}
|
||||
|
||||
func (t Fixed) Release() {
|
||||
<-t
|
||||
}
|
22
vendor/github.com/influxdata/influxdb/pkg/mmap/mmap_test.go
generated
vendored
Normal file
22
vendor/github.com/influxdata/influxdb/pkg/mmap/mmap_test.go
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
package mmap_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io/ioutil"
|
||||
"testing"
|
||||
|
||||
"github.com/influxdata/influxdb/pkg/mmap"
|
||||
)
|
||||
|
||||
func TestMap(t *testing.T) {
|
||||
data, err := mmap.Map("mmap_test.go")
|
||||
if err != nil {
|
||||
t.Fatalf("Open: %v", err)
|
||||
}
|
||||
|
||||
if exp, err := ioutil.ReadFile("mmap_test.go"); err != nil {
|
||||
t.Fatalf("ioutil.ReadFile: %v", err)
|
||||
} else if !bytes.Equal(data, exp) {
|
||||
t.Fatalf("got %q\nwant %q", string(data), string(exp))
|
||||
}
|
||||
}
|
43
vendor/github.com/influxdata/influxdb/pkg/mmap/mmap_unix.go
generated
vendored
Normal file
43
vendor/github.com/influxdata/influxdb/pkg/mmap/mmap_unix.go
generated
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
|
||||
|
||||
// Copyright 2015 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package mmap provides a way to memory-map a file.
|
||||
package mmap
|
||||
|
||||
import (
|
||||
"os"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
// Map memory-maps a file.
|
||||
func Map(path string) ([]byte, error) {
|
||||
f, err := os.Open(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
fi, err := f.Stat()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if fi.Size() == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
data, err := syscall.Mmap(int(f.Fd()), 0, int(fi.Size()), syscall.PROT_READ, syscall.MAP_SHARED)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return data, nil
|
||||
}
|
||||
|
||||
// Unmap closes the memory-map.
|
||||
func Unmap(data []byte) error {
|
||||
if data == nil {
|
||||
return nil
|
||||
}
|
||||
return syscall.Munmap(data)
|
||||
}
|
46
vendor/github.com/influxdata/influxdb/pkg/mmap/mmap_windows.go
generated
vendored
Normal file
46
vendor/github.com/influxdata/influxdb/pkg/mmap/mmap_windows.go
generated
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
package mmap
|
||||
|
||||
import (
|
||||
"os"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
// Map memory-maps a file.
|
||||
func Map(path string) ([]byte, error) {
|
||||
f, err := os.Open(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
fi, err := f.Stat()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if fi.Size() == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
lo, hi := uint32(fi.Size()), uint32(fi.Size()>>32)
|
||||
fmap, err := syscall.CreateFileMapping(syscall.Handle(f.Fd()), nil, syscall.PAGE_READONLY, hi, lo, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer syscall.CloseHandle(fmap)
|
||||
|
||||
ptr, err := syscall.MapViewOfFile(fmap, syscall.FILE_MAP_READ, 0, 0, uintptr(fi.Size()))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
data := (*[1 << 30]byte)(unsafe.Pointer(ptr))[:fi.Size()]
|
||||
|
||||
return data, nil
|
||||
}
|
||||
|
||||
// Unmap closes the memory-map.
|
||||
func Unmap(data []byte) error {
|
||||
if data == nil {
|
||||
return nil
|
||||
}
|
||||
return syscall.UnmapViewOfFile(uintptr(unsafe.Pointer(&data[0])))
|
||||
}
|
100
vendor/github.com/influxdata/influxdb/pkg/pool/bytes.go
generated
vendored
Normal file
100
vendor/github.com/influxdata/influxdb/pkg/pool/bytes.go
generated
vendored
Normal file
@@ -0,0 +1,100 @@
|
||||
// Package pool provides pool structures to help reduce garbage collector pressure.
|
||||
package pool
|
||||
|
||||
// Bytes is a pool of byte slices that can be re-used. Slices in
|
||||
// this pool will not be garbage collected when not in use.
|
||||
type Bytes struct {
|
||||
pool chan []byte
|
||||
}
|
||||
|
||||
// NewBytes returns a Bytes pool with capacity for max byte slices
|
||||
// to be pool.
|
||||
func NewBytes(max int) *Bytes {
|
||||
return &Bytes{
|
||||
pool: make(chan []byte, max),
|
||||
}
|
||||
}
|
||||
|
||||
// Get returns a byte slice size with at least sz capacity. Items
|
||||
// returned may not be in the zero state and should be reset by the
|
||||
// caller.
|
||||
func (p *Bytes) Get(sz int) []byte {
|
||||
var c []byte
|
||||
select {
|
||||
case c = <-p.pool:
|
||||
default:
|
||||
return make([]byte, sz)
|
||||
}
|
||||
|
||||
if cap(c) < sz {
|
||||
return make([]byte, sz)
|
||||
}
|
||||
|
||||
return c[:sz]
|
||||
}
|
||||
|
||||
// Put returns a slice back to the pool. If the pool is full, the byte
|
||||
// slice is discarded.
|
||||
func (p *Bytes) Put(c []byte) {
|
||||
select {
|
||||
case p.pool <- c:
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
// LimitedBytes is a pool of byte slices that can be re-used. Slices in
|
||||
// this pool will not be garbage collected when not in use. The pool will
|
||||
// hold onto a fixed number of byte slices of a maximum size. If the pool
|
||||
// is empty and max pool size has not been allocated yet, it will return a
|
||||
// new byte slice. Byte slices added to the pool that are over the max size
|
||||
// are dropped.
|
||||
type LimitedBytes struct {
|
||||
allocated int64
|
||||
maxSize int
|
||||
pool chan []byte
|
||||
}
|
||||
|
||||
// NewBytes returns a Bytes pool with capacity for max byte slices
|
||||
// to be pool.
|
||||
func NewLimitedBytes(capacity int, maxSize int) *LimitedBytes {
|
||||
return &LimitedBytes{
|
||||
pool: make(chan []byte, capacity),
|
||||
maxSize: maxSize,
|
||||
}
|
||||
}
|
||||
|
||||
// Get returns a byte slice size with at least sz capacity. Items
|
||||
// returned may not be in the zero state and should be reset by the
|
||||
// caller.
|
||||
func (p *LimitedBytes) Get(sz int) []byte {
|
||||
var c []byte
|
||||
|
||||
// If we have not allocated our capacity, return a new allocation,
|
||||
// otherwise block until one frees up.
|
||||
select {
|
||||
case c = <-p.pool:
|
||||
default:
|
||||
return make([]byte, sz)
|
||||
}
|
||||
|
||||
if cap(c) < sz {
|
||||
return make([]byte, sz)
|
||||
}
|
||||
|
||||
return c[:sz]
|
||||
}
|
||||
|
||||
// Put returns a slice back to the pool. If the pool is full, the byte
|
||||
// slice is discarded. If the byte slice is over the configured max size
|
||||
// of any byte slice in the pool, it is discared.
|
||||
func (p *LimitedBytes) Put(c []byte) {
|
||||
// Drop buffers that are larger than the max size
|
||||
if cap(c) >= p.maxSize {
|
||||
return
|
||||
}
|
||||
|
||||
select {
|
||||
case p.pool <- c:
|
||||
default:
|
||||
}
|
||||
}
|
16
vendor/github.com/influxdata/influxdb/pkg/pool/bytes_test.go
generated
vendored
Normal file
16
vendor/github.com/influxdata/influxdb/pkg/pool/bytes_test.go
generated
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
package pool_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/influxdata/influxdb/pkg/pool"
|
||||
)
|
||||
|
||||
func TestLimitedBytePool_Put_MaxSize(t *testing.T) {
|
||||
bp := pool.NewLimitedBytes(1, 10)
|
||||
bp.Put(make([]byte, 1024)) // should be dropped
|
||||
|
||||
if got, exp := cap(bp.Get(10)), 10; got != exp {
|
||||
t.Fatalf("max cap size exceeded: got %v, exp %v", got, exp)
|
||||
}
|
||||
}
|
40
vendor/github.com/influxdata/influxdb/pkg/pool/generic.go
generated
vendored
Normal file
40
vendor/github.com/influxdata/influxdb/pkg/pool/generic.go
generated
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
package pool
|
||||
|
||||
// Generic is a pool of types that can be re-used. Items in
|
||||
// this pool will not be garbage collected when not in use.
|
||||
type Generic struct {
|
||||
pool chan interface{}
|
||||
fn func(sz int) interface{}
|
||||
}
|
||||
|
||||
// NewGeneric returns a Generic pool with capacity for max items
|
||||
// to be pool.
|
||||
func NewGeneric(max int, fn func(sz int) interface{}) *Generic {
|
||||
return &Generic{
|
||||
pool: make(chan interface{}, max),
|
||||
fn: fn,
|
||||
}
|
||||
}
|
||||
|
||||
// Get returns a item from the pool or a new instance if the pool
|
||||
// is empty. Items returned may not be in the zero state and should
|
||||
// be reset by the caller.
|
||||
func (p *Generic) Get(sz int) interface{} {
|
||||
var c interface{}
|
||||
select {
|
||||
case c = <-p.pool:
|
||||
default:
|
||||
c = p.fn(sz)
|
||||
}
|
||||
|
||||
return c
|
||||
}
|
||||
|
||||
// Put returns an item back to the pool. If the pool is full, the item
|
||||
// is discarded.
|
||||
func (p *Generic) Put(c interface{}) {
|
||||
select {
|
||||
case p.pool <- c:
|
||||
default:
|
||||
}
|
||||
}
|
267
vendor/github.com/influxdata/influxdb/pkg/rhh/rhh.go
generated
vendored
Normal file
267
vendor/github.com/influxdata/influxdb/pkg/rhh/rhh.go
generated
vendored
Normal file
@@ -0,0 +1,267 @@
|
||||
package rhh
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"sort"
|
||||
|
||||
"github.com/cespare/xxhash"
|
||||
)
|
||||
|
||||
// HashMap represents a hash map that implements Robin Hood Hashing.
|
||||
// https://cs.uwaterloo.ca/research/tr/1986/CS-86-14.pdf
|
||||
type HashMap struct {
|
||||
hashes []int64
|
||||
elems []hashElem
|
||||
|
||||
n int64
|
||||
capacity int64
|
||||
threshold int64
|
||||
mask int64
|
||||
loadFactor int
|
||||
}
|
||||
|
||||
func NewHashMap(opt Options) *HashMap {
|
||||
m := &HashMap{
|
||||
capacity: pow2(opt.Capacity), // Limited to 2^64.
|
||||
loadFactor: opt.LoadFactor,
|
||||
}
|
||||
m.alloc()
|
||||
return m
|
||||
}
|
||||
|
||||
// Reset clears the values in the map without deallocating the space.
|
||||
func (m *HashMap) Reset() {
|
||||
for i := int64(0); i < m.capacity; i++ {
|
||||
m.hashes[i] = 0
|
||||
m.elems[i].reset()
|
||||
}
|
||||
m.n = 0
|
||||
}
|
||||
|
||||
func (m *HashMap) Get(key []byte) interface{} {
|
||||
i := m.index(key)
|
||||
if i == -1 {
|
||||
return nil
|
||||
}
|
||||
return m.elems[i].value
|
||||
}
|
||||
|
||||
func (m *HashMap) Put(key []byte, val interface{}) {
|
||||
// Grow the map if we've run out of slots.
|
||||
m.n++
|
||||
if m.n > m.threshold {
|
||||
m.grow()
|
||||
}
|
||||
|
||||
// If the key was overwritten then decrement the size.
|
||||
overwritten := m.insert(HashKey(key), key, val)
|
||||
if overwritten {
|
||||
m.n--
|
||||
}
|
||||
}
|
||||
|
||||
func (m *HashMap) insert(hash int64, key []byte, val interface{}) (overwritten bool) {
|
||||
pos := hash & m.mask
|
||||
var dist int64
|
||||
|
||||
// Continue searching until we find an empty slot or lower probe distance.
|
||||
for {
|
||||
e := &m.elems[pos]
|
||||
|
||||
// Empty slot found or matching key, insert and exit.
|
||||
match := bytes.Equal(m.elems[pos].key, key)
|
||||
if m.hashes[pos] == 0 || match {
|
||||
m.hashes[pos] = hash
|
||||
e.hash, e.value = hash, val
|
||||
e.setKey(key)
|
||||
return match
|
||||
}
|
||||
|
||||
// If the existing elem has probed less than us, then swap places with
|
||||
// existing elem, and keep going to find another slot for that elem.
|
||||
elemDist := Dist(m.hashes[pos], pos, m.capacity)
|
||||
if elemDist < dist {
|
||||
// Swap with current position.
|
||||
hash, m.hashes[pos] = m.hashes[pos], hash
|
||||
val, e.value = e.value, val
|
||||
|
||||
tmp := make([]byte, len(e.key))
|
||||
copy(tmp, e.key)
|
||||
|
||||
e.setKey(key)
|
||||
key = tmp
|
||||
|
||||
// Update current distance.
|
||||
dist = elemDist
|
||||
}
|
||||
|
||||
// Increment position, wrap around on overflow.
|
||||
pos = (pos + 1) & m.mask
|
||||
dist++
|
||||
}
|
||||
}
|
||||
|
||||
// alloc elems according to currently set capacity.
|
||||
func (m *HashMap) alloc() {
|
||||
m.elems = make([]hashElem, m.capacity)
|
||||
m.hashes = make([]int64, m.capacity)
|
||||
m.threshold = (m.capacity * int64(m.loadFactor)) / 100
|
||||
m.mask = int64(m.capacity - 1)
|
||||
}
|
||||
|
||||
// grow doubles the capacity and reinserts all existing hashes & elements.
|
||||
func (m *HashMap) grow() {
|
||||
// Copy old elements and hashes.
|
||||
elems, hashes := m.elems, m.hashes
|
||||
capacity := m.capacity
|
||||
|
||||
// Double capacity & reallocate.
|
||||
m.capacity *= 2
|
||||
m.alloc()
|
||||
|
||||
// Copy old elements to new hash/elem list.
|
||||
for i := int64(0); i < capacity; i++ {
|
||||
elem, hash := &elems[i], hashes[i]
|
||||
if hash == 0 {
|
||||
continue
|
||||
}
|
||||
m.insert(hash, elem.key, elem.value)
|
||||
}
|
||||
}
|
||||
|
||||
// index returns the position of key in the hash map.
|
||||
func (m *HashMap) index(key []byte) int64 {
|
||||
hash := HashKey(key)
|
||||
pos := hash & m.mask
|
||||
|
||||
var dist int64
|
||||
for {
|
||||
if m.hashes[pos] == 0 {
|
||||
return -1
|
||||
} else if dist > Dist(m.hashes[pos], pos, m.capacity) {
|
||||
return -1
|
||||
} else if m.hashes[pos] == hash && bytes.Equal(m.elems[pos].key, key) {
|
||||
return pos
|
||||
}
|
||||
|
||||
pos = (pos + 1) & m.mask
|
||||
dist++
|
||||
}
|
||||
}
|
||||
|
||||
// Elem returns the i-th key/value pair of the hash map.
|
||||
func (m *HashMap) Elem(i int64) (key []byte, value interface{}) {
|
||||
if i >= int64(len(m.elems)) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
e := &m.elems[i]
|
||||
return e.key, e.value
|
||||
}
|
||||
|
||||
// Len returns the number of key/values set in map.
|
||||
func (m *HashMap) Len() int64 { return m.n }
|
||||
|
||||
// Cap returns the number of key/values set in map.
|
||||
func (m *HashMap) Cap() int64 { return m.capacity }
|
||||
|
||||
// AverageProbeCount returns the average number of probes for each element.
|
||||
func (m *HashMap) AverageProbeCount() float64 {
|
||||
var sum float64
|
||||
for i := int64(0); i < m.capacity; i++ {
|
||||
hash := m.hashes[i]
|
||||
if hash == 0 {
|
||||
continue
|
||||
}
|
||||
sum += float64(Dist(hash, i, m.capacity))
|
||||
}
|
||||
return sum/float64(m.n) + 1.0
|
||||
}
|
||||
|
||||
// Keys returns a list of sorted keys.
|
||||
func (m *HashMap) Keys() [][]byte {
|
||||
a := make([][]byte, 0, m.Len())
|
||||
for i := int64(0); i < m.Cap(); i++ {
|
||||
k, v := m.Elem(i)
|
||||
if v == nil {
|
||||
continue
|
||||
}
|
||||
a = append(a, k)
|
||||
}
|
||||
sort.Sort(byteSlices(a))
|
||||
return a
|
||||
}
|
||||
|
||||
type hashElem struct {
|
||||
key []byte
|
||||
value interface{}
|
||||
hash int64
|
||||
}
|
||||
|
||||
// reset clears the values in the element.
|
||||
func (e *hashElem) reset() {
|
||||
e.key = e.key[:0]
|
||||
e.value = nil
|
||||
e.hash = 0
|
||||
}
|
||||
|
||||
// setKey copies v to a key on e.
|
||||
func (e *hashElem) setKey(v []byte) {
|
||||
// Shrink or grow key to fit value.
|
||||
if len(e.key) > len(v) {
|
||||
e.key = e.key[:len(v)]
|
||||
} else if len(e.key) < len(v) {
|
||||
e.key = append(e.key, make([]byte, len(v)-len(e.key))...)
|
||||
}
|
||||
|
||||
// Copy value to key.
|
||||
copy(e.key, v)
|
||||
}
|
||||
|
||||
// Options represents initialization options that are passed to NewHashMap().
|
||||
type Options struct {
|
||||
Capacity int64
|
||||
LoadFactor int
|
||||
}
|
||||
|
||||
// DefaultOptions represents a default set of options to pass to NewHashMap().
|
||||
var DefaultOptions = Options{
|
||||
Capacity: 256,
|
||||
LoadFactor: 90,
|
||||
}
|
||||
|
||||
// HashKey computes a hash of key. Hash is always non-zero.
|
||||
func HashKey(key []byte) int64 {
|
||||
h := int64(xxhash.Sum64(key))
|
||||
if h == 0 {
|
||||
h = 1
|
||||
} else if h < 0 {
|
||||
h = 0 - h
|
||||
}
|
||||
return h
|
||||
}
|
||||
|
||||
// Dist returns the probe distance for a hash in a slot index.
|
||||
// NOTE: Capacity must be a power of 2.
|
||||
func Dist(hash, i, capacity int64) int64 {
|
||||
mask := capacity - 1
|
||||
dist := (i + capacity - (hash & mask)) & mask
|
||||
return dist
|
||||
}
|
||||
|
||||
// pow2 returns the number that is the next highest power of 2.
|
||||
// Returns v if it is a power of 2.
|
||||
func pow2(v int64) int64 {
|
||||
for i := int64(2); i < 1<<62; i *= 2 {
|
||||
if i >= v {
|
||||
return i
|
||||
}
|
||||
}
|
||||
panic("unreachable")
|
||||
}
|
||||
|
||||
type byteSlices [][]byte
|
||||
|
||||
func (a byteSlices) Len() int { return len(a) }
|
||||
func (a byteSlices) Less(i, j int) bool { return bytes.Compare(a[i], a[j]) == -1 }
|
||||
func (a byteSlices) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
78
vendor/github.com/influxdata/influxdb/pkg/rhh/rhh_test.go
generated
vendored
Normal file
78
vendor/github.com/influxdata/influxdb/pkg/rhh/rhh_test.go
generated
vendored
Normal file
@@ -0,0 +1,78 @@
|
||||
package rhh_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"math/rand"
|
||||
"reflect"
|
||||
"testing"
|
||||
"testing/quick"
|
||||
|
||||
"github.com/influxdata/influxdb/pkg/rhh"
|
||||
)
|
||||
|
||||
// Ensure hash map can perform basic get/put operations.
|
||||
func TestHashMap(t *testing.T) {
|
||||
m := rhh.NewHashMap(rhh.DefaultOptions)
|
||||
m.Put([]byte("foo"), []byte("bar"))
|
||||
m.Put([]byte("baz"), []byte("bat"))
|
||||
|
||||
// Verify values can be retrieved.
|
||||
if v := m.Get([]byte("foo")); !bytes.Equal(v.([]byte), []byte("bar")) {
|
||||
t.Fatalf("unexpected value: %s", v)
|
||||
}
|
||||
if v := m.Get([]byte("baz")); !bytes.Equal(v.([]byte), []byte("bat")) {
|
||||
t.Fatalf("unexpected value: %s", v)
|
||||
}
|
||||
|
||||
// Overwrite field & verify.
|
||||
m.Put([]byte("foo"), []byte("XXX"))
|
||||
if v := m.Get([]byte("foo")); !bytes.Equal(v.([]byte), []byte("XXX")) {
|
||||
t.Fatalf("unexpected value: %s", v)
|
||||
}
|
||||
}
|
||||
|
||||
// Ensure hash map can insert random data.
|
||||
func TestHashMap_Quick(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("short mode, skipping")
|
||||
}
|
||||
|
||||
if err := quick.Check(func(keys, values [][]byte) bool {
|
||||
m := rhh.NewHashMap(rhh.Options{Capacity: 1000, LoadFactor: 90})
|
||||
h := make(map[string][]byte)
|
||||
|
||||
// Insert all key/values into both maps.
|
||||
for i := range keys {
|
||||
key, value := keys[i], values[i]
|
||||
h[string(key)] = value
|
||||
m.Put(key, value)
|
||||
}
|
||||
|
||||
// Verify the maps are equal.
|
||||
for k, v := range h {
|
||||
if mv := m.Get([]byte(k)); !bytes.Equal(mv.([]byte), v) {
|
||||
t.Fatalf("value mismatch:\nkey=%x\ngot=%x\nexp=%x\n\n", []byte(k), mv, v)
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}, &quick.Config{
|
||||
Values: func(values []reflect.Value, rand *rand.Rand) {
|
||||
n := rand.Intn(10000)
|
||||
values[0] = GenerateByteSlices(rand, n)
|
||||
values[1] = GenerateByteSlices(rand, n)
|
||||
},
|
||||
}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
// GenerateByteSlices returns a random list of byte slices.
|
||||
func GenerateByteSlices(rand *rand.Rand, n int) reflect.Value {
|
||||
var a [][]byte
|
||||
for i := 0; i < n; i++ {
|
||||
v, _ := quick.Value(reflect.TypeOf(([]byte)(nil)), rand)
|
||||
a = append(a, v.Interface().([]byte))
|
||||
}
|
||||
return reflect.ValueOf(a)
|
||||
}
|
41
vendor/github.com/influxdata/influxdb/pkg/slices/strings.go
generated
vendored
Normal file
41
vendor/github.com/influxdata/influxdb/pkg/slices/strings.go
generated
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
// Package slices contains functions to operate on slices treated as sets.
|
||||
package slices // import "github.com/influxdata/influxdb/pkg/slices"
|
||||
|
||||
import "strings"
|
||||
|
||||
// Union combines two string sets.
|
||||
func Union(setA, setB []string, ignoreCase bool) []string {
|
||||
for _, b := range setB {
|
||||
if ignoreCase {
|
||||
if !ExistsIgnoreCase(setA, b) {
|
||||
setA = append(setA, b)
|
||||
}
|
||||
continue
|
||||
}
|
||||
if !Exists(setA, b) {
|
||||
setA = append(setA, b)
|
||||
}
|
||||
}
|
||||
return setA
|
||||
}
|
||||
|
||||
// Exists checks if a string is in a set.
|
||||
func Exists(set []string, find string) bool {
|
||||
for _, s := range set {
|
||||
if s == find {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// ExistsIgnoreCase checks if a string is in a set but ignores its case.
|
||||
func ExistsIgnoreCase(set []string, find string) bool {
|
||||
find = strings.ToLower(find)
|
||||
for _, s := range set {
|
||||
if strings.ToLower(s) == find {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
Reference in New Issue
Block a user