From 5b5080204da5411f977778319936f0089dc83345 Mon Sep 17 00:00:00 2001 From: lani_karrot Date: Tue, 10 Feb 2026 19:21:40 +0900 Subject: [PATCH] feat: KLL float sketch --- common/item_sketch_float.go | 76 +++ kll/items_sketch_serialization_test.go | 535 ++++++++++++++++++ kll/items_sletch_serialization_test.go | 244 -------- .../kll_double_n1000000_cpp.sk | Bin 5000 -> 5000 bytes .../kll_double_n100000_cpp.sk | Bin 4728 -> 4728 bytes .../kll_double_n10000_cpp.sk | Bin 4372 -> 4372 bytes .../kll_double_n1000_cpp.sk | Bin 2640 -> 2640 bytes .../cpp_generated_files/kll_float_n0_cpp.sk | Bin 0 -> 8 bytes .../kll_float_n1000000_cpp.sk | Bin 0 -> 2536 bytes .../kll_float_n100000_cpp.sk | Bin 0 -> 2392 bytes .../kll_float_n10000_cpp.sk | Bin 0 -> 2208 bytes .../kll_float_n1000_cpp.sk | Bin 0 -> 1336 bytes .../cpp_generated_files/kll_float_n100_cpp.sk | Bin 0 -> 432 bytes .../cpp_generated_files/kll_float_n10_cpp.sk | Bin 0 -> 72 bytes .../cpp_generated_files/kll_float_n1_cpp.sk | Bin 0 -> 12 bytes .../cpp_generated_files/kll_long_n0_cpp.sk | Bin 0 -> 8 bytes .../kll_long_n1000000_cpp.sk | Bin 0 -> 5000 bytes .../kll_long_n100000_cpp.sk | Bin 0 -> 4728 bytes .../kll_long_n10000_cpp.sk | Bin 0 -> 4372 bytes .../cpp_generated_files/kll_long_n1000_cpp.sk | Bin 0 -> 2640 bytes .../cpp_generated_files/kll_long_n100_cpp.sk | Bin 0 -> 840 bytes .../cpp_generated_files/kll_long_n10_cpp.sk | Bin 0 -> 120 bytes .../cpp_generated_files/kll_long_n1_cpp.sk | Bin 0 -> 16 bytes .../kll_string_n1000000_cpp.sk | Bin 6200 -> 6198 bytes .../kll_string_n100000_cpp.sk | Bin 5267 -> 5266 bytes .../kll_string_n10000_cpp.sk | Bin 4337 -> 4337 bytes .../kll_string_n1000_cpp.sk | Bin 2287 -> 2287 bytes .../go_generated_files/kll_float_n0_go.sk | Bin 0 -> 8 bytes .../kll_float_n1000000_go.sk | Bin 0 -> 2536 bytes .../kll_float_n100000_go.sk | Bin 0 -> 2392 bytes .../go_generated_files/kll_float_n10000_go.sk | Bin 0 -> 2208 bytes .../go_generated_files/kll_float_n1000_go.sk | Bin 0 -> 1336 bytes .../go_generated_files/kll_float_n100_go.sk | Bin 0 -> 432 bytes .../go_generated_files/kll_float_n10_go.sk | Bin 0 -> 72 bytes .../go_generated_files/kll_float_n1_go.sk | Bin 0 -> 12 bytes .../java_generated_files/kll_float_n0_java.sk | Bin 0 -> 8 bytes .../kll_float_n1000000_java.sk | Bin 0 -> 2536 bytes .../kll_float_n100000_java.sk | Bin 0 -> 2392 bytes .../kll_float_n10000_java.sk | Bin 0 -> 2208 bytes .../kll_float_n1000_java.sk | Bin 0 -> 1336 bytes .../kll_float_n100_java.sk | Bin 0 -> 432 bytes .../kll_float_n10_java.sk | Bin 0 -> 72 bytes .../java_generated_files/kll_float_n1_java.sk | Bin 0 -> 12 bytes .../kll_string_n1000000_java.sk | Bin 6848 -> 6848 bytes .../kll_string_n100000_java.sk | Bin 5896 -> 5896 bytes .../kll_string_n10000_java.sk | Bin 4913 -> 4913 bytes 46 files changed, 611 insertions(+), 244 deletions(-) create mode 100644 common/item_sketch_float.go create mode 100644 kll/items_sketch_serialization_test.go delete mode 100644 kll/items_sletch_serialization_test.go create mode 100644 serialization_test_data/cpp_generated_files/kll_float_n0_cpp.sk create mode 100644 serialization_test_data/cpp_generated_files/kll_float_n1000000_cpp.sk create mode 100644 serialization_test_data/cpp_generated_files/kll_float_n100000_cpp.sk create mode 100644 serialization_test_data/cpp_generated_files/kll_float_n10000_cpp.sk create mode 100644 serialization_test_data/cpp_generated_files/kll_float_n1000_cpp.sk create mode 100644 serialization_test_data/cpp_generated_files/kll_float_n100_cpp.sk create mode 100644 serialization_test_data/cpp_generated_files/kll_float_n10_cpp.sk create mode 100644 serialization_test_data/cpp_generated_files/kll_float_n1_cpp.sk create mode 100644 serialization_test_data/cpp_generated_files/kll_long_n0_cpp.sk create mode 100644 serialization_test_data/cpp_generated_files/kll_long_n1000000_cpp.sk create mode 100644 serialization_test_data/cpp_generated_files/kll_long_n100000_cpp.sk create mode 100644 serialization_test_data/cpp_generated_files/kll_long_n10000_cpp.sk create mode 100644 serialization_test_data/cpp_generated_files/kll_long_n1000_cpp.sk create mode 100644 serialization_test_data/cpp_generated_files/kll_long_n100_cpp.sk create mode 100644 serialization_test_data/cpp_generated_files/kll_long_n10_cpp.sk create mode 100644 serialization_test_data/cpp_generated_files/kll_long_n1_cpp.sk create mode 100644 serialization_test_data/go_generated_files/kll_float_n0_go.sk create mode 100644 serialization_test_data/go_generated_files/kll_float_n1000000_go.sk create mode 100644 serialization_test_data/go_generated_files/kll_float_n100000_go.sk create mode 100644 serialization_test_data/go_generated_files/kll_float_n10000_go.sk create mode 100644 serialization_test_data/go_generated_files/kll_float_n1000_go.sk create mode 100644 serialization_test_data/go_generated_files/kll_float_n100_go.sk create mode 100644 serialization_test_data/go_generated_files/kll_float_n10_go.sk create mode 100644 serialization_test_data/go_generated_files/kll_float_n1_go.sk create mode 100644 serialization_test_data/java_generated_files/kll_float_n0_java.sk create mode 100644 serialization_test_data/java_generated_files/kll_float_n1000000_java.sk create mode 100644 serialization_test_data/java_generated_files/kll_float_n100000_java.sk create mode 100644 serialization_test_data/java_generated_files/kll_float_n10000_java.sk create mode 100644 serialization_test_data/java_generated_files/kll_float_n1000_java.sk create mode 100644 serialization_test_data/java_generated_files/kll_float_n100_java.sk create mode 100644 serialization_test_data/java_generated_files/kll_float_n10_java.sk create mode 100644 serialization_test_data/java_generated_files/kll_float_n1_java.sk diff --git a/common/item_sketch_float.go b/common/item_sketch_float.go new file mode 100644 index 0000000..eae77a9 --- /dev/null +++ b/common/item_sketch_float.go @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package common + +import ( + "encoding/binary" + "math" +) + +var ItemSketchFloatComparator = func(reverseOrder bool) CompareFn[float32] { + return func(a float32, b float32) bool { + if reverseOrder { + return a > b + } + return a < b + } +} + +// ItemSketchFloatSerDe handles serialization and deserialization of floating-point sketch items. +type ItemSketchFloatSerDe struct{} + +func (s ItemSketchFloatSerDe) SizeOf(item float32) int { + return 4 +} + +func (s ItemSketchFloatSerDe) SizeOfMany(mem []byte, offsetBytes int, numItems int) (int, error) { + return numItems * 4, nil +} + +func (s ItemSketchFloatSerDe) SerializeOneToSlice(item float32) []byte { + bytes := make([]byte, 4) + binary.LittleEndian.PutUint32(bytes, math.Float32bits(item)) + return bytes +} + +func (s ItemSketchFloatSerDe) SerializeManyToSlice(items []float32) []byte { + if len(items) == 0 { + return []byte{} + } + + bytes := make([]byte, 4*len(items)) + offset := 0 + for _, item := range items { + binary.LittleEndian.PutUint32(bytes[offset:], math.Float32bits(item)) + offset += 4 + } + return bytes +} + +func (s ItemSketchFloatSerDe) DeserializeManyFromSlice(mem []byte, offsetBytes int, numItems int) ([]float32, error) { + if numItems == 0 { + return []float32{}, nil + } + + array := make([]float32, 0, numItems) + for i := 0; i < numItems; i++ { + array = append(array, math.Float32frombits(binary.LittleEndian.Uint32(mem[offsetBytes:]))) + offsetBytes += 4 + } + return array, nil +} diff --git a/kll/items_sketch_serialization_test.go b/kll/items_sketch_serialization_test.go new file mode 100644 index 0000000..6896fd0 --- /dev/null +++ b/kll/items_sketch_serialization_test.go @@ -0,0 +1,535 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package kll + +import ( + "fmt" + "os" + "strconv" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/apache/datasketches-go/common" + "github.com/apache/datasketches-go/internal" +) + +func TestGenerateGoFiles(t *testing.T) { + if len(os.Getenv(internal.DSketchTestGenerateGo)) == 0 { + t.Skipf("%s not set", internal.DSketchTestGenerateGo) + } + + os.MkdirAll(internal.GoPath, 0755) + + nArr := []int{0, 1, 10, 100, 1000, 10000, 100000, 1000000} + comparatorString := common.ItemSketchStringComparator(false) + for _, n := range nArr { + digits := numDigits(n) + sk, err := NewKllItemsSketchWithDefault[string](comparatorString, common.ItemSketchStringSerDe{}) + sk.deterministicOffsetForTest = true + assert.NoError(t, err) + for i := 1; i <= n; i++ { + sk.Update(intToFixedLengthString(i, digits)) + } + slc, err := sk.ToSlice() + assert.NoError(t, err) + err = os.WriteFile(fmt.Sprintf("%s/kll_string_n%d_go.sk", internal.GoPath, n), slc, 0644) + assert.NoError(t, err) + } + + comparatorDouble := common.ItemSketchDoubleComparator(false) + for _, n := range nArr { + sk, err := NewKllItemsSketchWithDefault[float64](comparatorDouble, common.ItemSketchDoubleSerDe{}) + sk.deterministicOffsetForTest = true + assert.NoError(t, err) + for i := 1; i <= n; i++ { + sk.Update(float64(i)) + } + slc, err := sk.ToSlice() + assert.NoError(t, err) + err = os.WriteFile(fmt.Sprintf("%s/kll_double_n%d_go.sk", internal.GoPath, n), slc, 0644) + assert.NoError(t, err) + } + + comparatorLong := common.ItemSketchLongComparator(false) + for _, n := range nArr { + sk, err := NewKllItemsSketchWithDefault[int64](comparatorLong, common.ItemSketchLongSerDe{}) + sk.deterministicOffsetForTest = true + assert.NoError(t, err) + for i := 1; i <= n; i++ { + sk.Update(int64(i)) + } + slc, err := sk.ToSlice() + assert.NoError(t, err) + err = os.WriteFile(fmt.Sprintf("%s/kll_long_n%d_go.sk", internal.GoPath, n), slc, 0644) + assert.NoError(t, err) + } + + comparatorFloat := common.ItemSketchFloatComparator(false) + for _, n := range nArr { + sk, err := NewKllItemsSketchWithDefault[float32](comparatorFloat, common.ItemSketchFloatSerDe{}) + sk.deterministicOffsetForTest = true + assert.NoError(t, err) + for i := 1; i <= n; i++ { + sk.Update(float32(i)) + } + slc, err := sk.ToSlice() + assert.NoError(t, err) + err = os.WriteFile(fmt.Sprintf("%s/kll_float_n%d_go.sk", internal.GoPath, n), slc, 0644) + assert.NoError(t, err) + } +} + +func TestJavaCompat(t *testing.T) { + t.Run("Java KLL String", func(t *testing.T) { + nArr := []int{0, 1, 10, 100, 1000, 10000, 100000, 1000000} + serde := common.ItemSketchStringSerDe{} + comparatorString := common.ItemSketchStringComparator(false) + for _, n := range nArr { + digits := numDigits(n) + filename := fmt.Sprintf("%s/kll_string_n%d_java.sk", internal.JavaPath, n) + // Skip if file doesn't exist + if _, err := os.Stat(filename); os.IsNotExist(err) { + t.Skipf("Java file not found: %s", filename) + return + } + bytes, err := os.ReadFile(filename) + assert.NoError(t, err) + sketch, err := NewKllItemsSketchFromSlice[string](bytes, comparatorString, serde) + if err != nil { + return + } + + assert.Equal(t, sketch.GetK(), uint16(200)) + if n == 0 { + assert.True(t, sketch.IsEmpty()) + } else { + assert.False(t, sketch.IsEmpty()) + } + + if n > 100 { + assert.True(t, sketch.IsEstimationMode()) + } else { + assert.False(t, sketch.IsEstimationMode()) + } + + if n > 0 { + minV, err := sketch.GetMinItem() + assert.NoError(t, err) + assert.Equal(t, minV, intToFixedLengthString(1, digits)) + + maxV, err := sketch.GetMaxItem() + assert.NoError(t, err) + assert.Equal(t, maxV, intToFixedLengthString(n, digits)) + + weight := int64(0) + it := sketch.GetIterator() + compareFn := comparatorString + for it.Next() { + qut := it.GetQuantile() + assert.True(t, compareFn(minV, qut) || minV == qut, fmt.Sprintf("min: \"%v\" \"%v\"", minV, qut)) + assert.True(t, !compareFn(maxV, qut) || maxV == qut, fmt.Sprintf("max: \"%v\" \"%v\"", maxV, qut)) + weight += it.GetWeight() + } + assert.Equal(t, weight, int64(n)) + } + } + }) + + t.Run("Java KLL Double", func(t *testing.T) { + nArr := []int{0, 1, 10, 100, 1000, 10000, 100000, 1000000} + serde := common.ItemSketchDoubleSerDe{} + comparatorDouble := common.ItemSketchDoubleComparator(false) + for _, n := range nArr { + filename := fmt.Sprintf("%s/kll_double_n%d_java.sk", internal.JavaPath, n) + // Skip if file doesn't exist + if _, err := os.Stat(filename); os.IsNotExist(err) { + t.Skipf("Java file not found: %s", filename) + return + } + bytes, err := os.ReadFile(filename) + assert.NoError(t, err) + sketch, err := NewKllItemsSketchFromSlice[float64](bytes, comparatorDouble, serde) + if err != nil { + return + } + + assert.Equal(t, sketch.GetK(), uint16(200)) + if n == 0 { + assert.True(t, sketch.IsEmpty()) + } else { + assert.False(t, sketch.IsEmpty()) + } + + if n > 100 { + assert.True(t, sketch.IsEstimationMode()) + } else { + assert.False(t, sketch.IsEstimationMode()) + } + + if n > 0 { + minV, err := sketch.GetMinItem() + assert.NoError(t, err) + assert.Equal(t, minV, float64(1)) + + maxV, err := sketch.GetMaxItem() + assert.NoError(t, err) + assert.Equal(t, maxV, float64(n)) + + weight := int64(0) + it := sketch.GetIterator() + for it.Next() { + qut := it.GetQuantile() + assert.True(t, comparatorDouble(minV, qut) || minV == qut, fmt.Sprintf("min: \"%v\" \"%v\"", minV, qut)) + assert.True(t, !comparatorDouble(maxV, qut) || maxV == qut, fmt.Sprintf("max: \"%v\" \"%v\"", maxV, qut)) + weight += it.GetWeight() + } + assert.Equal(t, weight, int64(n)) + } + } + }) + + t.Run("Java KLL Long", func(t *testing.T) { + nArr := []int{0, 1, 10, 100, 1000, 10000, 100000, 1000000} + serde := common.ItemSketchLongSerDe{} + comparatorLong := common.ItemSketchLongComparator(false) + for _, n := range nArr { + filename := fmt.Sprintf("%s/kll_long_n%d_java.sk", internal.JavaPath, n) + // Skip if file doesn't exist + if _, err := os.Stat(filename); os.IsNotExist(err) { + t.Skipf("Java file not found: %s", filename) + return + } + bytes, err := os.ReadFile(filename) + assert.NoError(t, err) + sketch, err := NewKllItemsSketchFromSlice[int64](bytes, comparatorLong, serde) + if err != nil { + return + } + + assert.Equal(t, sketch.GetK(), uint16(200)) + if n == 0 { + assert.True(t, sketch.IsEmpty()) + } else { + assert.False(t, sketch.IsEmpty()) + } + + if n > 100 { + assert.True(t, sketch.IsEstimationMode()) + } else { + assert.False(t, sketch.IsEstimationMode()) + } + + if n > 0 { + minV, err := sketch.GetMinItem() + assert.NoError(t, err) + assert.Equal(t, minV, int64(1)) + + maxV, err := sketch.GetMaxItem() + assert.NoError(t, err) + assert.Equal(t, maxV, int64(n)) + + weight := int64(0) + it := sketch.GetIterator() + for it.Next() { + qut := it.GetQuantile() + assert.True(t, comparatorLong(minV, qut) || minV == qut, fmt.Sprintf("min: \"%v\" \"%v\"", minV, qut)) + assert.True(t, !comparatorLong(maxV, qut) || maxV == qut, fmt.Sprintf("max: \"%v\" \"%v\"", maxV, qut)) + weight += it.GetWeight() + } + assert.Equal(t, weight, int64(n)) + } + } + }) + + t.Run("Java KLL Float", func(t *testing.T) { + nArr := []int{0, 1, 10, 100, 1000, 10000, 100000, 1000000} + serde := common.ItemSketchFloatSerDe{} + comparatorFloat := common.ItemSketchFloatComparator(false) + for _, n := range nArr { + filename := fmt.Sprintf("%s/kll_float_n%d_java.sk", internal.JavaPath, n) + // Skip if file doesn't exist + if _, err := os.Stat(filename); os.IsNotExist(err) { + t.Skipf("Java file not found: %s", filename) + return + } + bytes, err := os.ReadFile(filename) + assert.NoError(t, err) + sketch, err := NewKllItemsSketchFromSlice[float32](bytes, comparatorFloat, serde) + if err != nil { + return + } + + assert.Equal(t, sketch.GetK(), uint16(200)) + if n == 0 { + assert.True(t, sketch.IsEmpty()) + } else { + assert.False(t, sketch.IsEmpty()) + } + + if n > 100 { + assert.True(t, sketch.IsEstimationMode()) + } else { + assert.False(t, sketch.IsEstimationMode()) + } + + if n > 0 { + minV, err := sketch.GetMinItem() + assert.NoError(t, err) + assert.Equal(t, minV, float32(1)) + + maxV, err := sketch.GetMaxItem() + assert.NoError(t, err) + assert.Equal(t, maxV, float32(n)) + + weight := int64(0) + it := sketch.GetIterator() + for it.Next() { + qut := it.GetQuantile() + assert.True(t, comparatorFloat(minV, qut) || minV == qut, fmt.Sprintf("min: \"%v\" \"%v\"", minV, qut)) + assert.True(t, !comparatorFloat(maxV, qut) || maxV == qut, fmt.Sprintf("max: \"%v\" \"%v\"", maxV, qut)) + weight += it.GetWeight() + } + assert.Equal(t, weight, int64(n)) + } + } + }) +} + +func TestCPPCompat(t *testing.T) { + // Note: CPP KLL String sketches use unpadded strings (e.g., "1", "10", "100") + // with numeric ordering, unlike Java/Go which use space-padded fixed-length strings + // with lexicographic ordering. + t.Run("CPP KLL String", func(t *testing.T) { + nArr := []int{0, 1, 10, 100, 1000, 10000, 100000, 1000000} + serde := common.ItemSketchStringSerDe{} + comparatorString := common.ItemSketchStringComparator(false) + for _, n := range nArr { + filename := fmt.Sprintf("%s/kll_string_n%d_cpp.sk", internal.CppPath, n) + // Skip if file doesn't exist + if _, err := os.Stat(filename); os.IsNotExist(err) { + t.Skipf("C++ file not found: %s", filename) + return + } + bytes, err := os.ReadFile(filename) + assert.NoError(t, err) + sketch, err := NewKllItemsSketchFromSlice[string](bytes, comparatorString, serde) + if err != nil { + return + } + + assert.Equal(t, sketch.GetK(), uint16(200)) + if n == 0 { + assert.True(t, sketch.IsEmpty()) + } else { + assert.False(t, sketch.IsEmpty()) + } + + if n > 100 { + assert.True(t, sketch.IsEstimationMode()) + } else { + assert.False(t, sketch.IsEstimationMode()) + } + + if n > 0 { + minV, err := sketch.GetMinItem() + assert.NoError(t, err) + assert.Equal(t, minV, strconv.Itoa(1)) + + maxV, err := sketch.GetMaxItem() + assert.NoError(t, err) + assert.Equal(t, maxV, strconv.Itoa(n)) + + weight := int64(0) + it := sketch.GetIterator() + // CPP sketches use numeric ordering for strings, so use a numeric comparator for bounds checks + numericLess := func(a, b string) bool { + ai, _ := strconv.Atoi(a) + bi, _ := strconv.Atoi(b) + return ai < bi + } + for it.Next() { + qut := it.GetQuantile() + assert.True(t, numericLess(minV, qut) || minV == qut, fmt.Sprintf("min: \"%v\" \"%v\"", minV, qut)) + assert.True(t, !numericLess(maxV, qut) || maxV == qut, fmt.Sprintf("max: \"%v\" \"%v\"", maxV, qut)) + weight += it.GetWeight() + } + assert.Equal(t, weight, int64(n)) + } + } + }) + + t.Run("CPP KLL Double", func(t *testing.T) { + nArr := []int{0, 1, 10, 100, 1000, 10000, 100000, 1000000} + serde := common.ItemSketchDoubleSerDe{} + comparatorDouble := common.ItemSketchDoubleComparator(false) + for _, n := range nArr { + filename := fmt.Sprintf("%s/kll_double_n%d_cpp.sk", internal.CppPath, n) + // Skip if file doesn't exist + if _, err := os.Stat(filename); os.IsNotExist(err) { + t.Skipf("C++ file not found: %s", filename) + return + } + bytes, err := os.ReadFile(filename) + assert.NoError(t, err) + sketch, err := NewKllItemsSketchFromSlice[float64](bytes, comparatorDouble, serde) + if err != nil { + return + } + + assert.Equal(t, sketch.GetK(), uint16(200)) + if n == 0 { + assert.True(t, sketch.IsEmpty()) + } else { + assert.False(t, sketch.IsEmpty()) + } + + if n > 100 { + assert.True(t, sketch.IsEstimationMode()) + } else { + assert.False(t, sketch.IsEstimationMode()) + } + + if n > 0 { + minV, err := sketch.GetMinItem() + assert.NoError(t, err) + assert.Equal(t, minV, float64(1)) + + maxV, err := sketch.GetMaxItem() + assert.NoError(t, err) + assert.Equal(t, maxV, float64(n)) + + weight := int64(0) + it := sketch.GetIterator() + for it.Next() { + qut := it.GetQuantile() + assert.True(t, comparatorDouble(minV, qut) || minV == qut, fmt.Sprintf("min: \"%v\" \"%v\"", minV, qut)) + assert.True(t, !comparatorDouble(maxV, qut) || maxV == qut, fmt.Sprintf("max: \"%v\" \"%v\"", maxV, qut)) + weight += it.GetWeight() + } + assert.Equal(t, weight, int64(n)) + } + } + }) + + t.Run("CPP KLL Long", func(t *testing.T) { + nArr := []int{0, 1, 10, 100, 1000, 10000, 100000, 1000000} + serde := common.ItemSketchLongSerDe{} + comparatorLong := common.ItemSketchLongComparator(false) + for _, n := range nArr { + filename := fmt.Sprintf("%s/kll_long_n%d_cpp.sk", internal.CppPath, n) + // Skip if file doesn't exist + if _, err := os.Stat(filename); os.IsNotExist(err) { + t.Skipf("C++ file not found: %s", filename) + return + } + bytes, err := os.ReadFile(filename) + assert.NoError(t, err) + sketch, err := NewKllItemsSketchFromSlice[int64](bytes, comparatorLong, serde) + if err != nil { + return + } + + assert.Equal(t, sketch.GetK(), uint16(200)) + if n == 0 { + assert.True(t, sketch.IsEmpty()) + } else { + assert.False(t, sketch.IsEmpty()) + } + + if n > 100 { + assert.True(t, sketch.IsEstimationMode()) + } else { + assert.False(t, sketch.IsEstimationMode()) + } + + if n > 0 { + minV, err := sketch.GetMinItem() + assert.NoError(t, err) + assert.Equal(t, minV, int64(1)) + + maxV, err := sketch.GetMaxItem() + assert.NoError(t, err) + assert.Equal(t, maxV, int64(n)) + + weight := int64(0) + it := sketch.GetIterator() + for it.Next() { + qut := it.GetQuantile() + assert.True(t, comparatorLong(minV, qut) || minV == qut, fmt.Sprintf("min: \"%v\" \"%v\"", minV, qut)) + assert.True(t, !comparatorLong(maxV, qut) || maxV == qut, fmt.Sprintf("max: \"%v\" \"%v\"", maxV, qut)) + weight += it.GetWeight() + } + assert.Equal(t, weight, int64(n)) + } + } + }) + + t.Run("CPP KLL Float", func(t *testing.T) { + nArr := []int{0, 1, 10, 100, 1000, 10000, 100000, 1000000} + serde := common.ItemSketchFloatSerDe{} + comparatorFloat := common.ItemSketchFloatComparator(false) + for _, n := range nArr { + filename := fmt.Sprintf("%s/kll_float_n%d_cpp.sk", internal.CppPath, n) + // Skip if file doesn't exist + if _, err := os.Stat(filename); os.IsNotExist(err) { + t.Skipf("C++ file not found: %s", filename) + return + } + bytes, err := os.ReadFile(filename) + assert.NoError(t, err) + sketch, err := NewKllItemsSketchFromSlice[float32](bytes, comparatorFloat, serde) + if err != nil { + return + } + + assert.Equal(t, sketch.GetK(), uint16(200)) + if n == 0 { + assert.True(t, sketch.IsEmpty()) + } else { + assert.False(t, sketch.IsEmpty()) + } + + if n > 100 { + assert.True(t, sketch.IsEstimationMode()) + } else { + assert.False(t, sketch.IsEstimationMode()) + } + + if n > 0 { + minV, err := sketch.GetMinItem() + assert.NoError(t, err) + assert.Equal(t, minV, float32(1)) + + maxV, err := sketch.GetMaxItem() + assert.NoError(t, err) + assert.Equal(t, maxV, float32(n)) + + weight := int64(0) + it := sketch.GetIterator() + for it.Next() { + qut := it.GetQuantile() + assert.True(t, comparatorFloat(minV, qut) || minV == qut, fmt.Sprintf("min: \"%v\" \"%v\"", minV, qut)) + assert.True(t, !comparatorFloat(maxV, qut) || maxV == qut, fmt.Sprintf("max: \"%v\" \"%v\"", maxV, qut)) + weight += it.GetWeight() + } + assert.Equal(t, weight, int64(n)) + } + } + }) +} diff --git a/kll/items_sletch_serialization_test.go b/kll/items_sletch_serialization_test.go deleted file mode 100644 index e380066..0000000 --- a/kll/items_sletch_serialization_test.go +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package kll - -import ( - "fmt" - "os" - "testing" - - "github.com/stretchr/testify/assert" - - "github.com/apache/datasketches-go/common" - "github.com/apache/datasketches-go/internal" -) - -func TestGenerateGoFiles(t *testing.T) { - if len(os.Getenv(internal.DSketchTestGenerateGo)) == 0 { - t.Skipf("%s not set", internal.DSketchTestGenerateGo) - } - - os.MkdirAll(internal.GoPath, 0755) - - nArr := []int{0, 1, 10, 100, 1000, 10000, 100000, 1000000} - comparatorString := common.ItemSketchStringComparator(false) - for _, n := range nArr { - digits := numDigits(n) - sk, err := NewKllItemsSketchWithDefault[string](comparatorString, common.ItemSketchStringSerDe{}) - sk.deterministicOffsetForTest = true - assert.NoError(t, err) - for i := 1; i <= n; i++ { - sk.Update(intToFixedLengthString(i, digits)) - } - slc, err := sk.ToSlice() - assert.NoError(t, err) - err = os.WriteFile(fmt.Sprintf("%s/kll_string_n%d_go.sk", internal.GoPath, n), slc, 0644) - assert.NoError(t, err) - } - - comparatorDouble := common.ItemSketchDoubleComparator(false) - for _, n := range nArr { - sk, err := NewKllItemsSketchWithDefault[float64](comparatorDouble, common.ItemSketchDoubleSerDe{}) - sk.deterministicOffsetForTest = true - assert.NoError(t, err) - for i := 1; i <= n; i++ { - sk.Update(float64(i)) - } - slc, err := sk.ToSlice() - assert.NoError(t, err) - err = os.WriteFile(fmt.Sprintf("%s/kll_double_n%d_go.sk", internal.GoPath, n), slc, 0644) - assert.NoError(t, err) - } - - comparatorLong := common.ItemSketchLongComparator(false) - for _, n := range nArr { - sk, err := NewKllItemsSketchWithDefault[int64](comparatorLong, common.ItemSketchLongSerDe{}) - sk.deterministicOffsetForTest = true - assert.NoError(t, err) - for i := 1; i <= n; i++ { - sk.Update(int64(i)) - } - slc, err := sk.ToSlice() - assert.NoError(t, err) - err = os.WriteFile(fmt.Sprintf("%s/kll_long_n%d_go.sk", internal.GoPath, n), slc, 0644) - assert.NoError(t, err) - } -} - -func TestJavaCompat(t *testing.T) { - t.Run("Java KLL String", func(t *testing.T) { - nArr := []int{0, 1, 10, 100, 1000, 10000, 100000, 1000000} - serde := common.ItemSketchStringSerDe{} - comparatorString := common.ItemSketchStringComparator(false) - for _, n := range nArr { - digits := numDigits(n) - filename := fmt.Sprintf("%s/kll_string_n%d_java.sk", internal.JavaPath, n) - // Skip if file doesn't exist - if _, err := os.Stat(filename); os.IsNotExist(err) { - t.Skipf("Java file not found: %s", filename) - return - } - bytes, err := os.ReadFile(filename) - assert.NoError(t, err) - sketch, err := NewKllItemsSketchFromSlice[string](bytes, comparatorString, serde) - if err != nil { - return - } - - assert.Equal(t, sketch.GetK(), uint16(200)) - if n == 0 { - assert.True(t, sketch.IsEmpty()) - } else { - assert.False(t, sketch.IsEmpty()) - } - - if n > 100 { - assert.True(t, sketch.IsEstimationMode()) - } else { - assert.False(t, sketch.IsEstimationMode()) - } - - if n > 0 { - minV, err := sketch.GetMinItem() - assert.NoError(t, err) - assert.Equal(t, minV, intToFixedLengthString(1, digits)) - - maxV, err := sketch.GetMaxItem() - assert.NoError(t, err) - assert.Equal(t, maxV, intToFixedLengthString(n, digits)) - - weight := int64(0) - it := sketch.GetIterator() - compareFn := comparatorString - for it.Next() { - qut := it.GetQuantile() - assert.True(t, compareFn(minV, qut) || minV == qut, fmt.Sprintf("min: \"%v\" \"%v\"", minV, qut)) - assert.True(t, !compareFn(maxV, qut) || maxV == qut, fmt.Sprintf("max: \"%v\" \"%v\"", maxV, qut)) - weight += it.GetWeight() - } - assert.Equal(t, weight, int64(n)) - } - } - }) - - t.Run("Java KLL Double", func(t *testing.T) { - nArr := []int{0, 1, 10, 100, 1000, 10000, 100000, 1000000} - serde := common.ItemSketchDoubleSerDe{} - comparatorDouble := common.ItemSketchDoubleComparator(false) - for _, n := range nArr { - filename := fmt.Sprintf("%s/kll_double_n%d_java.sk", internal.JavaPath, n) - // Skip if file doesn't exist - if _, err := os.Stat(filename); os.IsNotExist(err) { - t.Skipf("Java file not found: %s", filename) - return - } - bytes, err := os.ReadFile(filename) - assert.NoError(t, err) - sketch, err := NewKllItemsSketchFromSlice[float64](bytes, comparatorDouble, serde) - if err != nil { - return - } - - assert.Equal(t, sketch.GetK(), uint16(200)) - if n == 0 { - assert.True(t, sketch.IsEmpty()) - } else { - assert.False(t, sketch.IsEmpty()) - } - - if n > 100 { - assert.True(t, sketch.IsEstimationMode()) - } else { - assert.False(t, sketch.IsEstimationMode()) - } - - if n > 0 { - minV, err := sketch.GetMinItem() - assert.NoError(t, err) - assert.Equal(t, minV, float64(1)) - - maxV, err := sketch.GetMaxItem() - assert.NoError(t, err) - assert.Equal(t, maxV, float64(n)) - - weight := int64(0) - it := sketch.GetIterator() - for it.Next() { - qut := it.GetQuantile() - assert.True(t, comparatorDouble(minV, qut) || minV == qut, fmt.Sprintf("min: \"%v\" \"%v\"", minV, qut)) - assert.True(t, !comparatorDouble(maxV, qut) || maxV == qut, fmt.Sprintf("max: \"%v\" \"%v\"", maxV, qut)) - weight += it.GetWeight() - } - assert.Equal(t, weight, int64(n)) - } - } - }) - - t.Run("Java KLL Long", func(t *testing.T) { - nArr := []int{0, 1, 10, 100, 1000, 10000, 100000, 1000000} - serde := common.ItemSketchLongSerDe{} - comparatorLong := common.ItemSketchLongComparator(false) - for _, n := range nArr { - filename := fmt.Sprintf("%s/kll_long_n%d_java.sk", internal.JavaPath, n) - // Skip if file doesn't exist - if _, err := os.Stat(filename); os.IsNotExist(err) { - t.Skipf("Java file not found: %s", filename) - return - } - bytes, err := os.ReadFile(filename) - assert.NoError(t, err) - sketch, err := NewKllItemsSketchFromSlice[int64](bytes, comparatorLong, serde) - if err != nil { - return - } - - assert.Equal(t, sketch.GetK(), uint16(200)) - if n == 0 { - assert.True(t, sketch.IsEmpty()) - } else { - assert.False(t, sketch.IsEmpty()) - } - - if n > 100 { - assert.True(t, sketch.IsEstimationMode()) - } else { - assert.False(t, sketch.IsEstimationMode()) - } - - if n > 0 { - minV, err := sketch.GetMinItem() - assert.NoError(t, err) - assert.Equal(t, minV, int64(1)) - - maxV, err := sketch.GetMaxItem() - assert.NoError(t, err) - assert.Equal(t, maxV, int64(n)) - - weight := int64(0) - it := sketch.GetIterator() - for it.Next() { - qut := it.GetQuantile() - assert.True(t, comparatorLong(minV, qut) || minV == qut, fmt.Sprintf("min: \"%v\" \"%v\"", minV, qut)) - assert.True(t, !comparatorLong(maxV, qut) || maxV == qut, fmt.Sprintf("max: \"%v\" \"%v\"", maxV, qut)) - weight += it.GetWeight() - } - assert.Equal(t, weight, int64(n)) - } - } - }) -} diff --git a/serialization_test_data/cpp_generated_files/kll_double_n1000000_cpp.sk b/serialization_test_data/cpp_generated_files/kll_double_n1000000_cpp.sk index 43015c27d2e6485b0b2f249c9d44ebdbb7973f65..d27acdb84abbad5fd2d9792139371ecbcd7529aa 100644 GIT binary patch literal 5000 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 diff --git a/serialization_test_data/cpp_generated_files/kll_double_n100000_cpp.sk b/serialization_test_data/cpp_generated_files/kll_double_n100000_cpp.sk index 560be1eba6a231fe9b28bed92984dcb970aa9bed..6dfe3a5f8cfddc9323551251c6c2fcb6737e087b 100644 GIT binary patch literal 4728 zcmYk)4Uko39mnwpY%|?4ZlmZVE1a?>hoo-hGP>@@LBWWij>X%;?sBNifSkFFgHXHM zJY&W*n9dzzU;@@oWTpgmtc4}GtB*ps;X)T&7TFg$YNqn$Roq40C0ft-*GzZj%x8Z8 z-}#^CzLkv{V>-;oOtgBG`S8_YE-@F4I7V0Xh#y{cBiFW(t7qiu9l3awrlc-=&;Nf* zOUa2WN+)9($-J~OCqo&?%q*VkH=vbHn#Jm+l}?&az0Ap2nkDL`l}?)Ps+W;WWafMH zfy~RI%zR(H%*&$8+@W6PWl?5+pk78Yk=Z-xb264Cnf;-98OxH){_p$$D)-qby5E;m z2)+G;UG^Vex%AgzmJFo-zsyzyc*2}%zs+*&tP&Lx=Coigtr~4`HwlqYdgG#&GjH z>Gy2>WoVkwuEt+Jhzou#*UODK>$mvG?{M?)amyd@u|LYk@zFow=56xNcqqo_p2Uv7 z;Qqhj!B#A8$HP1DP@D2j`8O=?!WVXHUcl~l?0QQ1=~TPSkx!#t{tWpIdFQj_H_^`7 zlV;m3=k29GhIann$-T0EpEBCo=X5{X1s%$07yLsRZS8*YakPt{C%+==JIVcM>ksID zx%ePCLA&^$X|~7FeX&TNLmQ)eOF4Up`&XgaDbJy+JWRh5O`9A|i|#8&(%#*Teyj56?sRUZp}h~?9`rwQH0|wFc`y2V(3HK%xzpr*X!a?W z9pl_v<x--xaa{rAwTNa(9ES%kI;-6rJ%dVQD-plhju%fZuAE*9Q#_jA6258hu%uG>(SqV(Gd)X(N+9A-A`)J)XQeHEz0fa z_hT}QUd8L_zO6=6C!5f3L03Sp7n2V#9QOwA|7Nsx7&a+yQeQyRr~W_c$G@5Gn<*I8 zq1TLli{=H{hi+K8;zYXd*I?Ly_Gg;6pxcf~m*xZLU2!tq_bM@(i*|)vi{W;81f#Q< zj6Id^+sSesx_i)Dhfy2)M>Ri>$@tUy{1`Q$*NjPvayyznw1eueIK%s&jL}?lE6}c$ ztr&JG51>Ext#m)SLC!(50>ibkRd%5p!1&S<`&VOWBF0s6CWebJzZ`=`G!J0Xf^Hky zc8m{TsUM>=m<(xt+1u&)rE9P_3FDhFGYkDXG(W;@Bf9%B+Nk+f3=0@^YTl3L6newx z%HK)PkH?{zh+Y+DW@4}q?J^9TF#9XH38O8_yU{+6@iEMt#N-1kUV1h?Ke!4@pF?w_ z<})x;tNBtatwMhd+6|cBg267#?Z>1?o&mD7H6Veh}q>BG%Bw_ z_Zv(e$9y|R2QchM?=X1-Jx0|S&%&e*!@Droto{KkwqWK74BIj3lzoH#e*sypzPA7X literal 4728 zcmYk)50F)59mesOG+4)qYsw!Ta?UigxDa$1i51g06^Jlt*OFx=z=OcKI zXUbq|Xl`0dS}~`zb{8R!E3inQFDNV^=!IZ+L%|~g`^OcJ;<7Zx*m}MXGu@dppLu@I z{hfF2x#!b^hMGO5#Du>bWIp-qF_)Q31{|vErU5^><_%mM2Ckz6*XsippJZxk?Ro$I zP3|SfvM8O5WGD;L%DfC@PWlVDua!=kyP0QYUPdyx*av(sFC*zKWFE*+#?re-z0Au< zCNjH7_m`1OWOlK78OcOum(W}3q^V-=%e;(aaz0-;;NuH(OR{K1Wt+ewUmp zzps9t@_ecHDLHd4eV_g1{i$Jyg}*94h55guZItUYUysFqU>qqoD{qvWHQ%DVRc@0n zpxJ@RPV{zRxLfW)yAR|2@>PtA@{l}?u1&c^9+hv%q{^JSG!lR`cu8`>HHge}lYH^P4fVq%VE{ytBNIUcdYZgO4$D z3D3z4!R+PAL(#hue<_-E==Y#2JI4L1(KVs%k`s=ny}2LVdbGXD6W(M$ zk9M7MFNVWo&M!wd2jk_k9{m>d+BEM&H|(u+-`|^sebl*S9@dlY z2b0mOKz{|skD=M9{)p^D|EhP`pM>sCv=5;FJN3MTQ`4ZZ<)t8(}_q{P_W}>UXc$IP!+P&y?V>sl!bl<-Y z-3&A}a+UgZaxaG67+jj9`}wQTjKXGWku2F(;K-ilEr+8WH%VRjX|KVYFjxdr1^3_8$uVRRmgB_E{c=dPCHFn=Qk zv#>Z9-BR=(#_Vd0|D?VJZ7b$FFzCeWc`THiP0vk6q8W?DDVU#yZVo2Z7_Y!^CFa&B zH(<6!wqnq(+^Kv{4*rn;eK-cCn4OH#Ef`iPSD{^wg_UU5px=P`7W8&&-llvSi+vaj z>EpSNz|0s~j@}FmE0ph(52IO){-2dMV6YwY2h<3$g7zW@=g*q03h@hj0Y$6d60SPWas3;XMSdbtZ17(p_pnz;*rNcH9R0_)K zLR*zpg`$FpTA+qWCCKta5);DW64_*xxDgP09uiM-^2~eRocZqD%>0;YRj!XJqF7X` zSyZ_yqVy{%ifUfj_g~p#?a5WHyr^7fI#yEfP3Hei%$Au*%1q1(IdQbS@?4^?+>bfz z&jB3BL42NrIfO$wjKevCFK{GBaWr!|hGRL7FLFF5a3UuKqn9{^FEfv?a4Pee;51I> z49?`$=XlI>Ji*_1nrC^Q7x)MN3Pu-siIF*Jtjcu8n86yX$y%(_Uyn+cH(2qVi$G`M%|gsp6tcm?89gI9Q_WWu^Tg^ z|JF1vU8?iMXVNVX=SWe>tmT&{Nb03fJETbP+*W-^;O z%w;|cS;SIq<6a)-8Ae~3&xUNpj?88bbD7WiEM_UoxSI!gikDdP>u?|Sc@H1vlkCS_ z=ChE+Eai6YRZEo)ME>_XLt7H zXinukF6TOyaW@b06fg1GZI$yAHF*SN60DtC5{?3c6x;=dU8mz+@&#*s-1*0*X z%!Gb63%P_vTosH;x!LtHrnsB?gV7=W$|#l@Rj!V~M0RjnALaxP58}{ZG?HUDj^jCz zlR1TXoXP~JaXM#kCTB6p*}*@rS|HEiT)xWJ_&VpYFqk(#c#(MvWahmQa-BDW3t4BO z%=n^^momOsW_*dv_)?kiWisP$$*l8s$O{>NN6+}XGULl-#*1XuC=NM`Nv0Sp34Iq9 zu!6Do^h`3v^!G!b#UxWq|3J?qQ%ql>XObz#R))R{3s}L}Dm@EW!Psg&3s}L}8a)eG z!Pr_or?Z@CABMgYr?Z@CAL%)hDW-oM`Ya~7i#67Tz8mLqCo|UTIhVVbUK;wQ?99QO z#TDGaUzo8WoNvyq9L_mh!<{_Nj8B|rR}NzVSF?gg8T&MxZ^p+toO8H_J9&)PeP%wp VaRldbEqC$+tNY({H=o#;`7gDrGgbfq literal 4372 zcmYk;+8P~Ha2Bjc4G>Ma4csrpYQNfe$7Ij;$>Fa8s;bPZnk4r zKFOhsIh%|5F1Pa={=_r9;nOhpX4YjhcHrZDnj<)cbGd>A+{G_>m_(pO z`x7~xIr=;<<2r5(#+$i=d%2%Sg3-?`wtt2f?3dggp1%UC@K)ZzCc(HFAGDvuN7;k@ zIFRYVIFn;InKPNoMO@DHEZ|n|;yxY>Muj}isC8m=ZN*)K+j=o2*na?@V;Wx!zBh~+ z%;ZRp4j#+m7>)~`jyawaIFXY$nNv8G*__5#IX(E@49?^%z7|ZM9V}-0>oU{d2ze)y za%3jW33(5bb7dyam6<$GX7YTQNee>W$)q=BCNFe9+vJ73g>4qeY?CiDadF7oSbs^# zgSdjn+3>B<59TVKWW%@hT*Z@YyfpNwT*D$ZUZ&>~9%I7t(5En;g{-q8^!>Sng-lrK zJo8z|gjIUxvycg^^~~on)>#w!e$3+!ti4vxJRWAPb)oOWB|OGD>&<6Ai+R^Op-<%+ z7P0ZWdahv+tGyTc``MG3%w++;faLO(Q>Jw3a!Q8vM}ei}^PgY8rB_(F{kA)bp(u;-N^$ENiYvwS%e%iWKY!0Z zU4BpZ-@2{-tp4YryySwB2MjD(@Zyj8c@szOdCts%XFO%k9k)DTV#f`S*|Oo9N36MG z#X~N+VB`SQ?zrU%6FY8r%$5z;JYvliD;{#m1tSj_ShC>7 zP3PyxJ!@2Zp|(C zj9=-w<(~0tJ-6I5exv7>dxp*2FIlr?V$aNp;ahvwY?;_Ib7J_;o;6!0_RO3ZzORaZ zuO(}?OzfFCG5lc9nk^H1W=;%0+OuZM#GaWG!%z0C*)p+b=EU%`J!>}XxZ}W)WjF5^ xT(M!t9S4pqf3fF^4Lj~QaAf(bJy&elamRrp%irv|V#AI*4jftfA6(q5{sC!3g!%vg literal 2640 zcmY+_IgH#?00!WPqDby=x#gBqx}cZ>i4j7`LI|0ALkO5~ncLh80WuH{=OA&p<(4jA zx#bohxpcYZlrCSnB}@EKU}@&_?_a;ASB&QJBaenLWMRG(9$sU(6s}*~{dMvAdwF#6 zot}7jyLqtrpKH0`iu>GS&WwTQ_m}r2&fM{g6Gxu%gpmV}dBmO_w>)IahBXgZvE+tp z7F=%}d@TQb9Snc;1j;T@UbU76uMnc;nz zp^+IrSaQwXfBD1Z`HuBRGV70J)}P3%Kb2X3CbMXl+%ht;_*~D(#NrD*BNK}+^^8m` zzS1)?vG`ig$i(6sJtGr~Z}p5!EDrUIOf0_BGcvLGUeCzH%I~b_#QcY4SFz{B{6{@| zPRxJOv**P8rk*_~X4|D-v1G%J14quxezs@Hh8+ivoSFS%&yo#04jef%yR`}bUMrSt z*m2;zbv-|ShkVaI_ZXJ)_Kvt+}L14qux{;+4smOUdUCg$C;FIcf< s&&Y|1`E7evY}qq%Vq$*Bo)ug6jGUO5-?eAOmOUdUCg%PJi+h`Y0AQJcNB{r; diff --git a/serialization_test_data/cpp_generated_files/kll_float_n0_cpp.sk b/serialization_test_data/cpp_generated_files/kll_float_n0_cpp.sk new file mode 100644 index 0000000000000000000000000000000000000000..afd22092750c5d702e919a588da4c9fa7e9e8c8c GIT binary patch literal 8 PcmZQ#lc4-??}0 zy>mN6^$_Pov``9qh@XDvL^sinwHwo&>CFsb5||Vwi>YGj{!eq15PxBWFeiw_TKt5c zPz#T78Hb55He)d+V=!(!`v%q`Fr*e5V=*oh;F!kf1GomGbB;8K<4hoq$1onF4`yX_ ziIvfQs@Ik2#&vq||MuiQVt7oSS}6TEr$6VM2*bJ_hG=1Kg%P;JdXIS!hV(cLIg0Cb zV4mjjhif1ghv3Z$!7mFzTFhD*f^4vFLkRBH5X6oU?AJrk-)4I+#~YZ#Aq1M(car%t z=U?KnUo+ov>~;uRYY5I0wmXHP^$0`n8-@`VhM5$GlfivtvwwUTZjgJO7Di+?$LFzc z5o-m1ujQPL+_TC3@8EH}IQACjzR&Rnj{S~nHnHy%&!?I5E;3ibP)06=zu4e8)WBF* z1ATi9#BQGBz8bh6vwfDiR0Hig`|j01=@^31I|M6-FrJx! zNcjZFdnO=oc>=5f3gr0;v^@%}OA4gE6A{oS@?M{b5LRXp?CK&ody8OQErORc2~yQ0Ctu+WDG=+Y@ZOyQIMIT8rW4OohFHsh7CV)1XyNL*&D0F#Kt-GpEB^IUVMq>5%;C@G>h8F&l339B3=&z}e4wV-DohGAOIcAnMED z{ELz2BCvKY+>ho$y3O{;d9ZTlLE6mPG!I(aJczvcu(r;J=gf!lWIpViau}P+`A#e6 z^H&Zje*yH(3t)V*0P+(iZz06yg^>QR5Zf`5<*+U+hX|~IGkFEv9V?)Hu>w|X1@}_{cS{A&rvlEy3i!E|5YJXZ+f~VDypr#n zN+{#2pl_+-Gf)LPrW$@pH3Gk^hIFYKO3X^gWh-I6u@c&)l@NVb@%_6Bfma!K6|}%= zxHDG6d3QAwk2QV`{3UB(?Og-qI@@V$p;WDfwtp?`f3HO()quO)fL?FF{N8|+&iAYp zH%WM}P7+ddPzVZ&UM~d2{k=hP>SRzfTnmc-M5&^srz$oLQN@8wRh%eLMg2@wm`hYq z7g9}mt7@t*sU}`iMZ=q_c;`LUeD8p2I)_wo`j{$?eX5EZpQ+~A3#z#IchzjXs+zZ2 zRN>uG&Fc?Tvt1N9r`nS^7fsHYt|XcQB(BDi($J3_cL0eOB@zb{$*CVk=CL#~-<8QZ zI+~Q7Iiy7L$+@DC;uewf1(7&k%r!I;7fZNC8JQQ$Nqnx8b8#7&ZIz_lT}4V-4Jn1| z$dv2I%-TYt-XyVq8+rB%q`bbJl-)lky?zJj2X~U0`wDqvk&RvCO#TI#c!QMWUy%}g zi*#)dc~jpZF~%mP;C)gie!%)0GHdpey{UoB=YLCL^M__G`YZK{rKOy_!pGf@oQKuvg=gCQICMo7~(mT6kcKIubn2V%z{u}8% zza+2kKS+OknY{a7k@v&bWOn?9^tNlHv|T6jtMACZ)73QpovkfnC~=4p>WVh0#09ia{F1U(@dmh?2gp*r)s zr3;M2u8;?HFuTXX>)so3|2}*N_l4W59|HaRL+kkr M0=))6iXDjm0g@xbtpET3 literal 0 HcmV?d00001 diff --git a/serialization_test_data/cpp_generated_files/kll_float_n100000_cpp.sk b/serialization_test_data/cpp_generated_files/kll_float_n100000_cpp.sk new file mode 100644 index 0000000000000000000000000000000000000000..2288d6a60ee38188decb759da3c8fc931e5c96ea GIT binary patch literal 2392 zcmXZd34G6W9LMpubBWBg5E9A}%|aA&ZvXFxk!x;?mC4*=>V@e&%LF`A+|A`pO~ z6>jY{{fh#uu?TAqA4sS4@N+y%5kk0r3PBH!!xr~E$o64ZZZu1Su zmgvs7A2|j|NJc8saR8^dei66vFY}^%OcnQ-4@DESW!@V@F^2h6Br{$`?!pnAV}6-@ zfZ#0im9zLCpatV-^g$vfQCmQ+Ah(hG$dmY)@eSnNYrX{kgYsleG(;47pg;Aocn9w@ zUyGfLzrc5lFQd>p^Rw8;^*gAOm&sxo=EE{f(PSd#Gv1DGa0?-yn5utbz9j}?I@aO{ z^(zS3$-9Kk7{1f|JaQ}fHF=vX^{M&iKIOZBL5ydR8*q;CJ+eZk`S46r7mUCnq~kR8 zT(aaslNv|J=R~MkSfsLsM#?Y34xC0VwZZ`%FBed=S^>p|2h_d|VlXJ6obdt0Ck2!+ z8_8T>$~-lolr-!JsM{XupHVx;wbRUhz^~MPp>NKLK)6CvZ z)A~4#?&p*;&}r^aYKczcM=>6Ux1F*lI31njbYhCr{;B-_=}s$WIHk^VT04i@JU%nu zDRUtfIiF2i!JufWGx<+OVZ*VZ|$-ry9s$?5eitYsT(Om`ZT!CH1w z&t$yYsaKZMYuQc%_A@_7{Sf2BILiD>@;G?{C!N}!;_o}d-*=XMI8T1hJjbc>1@`D? zr_hVId>={Yw|hV zt3}@qrB~LbZ-<#mJ#Q*fhu%@wRH7dDzF-QfZ_3+%XG1Tcq3Jx1G%|e|&imik^i>o3 zPg8n8GsewL$6J_=MIh32IAHqR(J#%E+0wMPmFZv_NM(E zxThncO<#91o$1VXu#0I|SDw+$w5L1w_8@!mtQfw7uh5Ts@$BBFv{>?0)27#`_c3jb zV=aAI=j*JYAJ2*BdHq@E0MpTd^o~KMi-YM8LpZMz=rP0Ci{b1~BKw1@BiQ4SU_NPr>CuVwkcsT?Bzo;6)_~!YIYTF# zMoytmPoWPdng1inG+?UvOXxd|GXMjov##l!7w?#UL;MVS`wUa;O!jLg^;vvw7X5g( z>6h7@3v*1D&~GmFxjbi{`Jd*Q;@)MBq4Uk(n$NkmfOlsBXWl~dhZl0rC$rD!u*h@* z(Th0)7IPlHXF7}i@0GiOc?C)CNAGiQ=ogpis{ zc1fislT`A_BsG~NsmWwAsZ1u5$|rtxcK5sg_dL)0?)$!Xd!FtYy+cz-glJ$m`qLDS zH432@Lm2nJiVQD8)vz!;xA>?+9ZCU%$>;KZ#i8Sr;?PB!%mKwAi)?bqBcB2aDWZf? zlrfqyjHi-`Ol3N?%%z^Cq*y~Un`xz;4!TH_=`&@KO)hzq`iyr{K{YijUPgW|D;=cC@*H!?r;rlL z7)uq?sH1^KHqu7Rf%9C3;hd7Aw(P$xuU1gOc;M5-&-HI^uVfc&QSrT#itwcpHYwpNC2Us0*Gkx;9H3&W`&;}TqHmOF zn-YENIS{uh@pnqRU5UR};x;AzL5X)L@sCQ}?(ag*PfEPgJn_#;yi3X1ZJnGw#>BrU zafg!gt945ECPNFQzbU1iO6l*(&_?+_rSuQ;ly)iQf10Oyzi0iI??`k&i4K}4I%G`r zw-Tk5=pQ9ItVI7RiQvqjnkEt%##FP0%wz01DoK&1u$wU{(hSeE4`?KGH>Q#lX$p@u zCPkXU9)6U}4vzG^i$YZv+2oQ(J_Qs~L)F62wy=%u)^@Oy zJ?v#4`>h?~u=mcekGs*G9?8&|peI@MA~N5HzVx$)`ZIu2IgQgf!~gJ^479(_;%v_0 zykr=AJ{NEyL%4{GxrAYiU?fQ{;|i|iDz4#LuH$-c;6`rZW^UnDZsT_D;4Wv<-Q1H5 zjrS!(!#M8e0UqQb9_A4qwV$i(<;R%7<4oiU^OKxwlc{D3Px2H~J%?xXh-aB*{Jeeq t0@Hbs8O)@{zJ7^WUcXE&uNcqfRrelI=l(go##~-!9`jki8!Ti|@;{ZhV6OlG literal 0 HcmV?d00001 diff --git a/serialization_test_data/cpp_generated_files/kll_float_n1000_cpp.sk b/serialization_test_data/cpp_generated_files/kll_float_n1000_cpp.sk new file mode 100644 index 0000000000000000000000000000000000000000..943fd914846e4c61fb13ca016ca05b52fc648f13 GIT binary patch literal 1336 zcmW;Kd#Dd)7{Kx8>^O73&1EigXYR%@ci!Xt%-!7YmofLbUuUIGk|eDqttClXk|aq> zlHP<)k|c>qGKpCdl4fc9IB$LG{l0%a^}HoTb)zDx#na-bJQYzKi`*`8x$>oaSj3No zN_kr$%1H$I2TdZ#TQ!LwZ_y-zyjhb7@+M6p$Qw0@AaBqlg1lan2=Y2jBFJksi6F1h zB!awJlL+!EO(MwOYZ5_TsYwKRg(eZ?<(fp0muV6~UaCn1d5I6=eWpKZt@3z z@{Cu!qsR;;RHrueX+%?6(1s3lraQgp%K(N@$_Pd?o=Hq&7V}uh5>~L9^=xJv+smT7 zoE_|B7rWWRUVh?d_OYK|_>}`3QDB>fEsX_@KQU1TAXmq5ls#`V4nti?6O13Hd|~`XM=TWR9Rz{6)G&V#3BiE z%rZlXX{MN@$OPkzQDB5TLj*tb5#M~#=aUaIUg*)KLz@;&8l=>zQX!#4kpe+K@k5)G Ig!tR#U+XzeRR910 literal 0 HcmV?d00001 diff --git a/serialization_test_data/cpp_generated_files/kll_float_n10_cpp.sk b/serialization_test_data/cpp_generated_files/kll_float_n10_cpp.sk new file mode 100644 index 0000000000000000000000000000000000000000..1fd87d306b9ffe4cd07aacf240342f69aeab5ba6 GIT binary patch literal 72 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 lqr)fYI0Ic~qWh=lF$>*h{IPj~4g8T! zJkDmGd{>uRl@-E}-Q#=zm znqzs+K3-ruFS46g*vA{Z$=e*@UB+9_XeKh16FG%xoWa?g&rB}jvwV?ZE@2LrGmk6z z7T;xrtGS*Zu!x)aF+X9Hr7YtYtl%#0<~OWjHEZ}i5AqNX^C&k?4&H}t+{wK>zh@#1d9A#yU3gEW3D}Lri%z z=uhWDW;2%&7BR{S##qNjo@E!WbBHN3L-$7pGZ|(cBP?Q+6^!vPn|Yo+yv2lBLGNVF zc{jIx4NJje#NazyaBA+K8~?7Dy@ zjIoiO9AtW2@FklOMp?yrcJL0TTSyjHaU1uto*f)uT71yInE5Pb6&u*eL8gzieipEV zF*dV@2?;@NE^}DOa@Mkiy&N?v$j@UA3t7%uwy>88qxJI@u4fr**vuX#+&icZkC}X# zt69owHt`bU#>#UE*RYh;Y~m%xjgx1XtGJDOc#Q2FV0vP3pKL}LWfdFP$w8(k$uq(z ztJuI!4lyG+$cI_L62{obE)Fr{-eGxogjv86#@N7a#-|3kIb6nd+|F-#f|ogRe2|~b zr7UDQYuU^m#y=#_rCiI;xQ{2;%TW`8{5<2Qcg7v}kypZJlp{J{5o#~Hrm8@}c=U-2bh zFvsV7#;2U(6Hf9mCpgYAKH?}J@&WI2g!g!tcbMgE-r`LT^9HZ;8i#n5S9qC&yu^#V zzyY4;Ii6)d&+s%)v5zNtg2&m*V?4?u?BQV^;z4G3fcv?R-Q3GP+|4w1aVK}Mi`%)4 zTR9{kK{+X6h{Y^nn5B%cjODCglrdJaiq))PoVBcDf=Sl1f$N!Hucp5Qn%TluwlT$a zcCeFOOtYIA_OO?I?B@UnImBURIl@s+aEdujbB43bbB^;|;3Ai}%oVOOXb*}QVlhh? zW+@{qV>v4rWsH@qVl`_RXD#cPV3PH0U?ZE@%oet?jVZRXgPrVRn%&H>hrR4$KLy8uNDv6v+cvy>5*v78l*GR8_)v6?lE zvzB#CFv)s0u#rt{W(!-{#uVGx!A^ED&2DDc!(R5Wp937^5QmxN2uC@=DdsrM8O}1# zInHx|i(KL|SGdZcf1rpV7PEw5mNLRJma~FU##qTJR literal 0 HcmV?d00001 diff --git a/serialization_test_data/cpp_generated_files/kll_string_n1000000_cpp.sk b/serialization_test_data/cpp_generated_files/kll_string_n1000000_cpp.sk index 0a286fdd265702f514368c3f4ec5a64149dc1bb3..1026c3d181ef76d75e506adca63c2e3406175f93 100644 GIT binary patch literal 6198 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 diff --git a/serialization_test_data/cpp_generated_files/kll_string_n100000_cpp.sk b/serialization_test_data/cpp_generated_files/kll_string_n100000_cpp.sk index 5166b97aebb0bd0c865c05b8a3055690cf1aef0f..e54381900dc289dd2f5b68a92631aa62ae7bcec9 100644 GIT binary patch literal 5266 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 YLZ7ih`Pv;DV64ceaO6`sx>I=epQrl8xBvhE literal 4337 zcmX|^Tb84@4TLp`C&y2Tci~rFaO1M_<|WRu0^zGzXIh+JswP=Lp@9DR<3FEYpWi=! z{P~&Jug|~w>GSz_|78FCS3iIK_C6a921J&V)1JOgIzHg>&ItI2X=^3*kbz5H5rZ;ZnF1 zE`>|sQn(VXge&1nxDxIO_rOIF*LaJ#KGRD4a}noU;Bte@4K5Y;RJ`+WZYsX1xTfNn zieoB%sko)$m5Ng;KB>55=sv0Yr0!F?Pw74-+!OABs|BtWxLV+9gR3pv5$*_gguB9B z;Y>Ia&V+N}T(}S}gcFYvj}ng(k5c|hc`N0s9&xSz*T+(xm-4$Ouea9V+{nNCn$O+I zlRNovC+_aV*B$-1zuC`2_z*sX58*@j5I*dt~mq_vvNj^gL8cAJ->aS%( zJd1jYqHfxTraq$Zvyk57;WP1+kEeXRm^y3uP2I(VM=p5e!q@wnbN{xl(Pu99&qY1u zrfzc67uwdqZG5`zZQ_xeI&8Y^cjzm5=nrjs;10UYL;dDOw|UWR+ab71pXji$-=*&J zQr~Tp;7mMBJd8M{;TLV66VG&ftiwO?NXM7b@t?L;;lv}vqlNj+Z-($8d?%34@zG5D zG813S#Q(An7+inBN?*=ICn>+pLMK`1BnzEnQMXw-=joiMbDqw5I_K$}$Nnv=(M>J( zuf_gtgL9u+?B8||u1AjVJ!_-G+UT%0I&66gM|^7&-#Wy%4)Ll(yy_6II>f6EJn9nP zmig$ZE;^};PU@nQy6B_~owN;39hRY!GIUagPP$y!&(KLZIw|>j$=6H1Uh?&luU8w} z@NdIn75@| ziT@M-m*nMXPFb2qmgbJ7`C@5~Sel=f=Aey_zP;zXx9{xtw$q$TzNDv9L)ts zbK=pwcQm&h&0k0T`Qj(yRyx0x&8`l?_-$J}YyhFUZpZ}wA_k7>OzV9#o+3)+*EU{*J=ewL^v-m(x4dkAI zTp!4-f!H2M+t&9NEZ=wWy=SpIOZsT+`(9;p0pZ z-4uuCai*Uxno;f16nQi~_K-C3>Tr+CbWu${PTT93?`a!jrE1z_!954}_$%fvRNh0@ z?AK`iwuBN%GDXx_}alM+_x@hNq_fnPj-Z{62H1;#9sf(KZ4A;2!z&Sjw!{a(U zZouOPJbK7uzl6u_cKzjdyDiRI*-ZwVT+QTWoz6Mm*O=|LF&V5Z?r)4qm?4gBydK~=T z-+KIFWy-W9?mg6i>-IR`7cOoO_ilNy-@|>o2@c*D_2i3g=`_ zU-#$N>-+1UuiyUt`uzO*eEa&upP$F`JpZqszkR>omSY*qwzQ=zX<3%AJa;)NN9Cv- zm7{W0j>=IvDo15hMrBk+WmHCGR7Pb~MrEsPm94T>w#ru7DqCf%Y?W4Nl~!q$R%w-1 zX_Z!Kl~O5{QYn>EDV0(wl~O5{R7sUoNtIMdl~hTUR7sVkvQ(DJQdufXWvMKcrLt5) zB~(HsR6-?GLM2o}B~%`jN99p@R34Q_<++v0`iyXX9`na%j^jT2KHs0`%KN;#d3W>f z=H0EkTX(nbZr|O$yZi3$yE}Jx?(W>(b9c|(ec#>p-F0<>Fno#dJ;PCi(+UR~&OE%9 z@aDqH4evjUNSLB9Xkiw^xQ2-iLm%!%xH{o>g$o$(d*<=J2O7A`xh_Y)yq)C*F7J35 zgJn{dVOr*G8Odd8m%(0Uf4LsZ4O%YQau1iQy4>dF!Y}_5mVX=TeJ5qT?-=BBCna$c zH*pg;aT7Oj6E|@aH*pg;aT7Oj6E|@aH*pg;aT7Oj6Sr^+w{Q!$a0|C^3%76!w{Q!$ za0|C^3%76!w{Q!$a0|C^3%76^w{aV{aT~XB8@F*Aw{aV{aT~XB8@F*Aw{aV{aT~XB z8@F*AcjIo{jk|F-?#A7?8+YSw+>N_&H}1yWxEpulZrqK#aX0S9-MAZf;|}iN4({L% z?%)pY;12HK4({L%?%)pY;12HK4({L%?%)pY;12G=J-7$=;2zwAdvFi#!9BPK_uwAf agL`lf?!i5{2lwC}+=F{?5AMNzKhJ-+{LHTa literal 2287 zcmXxlVU8O&41iImX@UOBRYoL5%Gc>x8z4u?F}l`67x2h{79XC+^6;;3KVH9Hf4_cz zf8D=dukWvazTW-&_4@hs`u6o&e||2{^ZdVl{`dWUTaINcZP}Kxq$MoN^4#U99F?PT zRF29~IVwlxs2r718I@5Pl~Ea$Q5ls{8I@LPl~!q$R%w-1X_Z!Km94T>w#ru7DqCf% zY?ZCDRZ68)N~KgvrBq6#R7#~(QYBSVB~?--RZ=BYQYBSFB~(HsR6-?GLM2o}B~+Hm zQdufXWvMKcrLt6(%2Ih$9+gMsQF&AzmFHF}>vM$TbLl_sIlkAr*YmkX-0R)V=kq@A zZr-Q9P0-`&2ueRt>X&fT56d+zSJyYIXEzPsu9EGKL^gv&Wyj`DKammkFPn^}HV%P()e@6BHCdnXre;0A8s z25#U6Zr}!P;0A8s25#U6Zr}!P;0A8s25#U6Zr}!P;3jV3CT`*;ZsI0x;wEn5CT`*; zZsI0x;wEn5CT`*;ZsI0x;wEn47H;7dZs8Vg;TCRj7H4r5XK@y1aTaHB7H4r5XK@y1 zaTe$1+?<N_&8@F*Aw{aV{ zaT~XB8@F*Aw{aV{aT~XB8@F*Aw{aV{aT~XB8+ULAcW?)Ha0hpA2X}A>cW?)HjFK^J z#y}b~YmBuq`NnV@^K*>YF@?vVp7(vK&ig)i&vT#6$AkBHHXo1g;|YHZfn!b_qvV)2 j$3Qw})-l!&?!i5{2lwC}+=F{?5AMM|xCi&(zMu6U<`c}i diff --git a/serialization_test_data/go_generated_files/kll_float_n0_go.sk b/serialization_test_data/go_generated_files/kll_float_n0_go.sk new file mode 100644 index 0000000000000000000000000000000000000000..afd22092750c5d702e919a588da4c9fa7e9e8c8c GIT binary patch literal 8 PcmZQ#==8VB%~P@yh^x|PJ_;ue<-A;cvakz}5~>qjCtmkc6_YbM{PRbAD=TI_Du zr`ftLJ7I0BJ!P<6PD)L)(bCIyP_64Rs6)4GhETOp-N!lo&iS3^nfEsDeD9@cqc-BC zh!kpi8}aOSQnV5g99yy0tOJW>aV&uiVe{CsUwzR?h%cECW}1j!f@l1=CGeQb9A-0% zg_+3==EZP%^b*LiOQ180xlH1^08_ehJyW}JIn$%K4-0S~r90O#MdrwqXJawP>EQo81Y)^x1w~c03_{u#gtLp=z8ggN5a-q0=U+jnUj*TQ%`S8K zO)k3|g!h2Qc*?P92v+kDq_+I-&LOxlJdZv+A0-4mB?MzM=is_YAp{CS@QXMv4MAQU zf>_G+ue0@RBiC=`@2cW9dwIMAJk}9zQ^VhLiu;^q7r9;190c?V7!?(;m$MBOkazO) zKF(_@5IDon*DK)MuYlhu2&-)nN-Te0GRxvQtKkg!wQkUpqhP)o1@A}{>>s0G42_1g zBpUVy(XbvwLm$>1&MV!a9`267+AqU@Yhd4#@AZQ|xIa9jKb(F2c|Dmj0B+d;czXvxxibKM z-$b~J65;Ppgz6_k9-%;5uE4HV;QmiRAY~xbr32xAI1tj)fiThrL0>)y-qAs@8U{fg zm;}8d337E3#Lr3aM+}Bo!Hy4x*Jub_bqJKzLm<@-fzd1(l9~+NxzDkCbJ{0n* zp|DR3<-I%%M&>ZM>xRKUH4IjZ6zG%!|92^nK1+cSIUF7h=Y2dJ&dK30TaSP~Wd!`n z5l}wiJaQz&xRLPIj)eXBNGL5wL6%3sD;fpW;&^Km>>jC*%Ti&#%ke*{5OHa|o@tPG zrSbon#^+vzQmjH)%v0gTkA|m@hGC6{eS>3ELCMu%ZP8$#)gW~t zC^w| znH+c>rozr)o2EiKKNaCFxv=tcp=`;8cQ+TVk_V?e4`P2F>>u(F?w=2DQ9jgz%+H5N zDB$x`0Qv0#D0d6s^(};vS_suFgnhISPD3Hw)M*H>oW^@-8q5~cVP;H+v1&S$n&}8M zo&hgo2K+TM;MC55(PSnZnhAI9Oz5Am7DaHhBA9O!!LBWWA#`}E4$IWx*RY6L@W;)9 z^!r&5|DFZ8)oh5|+3^278^%|hx8r;2kIv1+Z6htXTlH$wJtp*{X$bKVAqgViDBTMKIo6gz%X~ zympJB=drDe`MzHa5m^qE%HgaohhAHba8m;!%Ye6)T{NI};rq6r0z!$*6oKDniYFpV z^d6lhj+j|upT+sdSt9ycme?UQQ6*_&r>u!xiY8X5n%ET3#4=qIrlE->Q!_KyX<~L* zGY@al#Ic>4IR1CdJhD$SkNs0Kwd0yd{!|m0Uuk08x0+dSRTKIxF0a$fo{uy$<`>QU zHiFd4%}D+3c~UR5A+x$YIUjZ+^Ruqx9E&EgJ(iqxJxPQU$obO%a^4$6;!rZFRl`YC zr;@rYot$l1q;4Hc&fbaS?3hAMbuKxzg(N zIsINIGrW?V4Xa6Cwua=;TJnPHNtFMA#e=yY<`c_o$r(Q<9?D~J3#uaLuB3ifb@HZNpD_F zPSd00wEBqj_716{hSVmtWIj1T^5aj*dvuD#!_P^6`XzadUD6+)ChPH8t~*D1 G-SB_RT;5Rt literal 0 HcmV?d00001 diff --git a/serialization_test_data/go_generated_files/kll_float_n100000_go.sk b/serialization_test_data/go_generated_files/kll_float_n100000_go.sk new file mode 100644 index 0000000000000000000000000000000000000000..fbafd724a2667b7aad994ab5c03ac7a2b05b6cbf GIT binary patch literal 2392 zcmXZe30M|I9LMpWH@G{YEuYk$F3T(`>+AEx^L(D)%{u>+^^DJ0)VLl4?jeh3Lan1mlh!Ve_j2axcING>;B#BcZ=f1mz>)N9OIwA^PI3A4{%5ms{Ug(3q zNI(EXe_Spz|1YYSo3De0%(FS!3LVf5y#s<6yX?7;{wMk5LUwYC5%tTz%ZP83Q{qf`U-L@3ULIV z;2g&aVa!^G5C{9s6j|$2)`3;(&eVM5TnMmG;36xWj zfo0gtu|o1NPU0MDZ8Oa;H0{7!_?Bl{br0_e3@OOKW*o=&s8wWYj{z8um$0G8{6Ty{ z`3f0PZ0d_K#pctHP5BVcQm)Q#)_Sk`5XK>$dNxkt5*qH~9mKu+%ugj(kVWJvR8V${ z`5vk!NaYENj|eF~84E-5c_Agg8&c`dAw`7+iVqKz6&Yx9Y#`qcNr946$kaeX(*i}# z4HTXkC~8%pupDB@xuRRsE5PO9egVHjE4sor&H z;FQwXDXAIR!YR46Q$#zbuD3cxb$03y?Q}z&Q+O|@$i7ZD22NG`bKM~7cQ~~gh7nGo z`<(`krrmhz6DUt~y8ChRDf*s@=}vpR)8QFNb2^mnbRxqke~wemT&L~xopvpx%_66~ zOwKQHDqZGudqug?v$PDRO@x-w$rJ40rywP z9E+SPik+_PbE;gze9N5L9K;(=O^!I-e2jb(Z{Z#8^F60JA2>Dqh_)YdAE$U0pOT-G zUpn3NHT`@;|7V@TzGJ-e^nZbCexUvn&+Hfa{*~)5(cfjR`;#&La_aJrll#|cwOA`E znO0UdEv>@$S(S1%)9UJ|VOkf)J5`f5*Kqz?)2dpi&3jyj@2D>4>zUSHXUeZ{+H$>V z+YPKa4akNZYh>CTZYpkUDrjO_)YO!DBi~>%`nrien$vHDX>AL}y_s=aGG;5*uhxvw zhWE8C^+>*ncJ$qzK5wD#4xGD{>pC)SCqyxa&h*iRyp6ebWqpXIT{lx!498+Q7H1mO zo$s>;dYb0+LT}TIKCGMZrWg8}(r)MbOEAq0aXcWMX_k@w(4TT5-|ql&AaftYJq%`k zLzwGO#=gU}=}z)4=5{w@4#PdnaX9N%l4856kBww4z2Efg1B^S$G&R}urzt;U8lGwzHr13ojXmR8)|ux_Bd7B`o@eiP!E~GFH}dQ;FPh(lxEbaP5c`t( zJs6V4I-SNEHPifYB&M6n(%HvmnJ+<*!8({>N}O%_Y&Lt-9Me}A^)iW+x#rK$WiInr zXXmkJ%{TpkaSP0!S-`rsko^Pp3gf^Qk&Ec>Rr*GRMWtb&2`HC9J1QP2~tJ zGaZFn&R&4T6})SRSxI}utzw-<+-mcCSDU)8G3{StzUNwwuQeZ?#e0e9btIzKo8O6; z4b%~v%|3zHjkMor{`O6#62x!j-jR^QT8)G)^uNW_Yb)2G$2RKdz1>v0oqc}?`!BlZ z@=S9%{~Gf^?>x@uneX&E^G3IP*5`bl^-j~VojmJZrW3o&_bV_REa3l$-RAcrq0s&V D`(;in literal 0 HcmV?d00001 diff --git a/serialization_test_data/go_generated_files/kll_float_n10000_go.sk b/serialization_test_data/go_generated_files/kll_float_n10000_go.sk new file mode 100644 index 0000000000000000000000000000000000000000..7382f0046efd70a596c5e10cd7a2ac002fcb2f2f GIT binary patch literal 2208 zcmXZc4{Y310KoCL>E=vrXKKzY(#XO^7HMSRA`O@Ae$7P|xyT|HS>z&(Tx5}vMlRCG znW89aiei{4%7&SuD9#jzqNX?u#ZU~zaHu~Yizc6Z@BQBUU4Pf!dvj(j2-Oe^@ngci zpK6$E6vBK? zVhQ(>Bt@1yMM`wj&mhB8sWC;J*x~LcNs26aij?T4pFxJHQe%obF@M7ZNm69V(@qCn z^fAB?qfD@y)Rrg=liI4J9#m2fDXE8}P$9idNk8H`sqISYQ6)8`q#v`6^y5nU2_-$O zq@T2o)KgKIr0}$oABjSZ{4+}aS*7rtc?uP!@Vrvkp%h+F3ZqKlMWyhPQg~S@RF%Rj z-k1EVO8zw^Kc?hgw~oRaO8!mP$&E*0oZMSVZl{uaTggo*xp$P@yHTi;eNV~Ol7I1GDY!ArTCRnoKlKkE9<_A z!Zf9C-A`$cQu@y4ruq9QY$EYP6#7X_D~TVK=AX>d{BslrN$ypWzbMIHy%+WW`kPX! zE9Kuk>mN$^QwcLl_)7_YE8!m{1m_8zj4(s%EMqE!+2$!zA?#;NnF^u7dO8^)%rQ@y z3Sq8!IvJ)$Vt?lVeN504Gp3IT5(n64^i!j0o_Ts0qwzrJ7QKvCP@n^(qzezr$CW) zlro{YOc&k8J@nF-359+(vWbCAC=argZ45EY2o*-HsWQem6Ry?Rl?jzeb~D8urrDbb zo9fJDLM}w1Wi}1WCB{4&nNOUB&a);Kkzg@PIMQ4*N7*AwIhte?dXHrp$Ju`^9M5u2 zAjL_vax!UFkn#O*Bg?6*a_uy7UZ2it&LGd3tl=yQ)|^edv+Nv-oXc9*&SRZ57tq0l zl(>jaa~C_G%Ra{?tanCTN*9+ozb@wr`@5Sfxr(dl;ToU$TCSs)>s{O6%(#I*ZsaCz rrr+6d3%6Q#8ymUZ`a8HY3b9Sx#b)kiAPVt&xYzuB401mYuqFBzTE1tL literal 0 HcmV?d00001 diff --git a/serialization_test_data/go_generated_files/kll_float_n1000_go.sk b/serialization_test_data/go_generated_files/kll_float_n1000_go.sk new file mode 100644 index 0000000000000000000000000000000000000000..246299de98a31c44e00a7b60f6a099fe29d0e577 GIT binary patch literal 1336 zcmW;KX^0k76oBEQ<1)F9=DsyIjI%`KbEa={-T5h4;IA~J}` z5F!#H5)u+37f~5RL_%Z`ks&082oVvHknmwHJaFIp=lnRgZL6-)5T(&v5-q18N@9cC z4Q{r)6lX>pD747?3sEEylL+!|O(MwOY7#-N z)g*%ajV2M~U7AFYzt$vzyi=11@(xWR$lEoEAaBzog1l9e2=Z5&M3A>=5<%XqNd$S5 zCK2R~nnaK{Xc9qQuN$i(ipgp!BN9dG$utqOBFZSIf*a) z9)EJ52Q*ei@ga|ROcQ_cguiL#AO7Vj&v?!YUh<0nc+LM+k-~pyMQciELtEO>o>JbT z10Cr^XS&dpGP=>7x9LGodeNIc^ravD8NfgW@ebt-W(Y$W#&F(c1S1*6d%VwR#xRy~ zR4|?ie85CLWD*}SnJG+V8q=A<$IK*A$t#a#rvu WpYb^>`GQq^$!gZHmUYyyzVHSgYbcNa literal 0 HcmV?d00001 diff --git a/serialization_test_data/go_generated_files/kll_float_n100_go.sk b/serialization_test_data/go_generated_files/kll_float_n100_go.sk new file mode 100644 index 0000000000000000000000000000000000000000..ad45e6415347ede44b905bfc9d567494074eb8a0 GIT binary patch literal 432 zcmXZUAxJ|37zE&dps*mgU@#aK3U1TAXmq5ls#`V4nti?6O13Hd|~`XM=TWR9Rz{6)G&V#3BiE z%rZlXX{MN@$OPkzQDB5TLj*tb5#M~#=aUaIUg*)KLz@;&8l=>zQX!#4kpe+K@k5)G Ig!tR#U+XzeRR910 literal 0 HcmV?d00001 diff --git a/serialization_test_data/go_generated_files/kll_float_n10_go.sk b/serialization_test_data/go_generated_files/kll_float_n10_go.sk new file mode 100644 index 0000000000000000000000000000000000000000..1fd87d306b9ffe4cd07aacf240342f69aeab5ba6 GIT binary patch literal 72 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 literal 0 HcmV?d00001 diff --git a/serialization_test_data/java_generated_files/kll_float_n1000_java.sk b/serialization_test_data/java_generated_files/kll_float_n1000_java.sk new file mode 100644 index 0000000000000000000000000000000000000000..25e1d6116779a404e36f7de7aeb06dee3d71aa9f GIT binary patch literal 1336 zcmW;Kd#ngl9Ki7(H{9e=WzyGk?VrCeInZ?XxX0kG@ zHOw)LR;^l@HMQ2NsbLtc8I8~G**-hxd;U7x`BkY@J1#|G{9Orxa%nbUbLRNRyo zMXV~VkXM#QIf)>z&?JJqT$2d$GEE}LOErlgFVQ4|yjYV6@*+(l$O|=zATQ7)f;?Z7 z2=Y8lBFJ+!i6GC>B!WC!lL+!GO(MuMHHje4&?JKVfhG~;>6%24r)d&Fo~lU%d5R_x z@2{T$#Rhd9g;KI16IIKdZu$w^LghO?aG0vGv; zulbhm_<Xk4mCE%tR$BQ@|5cp(@oV zL&rpZDJWD<5(}0FFqA^WqN;8_%f|j(RHEno~=V?nj+VcV(=tw7C zq%&RUN;kUGgO}(@FM895zVtKq{TaYO22n&}FvXNm$`FP!jN!b@2wq_%uQH0)c%9LV cVJvU(CgXUE@x09h-r-%|VU1TAXmq5ls#`V4nti?6O13Hd|~`XM=TWR9Rz{6)G&V#3BiE z%rZlXX{MN@$OPkzQDB5TLj*tb5#M~#=aUaIUg*)KLz@;&8l=>zQX!#4kpe+K@k5)G Ig!tR#U+XzeRR910 literal 0 HcmV?d00001 diff --git a/serialization_test_data/java_generated_files/kll_float_n10_java.sk b/serialization_test_data/java_generated_files/kll_float_n10_java.sk new file mode 100644 index 0000000000000000000000000000000000000000..1fd87d306b9ffe4cd07aacf240342f69aeab5ba6 GIT binary patch literal 72 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 VM$Nl_qdvM*qhoM?%oA&C>wi(SU_k%? literal 6848 zcmZ9QORjZ04TKLu2s#&9^tYf#EAKcx#B3M>GrSF$6W`jd%0e7z>*lUM563Q-%lX}J z{`B+f&mVsN{*OQXJb%Cb{POc#{`(8RKl1xCzrXPNE5E<-oBaOC?_c`;`!_#7|Kaz0 z{{Qp+tIx2O@8ACoKj-`Ro%JM0T^7g7V!p$5?Tvj;i+5R^_lWWuS?&&}y|?J^!Tp^u?h$9c<}5FZGw+1e@7>nA zbJw}U-M#GW*Yy2AcWX8>dbK%m&b?ci_d>N^pVjyBZCo3AxfA;9>d~(`v)#EfG?&A! z&)OLFLz_36Z4K|x_VN)e?u1_M!MzUOxc730qxnL8ZXeOtu_t@3L_qg~Uv zkC%;Ee4(*!2*>N{aqbSYG#@d?&1OC+vHn6&Gjg92>dIJ8a#S?S2upXR}N8x}e?rX4XD8LQyWjqb}bq+RdRD z_lTHxv%oZYC&IArWjWC!)|L%HifG?B)k#KX8i;Y0u><<9>7{uYQM+C*`({8b7X-Ck zN7Y&F^|~*(S}k@->ze!d)T+(aC`S~uMn5B+3ebx#zs4%M<{G=y4EGvQ(-p9h_Kj|0S}~^gjkz2*XsPKmN`#neJ@Aw{pl|EO zr|hbI57^O-L8NbSdWdw_8Dv9V9)=QwuR~hMCE&?N9B}Wi&_fP)Au5T~4Um=o8OPLR6mnZO)kxrFK}& zK*U4PDG12vcdhRL$c{b%xfUUdiar@VXfHmYZT-HbW zEJ!g4jHs1#$hkyNr8yqf$Z$tRA|}8eeinNoB+MGrkSR8TI)`vZRIH-{*6_X*NR_YP zYAWtH#2|=9=}lKt0${AP3@->U(Ew8B1<`(YI8#{XzFYnUvJ{%!;qjh_ojRhg$Ua@Z zL-Fz%GF7z@%B2cuZX8b-^junoVzo;~D_wI3)Rjn$K~>bj@P`U(42rjRxEvK&GrjB> zJAu}aHVU+c1B-fuSt+9*T3+J-TngBaQj>FbwZBXg)Yv0AJ)*pkF55v!9tn&L>o*$&h+_;om2VLI^y|SRxwP+7^gIMb@+8SGE;&$z8%Ms0m67N~D=k~3x`*es z%G3oBDa8~n$hrF#VWf6dcC+YSbH9x_WMo%E6%zmO#6=0E*WRH-N{&;ni!V<_@tXqV zsYEBjJT;^_@Svd#RrsL>s?g;>pXQe9^BGNQ@biKA(@~$NWG^^?{a=(cush?fm;Wp^)uaQhN zf$%gy@0njwJ4(F@?TZPJIEDs$(U|1i0UorBnkReFIDWpVlYB`i18A)?)h%U20~*cZbI}q7_;;lLGwhCKF9Z9nZNu zYY0(@oe-jUj-@o@1gf4=gyy!2Du^GiD mg9`QBjX8~dSLD~jo_ROwHIIhhgTWBCYY05k9NyWfh5rRBa$p|- diff --git a/serialization_test_data/java_generated_files/kll_string_n100000_java.sk b/serialization_test_data/java_generated_files/kll_string_n100000_java.sk index e3382f277efef47a0c3a692cfcd204b6c6e23e05..018813450706d97448d820f395504cf88e8286c6 100644 GIT binary patch literal 5896 zcmY*d?X3j24SYtBAo=AMRDwPzk^)?c>q#AHAbq%oq?ybeXK3UBhqu^WO5|`jr1r1B z{QC39&)vOf{=kNco z#{2wz-}_u-UqxSeU){d4zB+xi`|7*fcjfPHpR3d!ck8`eS|ykE%|D-R?Uq}%d9+&| z`In~M(%Qn>;R}y?dj~F z=9(?xVjYonwk(8|rQW+!INz^%53Vb3H)Y|)doa8D3|gM?`n6R*;QOPctXSM`>ST3*#^x?)Q|TF+I}8I#${kb-1L^)jSfnVVco zEM1spKH0wAS5lBfB~kBZtJG|zna%qp+qYVgR;%b<-0d}LZ}TZalP{+^Zd2^EC0uL? zXWP;tJJMY{VuZn@d^Qt)cEt#DX|}m|WgtE+QbmrF;IB)z?_|Z*rS>aG#tKnjhq}e zn4{4+58uRjxKTGoqcQxk-bQTd^ME?imw+f%ywIV-bf7E?NkFyrG{~lbMDx9OnDg;K zlUn6LlD=0M`^cd+4^?2z%T?CYEQM~w?z{kVp|O_w@Rje%^b`;67Nf?m-B3g(lB?k2MYDJhU~) zSv`eJ^1VCB(+v&ddl#4W9(0ITKB<`7L4(p$^ppB7X7zs ze`EOPzS(G?Tk+llx69(8(0S$T=Ns}|5uLfHLuZ~>UZGQvrw47T_Qi}#4xNRT^Ih+N zPPAB>>H#iK4rhbL_1-5;UP(dDS!B~WMm8b4?A_-)RxMPLn0{U>T#z>M;FvgxDT0w7 zWP!V(RaE2$dSBS1j+x)nntf0UTp5niHYRg~shycV$Oj|pe4L!@5GR$llb4x3nN)8S zH!Jzzz(QYe{HPqEos(BKH6Pf-+F#V5*qp9yCRGZZn<{`=le^&rL0ll?)EwLDY8VAr zAGV$Bw5@ZLVIZs6Fdk@SEivpsNnLd=cap;=e+Av5n;Nag=^}=sgYHI#!eMLbD?ga zw8)Z+(?lV8A=$bz?Tew69`q!QfsA^8Q45t1j0~*v`!wBPlH$DK6V>pI!=X)OfpwW* z92;3Fjy_%5gf30(bPU54o9{_IKtp6-@Qs*i<*n~3s5UYT^~vcP-JDTky5d;~!yNU> zO{aV}>{shql0#5ac0b2#OaFR$b%;gf4f7ZgcYs@{;rvbRx<4v4PBW}-597@0Xupgj zKhZC1T^0^ymS1bvTLs$Cd0W4TEIA4%!@!7am#<9C{9-*&MIDk_bJ_m5_ z0YcCsF^rZi&Uuv?oIR=Sff1x)LpLH%b8glaj^eDwPwS~wAb(sr(Pk=_C`Rf=uAsK( z)@d2G)#IP!l^v$s?L literal 5896 zcmY*d?TtjY4Ll=Akoq#AHAbq%oq?ybvXK3Vr#R+d$;@5CEdVl@p z*PlOr{{Hi?fBy3G`TOJNA3uM=|6lp}4gWu%-|_i3KL5ezzxezOpYi!ypVgY5zyDv2 z_xbz&?z6~VMX$V9w^yfEyI0n$ueI;VUu&OL%EmQ)n@c-#$wr!Xq{&8_yvp4>cJDa7 z89~=y+ep`#Rp&@xJI&qU}c8&9u2rDzWpq;cXzJN z)ZVl7yVDV!s~xAkI&JqfPH*GoZk>0JGI?Fuy{T;6r`Wu`_r{esa=dfpU48HR##COS zYZM)MTzL>3d9?RA>D7LU+?UStNPg?N=&7e_>8X17llO3nx$-AZz56$&{EMl2#FQ_w z)Pu2vl341{u*E15BrzE#9K;r4W2?(z2P2Q8h~lU(yb+**;c6jo$tavkSkRvu~Q~sTK zxc4kE>si9-F`?v`Y@Dr}o+I8ko!xW$Jl8xrXh&KDjJfJufso`&bM|?%cBi-)Wn?CH<>^1zH;hQdG@LKhIXS}H`Uj7 z>4Skup$_n)S?kTf-W=<$8Q|@e2Rk7AaDqXBuzSYXSy7JRGLw7c$ss8 zElc8l?M46A-i&;0Rex<&A0;Q+7kafaxeg#!*3RSH0+Wzgffo6KuHX(hTGd)^R9XvF zsEjXEfxp8B#(_y!m05AA(pChSdZ7xHQ}C92Nwji#m6}4B1;jXDO1!Lh$xRDYD6X@q z>0(oJ!R95#fmfc4lIu_x;vP)L>9XhMT;21&Ldk|$s+vRXTGb6T zVE#6MRXKnfA{TE!tvuK!6|@nio;@nEjV%@VhFN}#DpV)$EzU-X$SV6Bb_Em{=i5dV zxC2$7&!~b{p_5SsK0_5~7xIeUd$22ZE5;42$KQoi8uT5tz)qy-i@FW?RXw0%lo#j- zX6;SZ4X`36_j9TdjC1n%nUm~uP=(riV4`dsRH2Y~FigwZK@}=%APeRc`iVLb0)R6G zgwDzwz^)>~G$L{iO2|`?=*lGK2vy5L75EHQsQjT74miyfMh;g&MFI6fUOS2Ysc)N+AW*1ZPHQtzXFt2d z#;1|X?wynK^3F|-e!)l;E6~K+`{R<+mC@;itRSTrdtRWd>%nwEITXXW&wIt`@ z_C~dI0sM*_a)`IoyEW}EE{l~7&^?~ zpkElJgS5XnMFGhmpf%P5np7u;?#?%*9xzKE^MdJ24Aho!R=k+Gy;5(vY1%{JkvGsW#2RkDIuB%57;+S~u;#eNR}Oq9 zxeoUW;sr_LymU}g#p@s+o&x1tu{na&Go15{7dLEbOo!9eAE*#f=a71|>yNzakZXJf zInKO5BhhX=a;GDp%Jb*y%-^*}0$RvOIGAWhp~`+{+bqac+G6~JXYTj9k129zT;4TKC)jA2T}2)!tup^>W6n8U;dScp6skn)TiA<;h!cJ9ChvZ{*V%$i5v zfAJ=R=)}7ZqA8GjMvf~J_kv=zlC}uQ?D}0!BVN!Q?CG3AF8N%_%RjtBtvI*fF>ZG6SBB)g&Q#=$3>moo)}2wa~=rUFP@==i4t7diNB9T zFU02E^5r_!Vd92XIZbpx;q-HP*E8`SZsPIhVwotwQfIrmBidzV6BEG7h}uV%etGa9>nb)VQThz=pm&xZ!SO%E@3-9m diff --git a/serialization_test_data/java_generated_files/kll_string_n10000_java.sk b/serialization_test_data/java_generated_files/kll_string_n10000_java.sk index 8c4ba2d00421aa051b998bd70e84a51ca445245e..8399256d13e1b3b4bff90a893efd81a399f22ab0 100644 GIT binary patch literal 4913 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