From 64fdaf8c4e96bcc61059d8f9c4b7b9c2d76f9591 Mon Sep 17 00:00:00 2001 From: Andrzej Liszka Date: Mon, 9 Dec 2024 18:19:26 +0100 Subject: [PATCH] wip16 --- bitmap_opt.go | 24 ++-- bitmap_opt_test.go | 346 ++++++++++++++++++++++----------------------- 2 files changed, 185 insertions(+), 185 deletions(-) diff --git a/bitmap_opt.go b/bitmap_opt.go index 6bcb6ff..f25bb64 100644 --- a/bitmap_opt.go +++ b/bitmap_opt.go @@ -905,7 +905,7 @@ func (ra *Bitmap) FillUp(maxX uint64) { // card := getCardinality(commonContainer) // newElems := maxY - maxYCur - fmt.Printf(" ==> n [%d] rem [%d] nCur [%d] remCur [%d]\n", n, rem, nCur, remCur) + // fmt.Printf(" ==> n [%d] rem [%d] nCur [%d] remCur [%d]\n", n, rem, nCur, remCur) mergeCommonBitmap := false mergeCommonArray := false @@ -956,19 +956,19 @@ func (ra *Bitmap) FillUp(maxX uint64) { // return } - fmt.Printf(" ==> req cont [%d] startN [%d]\n", requiredContainers, startN) + // fmt.Printf(" ==> req cont [%d] startN [%d]\n", requiredContainers, startN) containersLen := requiredContainers * maxContainerSize keysLen := requiredContainers * 2 * 4 - fmt.Printf(" ==> (4) len [%d] cap [%d]\n", ra.LenBytes(), ra.CapBytes()) - fmt.Printf(" ==> expanding [%d]\n", containersLen+keysLen) + // fmt.Printf(" ==> (4) len [%d] cap [%d]\n", ra.LenBytes(), ra.CapBytes()) + // fmt.Printf(" ==> expanding [%d]\n", containersLen+keysLen) ra.expandNoLengthChange(containersLen + keysLen) ra.expandKeys(keysLen) - fmt.Printf(" ==> (5) len [%d] cap [%d]\n", ra.LenBytes(), ra.CapBytes()) + // fmt.Printf(" ==> (5) len [%d] cap [%d]\n", ra.LenBytes(), ra.CapBytes()) var refContainer []uint16 if startN < n { - fmt.Printf(" ==> in startN < n\n") + // fmt.Printf(" ==> in startN < n\n") key := (startN * uint64(maxCardinality)) & mask offset := ra.newContainerNoClr(maxContainerSize) @@ -985,7 +985,7 @@ func (ra *Bitmap) FillUp(maxX uint64) { } for i := startN + 1; i < n; i++ { - fmt.Printf(" ==> in loop [%d]\n", i) + // fmt.Printf(" ==> in loop [%d]\n", i) key = (i * uint64(maxCardinality)) & mask offset = ra.newContainerNoClr(maxContainerSize) @@ -995,7 +995,7 @@ func (ra *Bitmap) FillUp(maxX uint64) { } } if rem > 0 { - fmt.Printf(" ==> rem > 0\n") + // fmt.Printf(" ==> rem > 0\n") key := (n * uint64(maxCardinality)) & mask offset := ra.newContainer(maxContainerSize) @@ -1010,10 +1010,10 @@ func (ra *Bitmap) FillUp(maxX uint64) { setCardinality(container, int(rem)) bitmap(container).setRange(0, int(rem)-1, refContainer) - fmt.Printf(" ==> rem card [%d]\n", int(rem)) + // fmt.Printf(" ==> rem card [%d]\n", int(rem)) } if remCur > 0 { - fmt.Printf(" ==> remCur > 0\n") + // fmt.Printf(" ==> remCur > 0\n") // idx2 := ra.keys.searchRev(maxXCurKey) // commonOffset2 := ra.keys.val(idx2) // fmt.Printf(" ==> commonOffset [%d][%d] new commonOffset [%d][%d]\n", idx, commonOffset, idx2, commonOffset2) @@ -1043,11 +1043,11 @@ func (ra *Bitmap) FillUp(maxX uint64) { y := prevContainer[startIdx+uint16(i)] commonContainer[startIdx+y/16] |= bitmapMask[y%16] } - bitmap(commonContainer).setRange(maxYCur, maxCardinality, refContainer) + bitmap(commonContainer).setRange(maxYCur, maxCardinality-1, refContainer) } setCardinality(commonContainer, card+newElems) - fmt.Printf(" ==> remCur card [%d][%d][%d]\n", card+newElems, card, newElems) + // fmt.Printf(" ==> remCur card [%d][%d][%d]\n", card+newElems, card, newElems) } /* diff --git a/bitmap_opt_test.go b/bitmap_opt_test.go index 4980c8e..a8a8a21 100644 --- a/bitmap_opt_test.go +++ b/bitmap_opt_test.go @@ -965,179 +965,179 @@ func TestFillUp(t *testing.T) { } } - // t.Run("nil bitmap, noop", func(t *testing.T) { - // maxX := maxCardinality + 1 - // var bmNil *Bitmap - // bmNil.FillUp(uint64(maxX)) - - // require.Nil(t, bmNil) - // }) - - // t.Run("empty small bitmap, data slice extended", func(t *testing.T) { - // maxX := maxCardinality + 1 - // bmSmall := NewBitmap() - // capBytes := bmSmall.CapBytes() - - // bmSmall.FillUp(uint64(maxX)) - // require.Less(t, capBytes, bmSmall.CapBytes()) - - // assertPrefilled(t, maxX, bmSmall) - // }) - - // t.Run("empty big bitmap, data slice reused", func(t *testing.T) { - // maxX := maxCardinality + 1 - // bmBig := NewBitmap() - // bmBig.expandNoLengthChange(3 * maxContainerSize) - // capBytes := bmBig.CapBytes() - - // bmBig.FillUp(uint64(maxX)) - // require.Equal(t, capBytes, bmBig.CapBytes()) - - // assertPrefilled(t, maxX, bmBig) - // }) - - // t.Run("max value already >= than given maxX, noop", func(t *testing.T) { - // maxX := maxCardinality + 1 - - // t.Run("prefilled", func(t *testing.T) { - // bm := Prefill(uint64(maxX)) - // lenBytes := bm.LenBytes() - // capBytes := bm.CapBytes() - - // bm.FillUp(uint64(maxX - 10)) - // require.Equal(t, lenBytes, bm.LenBytes()) - // require.Equal(t, capBytes, bm.CapBytes()) - - // bm.FillUp(uint64(maxX)) - // require.Equal(t, lenBytes, bm.LenBytes()) - // require.Equal(t, capBytes, bm.CapBytes()) - // }) - - // t.Run("single element", func(t *testing.T) { - // bm := NewBitmap() - // bm.Set(uint64(maxX)) - // lenBytes := bm.LenBytes() - // capBytes := bm.CapBytes() - - // bm.FillUp(uint64(maxX - 10)) - // require.Equal(t, lenBytes, bm.LenBytes()) - // require.Equal(t, capBytes, bm.CapBytes()) - - // bm.FillUp(uint64(maxX)) - // require.Equal(t, lenBytes, bm.LenBytes()) - // require.Equal(t, capBytes, bm.CapBytes()) - // }) - // }) - - // t.Run("current max value in same container as given maxX", func(t *testing.T) { - // for _, prefillX := range []int{ - // 1023, 1024, 1025, 1039, 1040, 1041, - // } { - // for _, fillUpX := range []int{ - // 4095, 4096, 4097, 4111, 4112, 4113, maxCardinality - 2, maxCardinality - 1, - // } { - // t.Run(fmt.Sprintf("prefilled bitmap filled up 1x %d to %d, no resize", prefillX, fillUpX), func(t *testing.T) { - // prefilled := Prefill(uint64(prefillX)) - // lenBytes := prefilled.LenBytes() - // capBytes := prefilled.CapBytes() - - // prefilled.FillUp(uint64(fillUpX)) - // require.Equal(t, lenBytes, prefilled.LenBytes()) - // require.Equal(t, capBytes, prefilled.CapBytes()) - - // assertPrefilled(t, fillUpX, prefilled) - // }) - - // t.Run(fmt.Sprintf("prefilled bitmap filled up 3x %d to %d, no resize", prefillX, fillUpX), func(t *testing.T) { - // prefilled := Prefill(uint64(prefillX)) - // lenBytes := prefilled.LenBytes() - // capBytes := prefilled.CapBytes() - - // prefilled.FillUp(uint64(fillUpX) - 20) - // prefilled.FillUp(uint64(fillUpX) - 10) - // prefilled.FillUp(uint64(fillUpX)) - // require.Equal(t, lenBytes, prefilled.LenBytes()) - // require.Equal(t, capBytes, prefilled.CapBytes()) - - // assertPrefilled(t, fillUpX, prefilled) - // }) - // } - // } - - // for _, currentMaxX := range []int{ - // 1023, 1024, 1025, 1039, 1040, 1041, - // } { - // for _, fillUpX := range []int{ - // 1055, 1056, 1057, 1082, - // } { - // t.Run(fmt.Sprintf("single elem array filled 1x %d to %d, no resize", currentMaxX, fillUpX), func(t *testing.T) { - // singleElem := NewBitmap() - // singleElem.Set(uint64(currentMaxX)) - // lenBytes := singleElem.LenBytes() - // capBytes := singleElem.CapBytes() - - // singleElem.FillUp(uint64(fillUpX)) - // require.Equal(t, lenBytes, singleElem.LenBytes()) - // require.Equal(t, capBytes, singleElem.CapBytes()) - - // assertFilledUp(t, currentMaxX, fillUpX, singleElem) - // }) - - // t.Run(fmt.Sprintf("single elem array filled 3x %d to %d, no resize", currentMaxX, fillUpX), func(t *testing.T) { - // singleElem := NewBitmap() - // singleElem.Set(uint64(currentMaxX)) - // lenBytes := singleElem.LenBytes() - // capBytes := singleElem.CapBytes() - - // singleElem.FillUp(uint64(fillUpX) - 10) - // singleElem.FillUp(uint64(fillUpX) - 5) - // singleElem.FillUp(uint64(fillUpX)) - // require.Equal(t, lenBytes, singleElem.LenBytes()) - // require.Equal(t, capBytes, singleElem.CapBytes()) - - // assertFilledUp(t, currentMaxX, fillUpX, singleElem) - // }) - // } - // } - - // for _, currentMaxX := range []int{ - // 1023, 1024, 1025, 1039, 1040, 1041, - // } { - // for _, fillUpX := range []int{ - // 4095, 4096, 4097, maxCardinality - 1, - // } { - // t.Run(fmt.Sprintf("single elem array filled 1x %d to %d, convert to bitmap", currentMaxX, fillUpX), func(t *testing.T) { - // singleElem := NewBitmap() - // singleElem.Set(uint64(currentMaxX)) - // singleElem.expandNoLengthChange(maxContainerSize) - // lenBytes := singleElem.LenBytes() - // capBytes := singleElem.CapBytes() - - // singleElem.FillUp(uint64(fillUpX)) - // require.Less(t, lenBytes, singleElem.LenBytes()) - // require.Equal(t, capBytes, singleElem.CapBytes()) - - // assertFilledUp(t, currentMaxX, fillUpX, singleElem) - // }) - - // t.Run(fmt.Sprintf("single elem array filled 3x %d to %d, convert to bitmap", currentMaxX, fillUpX), func(t *testing.T) { - // singleElem := NewBitmap() - // singleElem.Set(uint64(currentMaxX)) - // singleElem.expandNoLengthChange(maxContainerSize) - // lenBytes := singleElem.LenBytes() - // capBytes := singleElem.CapBytes() - - // singleElem.FillUp(uint64(fillUpX) - 3040) - // singleElem.FillUp(uint64(fillUpX) - 1000) - // singleElem.FillUp(uint64(fillUpX)) - // require.Less(t, lenBytes, singleElem.LenBytes()) - // require.Equal(t, capBytes, singleElem.CapBytes()) - - // assertFilledUp(t, currentMaxX, fillUpX, singleElem) - // }) - // } - // } - // }) + t.Run("nil bitmap, noop", func(t *testing.T) { + maxX := maxCardinality + 1 + var bmNil *Bitmap + bmNil.FillUp(uint64(maxX)) + + require.Nil(t, bmNil) + }) + + t.Run("empty small bitmap, data slice extended", func(t *testing.T) { + maxX := maxCardinality + 1 + bmSmall := NewBitmap() + capBytes := bmSmall.CapBytes() + + bmSmall.FillUp(uint64(maxX)) + require.Less(t, capBytes, bmSmall.CapBytes()) + + assertPrefilled(t, maxX, bmSmall) + }) + + t.Run("empty big bitmap, data slice reused", func(t *testing.T) { + maxX := maxCardinality + 1 + bmBig := NewBitmap() + bmBig.expandNoLengthChange(3 * maxContainerSize) + capBytes := bmBig.CapBytes() + + bmBig.FillUp(uint64(maxX)) + require.Equal(t, capBytes, bmBig.CapBytes()) + + assertPrefilled(t, maxX, bmBig) + }) + + t.Run("max value already >= than given maxX, noop", func(t *testing.T) { + maxX := maxCardinality + 1 + + t.Run("prefilled", func(t *testing.T) { + bm := Prefill(uint64(maxX)) + lenBytes := bm.LenBytes() + capBytes := bm.CapBytes() + + bm.FillUp(uint64(maxX - 10)) + require.Equal(t, lenBytes, bm.LenBytes()) + require.Equal(t, capBytes, bm.CapBytes()) + + bm.FillUp(uint64(maxX)) + require.Equal(t, lenBytes, bm.LenBytes()) + require.Equal(t, capBytes, bm.CapBytes()) + }) + + t.Run("single element", func(t *testing.T) { + bm := NewBitmap() + bm.Set(uint64(maxX)) + lenBytes := bm.LenBytes() + capBytes := bm.CapBytes() + + bm.FillUp(uint64(maxX - 10)) + require.Equal(t, lenBytes, bm.LenBytes()) + require.Equal(t, capBytes, bm.CapBytes()) + + bm.FillUp(uint64(maxX)) + require.Equal(t, lenBytes, bm.LenBytes()) + require.Equal(t, capBytes, bm.CapBytes()) + }) + }) + + t.Run("current max value in same container as given maxX", func(t *testing.T) { + for _, prefillX := range []int{ + 1023, 1024, 1025, 1039, 1040, 1041, + } { + for _, fillUpX := range []int{ + 4095, 4096, 4097, 4111, 4112, 4113, maxCardinality - 2, maxCardinality - 1, + } { + t.Run(fmt.Sprintf("prefilled bitmap filled up 1x %d to %d, no resize", prefillX, fillUpX), func(t *testing.T) { + prefilled := Prefill(uint64(prefillX)) + lenBytes := prefilled.LenBytes() + capBytes := prefilled.CapBytes() + + prefilled.FillUp(uint64(fillUpX)) + require.Equal(t, lenBytes, prefilled.LenBytes()) + require.Equal(t, capBytes, prefilled.CapBytes()) + + assertPrefilled(t, fillUpX, prefilled) + }) + + t.Run(fmt.Sprintf("prefilled bitmap filled up 3x %d to %d, no resize", prefillX, fillUpX), func(t *testing.T) { + prefilled := Prefill(uint64(prefillX)) + lenBytes := prefilled.LenBytes() + capBytes := prefilled.CapBytes() + + prefilled.FillUp(uint64(fillUpX) - 20) + prefilled.FillUp(uint64(fillUpX) - 10) + prefilled.FillUp(uint64(fillUpX)) + require.Equal(t, lenBytes, prefilled.LenBytes()) + require.Equal(t, capBytes, prefilled.CapBytes()) + + assertPrefilled(t, fillUpX, prefilled) + }) + } + } + + for _, currentMaxX := range []int{ + 1023, 1024, 1025, 1039, 1040, 1041, + } { + for _, fillUpX := range []int{ + 1055, 1056, 1057, 1082, + } { + t.Run(fmt.Sprintf("single elem array filled 1x %d to %d, no resize", currentMaxX, fillUpX), func(t *testing.T) { + singleElem := NewBitmap() + singleElem.Set(uint64(currentMaxX)) + lenBytes := singleElem.LenBytes() + capBytes := singleElem.CapBytes() + + singleElem.FillUp(uint64(fillUpX)) + require.Equal(t, lenBytes, singleElem.LenBytes()) + require.Equal(t, capBytes, singleElem.CapBytes()) + + assertFilledUp(t, currentMaxX, fillUpX, singleElem) + }) + + t.Run(fmt.Sprintf("single elem array filled 3x %d to %d, no resize", currentMaxX, fillUpX), func(t *testing.T) { + singleElem := NewBitmap() + singleElem.Set(uint64(currentMaxX)) + lenBytes := singleElem.LenBytes() + capBytes := singleElem.CapBytes() + + singleElem.FillUp(uint64(fillUpX) - 10) + singleElem.FillUp(uint64(fillUpX) - 5) + singleElem.FillUp(uint64(fillUpX)) + require.Equal(t, lenBytes, singleElem.LenBytes()) + require.Equal(t, capBytes, singleElem.CapBytes()) + + assertFilledUp(t, currentMaxX, fillUpX, singleElem) + }) + } + } + + for _, currentMaxX := range []int{ + 1023, 1024, 1025, 1039, 1040, 1041, + } { + for _, fillUpX := range []int{ + 4095, 4096, 4097, maxCardinality - 1, + } { + t.Run(fmt.Sprintf("single elem array filled 1x %d to %d, convert to bitmap", currentMaxX, fillUpX), func(t *testing.T) { + singleElem := NewBitmap() + singleElem.Set(uint64(currentMaxX)) + singleElem.expandNoLengthChange(maxContainerSize) + lenBytes := singleElem.LenBytes() + capBytes := singleElem.CapBytes() + + singleElem.FillUp(uint64(fillUpX)) + require.Less(t, lenBytes, singleElem.LenBytes()) + require.Equal(t, capBytes, singleElem.CapBytes()) + + assertFilledUp(t, currentMaxX, fillUpX, singleElem) + }) + + t.Run(fmt.Sprintf("single elem array filled 3x %d to %d, convert to bitmap", currentMaxX, fillUpX), func(t *testing.T) { + singleElem := NewBitmap() + singleElem.Set(uint64(currentMaxX)) + singleElem.expandNoLengthChange(maxContainerSize) + lenBytes := singleElem.LenBytes() + capBytes := singleElem.CapBytes() + + singleElem.FillUp(uint64(fillUpX) - 3040) + singleElem.FillUp(uint64(fillUpX) - 1000) + singleElem.FillUp(uint64(fillUpX)) + require.Less(t, lenBytes, singleElem.LenBytes()) + require.Equal(t, capBytes, singleElem.CapBytes()) + + assertFilledUp(t, currentMaxX, fillUpX, singleElem) + }) + } + } + }) t.Run("current max value in different container than given maxX", func(t *testing.T) { for _, prefillX := range []int{